写点什么

架构训练营第 1 期 模块四作业

用户头像
高远
关注
发布于: 5 小时前

设计千万级学生管理系统的考试试卷存储方案

【作业要求】

基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:

• 完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构。

• 设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)。

• 对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能。

【提示】

1. 性能可以有一定冗余。

2. 如果对 Redis sentinel 不熟悉,请参考官方文档:https://redis.io/topic/sentinel。


考试试卷存储方案设计

数据结构设计

Key:exams:<学校 ID>:<考试 ID>

Value:String 类型。使用 JSON 序列化储存试卷内容。

读写分析

  1. 老师上传试卷。JSON 序列化试卷内容,若有图片则上传图片至 CDN 并加 URL 加入 JSON 中。考试 ID 由系统根据学校、课程、学期、A/B 卷等信息得出并另存于关系型数据库。最后向 Redis 发起 SET 请求。

  2. 学生请求试卷。根据学校 ID 和试卷 ID 得出 key 并向 Redis 发起 GET 请求。

  3. 使用 Redis Sentinel 来实现主从读写分离,提高读取性能,并实现故障时自动主从切换。

  4. 主从之间的复制延迟可以忽略不计,因为上传试卷到试卷被读取之间通常有几天时间。

性能估算

用户行为建模

  • 假设每个学生一学期 20 门课,学校的考试都安排在某一个月内,考试的时候请求试卷,答题过程浏览器本地完成,考试集中在上午 4 小时和下午 4 小时,每场考试 2 小时,请求试卷集中在考试开始前的一分钟内,则:

  • 请求试卷: 1000 万 x 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒 (QPS)

  • 假设每一门课有 200 个学生参加,老师在考试开始前的一周内上传试卷,则:

  • 上传试卷:1000 万 x 20(课) / 200 / 5(周末不加班) / 8(一天 8 小时工作制度) / 60 = 420 请求/分钟 ≈ 7/秒 (TPS)

  • 假设每门课的试卷有 50 道题,每一题的题干加选项为 200 汉字外加图片(约 1000 字节,UTF-8 一个汉字 3 个字节,外加图片的 url 信息以及 JSON 序列化的 overhead,再外加 key 的长度)

  • 试卷存储:1000 万 x 20(课) / 200 x 50 x 1000 = 50GB

需求汇总

  • 读取性能 50K QPS

  • 储存 100 万条 key,共 50GB 数据

  • 按照两倍冗余设计,则

  • 100K QPS

  • 100GB 数据

Redis sentinel 集群的服务器配置

  • 100G 数据可以放入单机内存内,使用 128G 内存的单机即可

  • Redis 单机 QPS 为 50K,3 台 Redis 单机组成的 Sentinel 集群即可满足 QPS 的需求并达到一台宕机时另外两台也能顶住流量的需求

  • 3 台 Redis 单机各自亦运行 Sentinel 进程,节省机器数量并同时达到不错的高可用性

  • 配置如下(M = Master, S = Sentinel, R = Replica)

       +----+       | M1 |       | S1 |       +----+          |+----+    |    +----+| R2 |----+----| R3 || S2 |         | S3 |+----+         +----+
复制代码


发布于: 5 小时前阅读数: 4
用户头像

高远

关注

还未添加个人签名 2017.11.24 加入

还未添加个人简介

评论

发布
暂无评论
架构训练营第 1 期 模块四作业