架构训练营第 1 期 模块四作业
设计千万级学生管理系统的考试试卷存储方案
【作业要求】
基于模块 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 序列化储存试卷内容。
读写分析
老师上传试卷。JSON 序列化试卷内容,若有图片则上传图片至 CDN 并加 URL 加入 JSON 中。考试 ID 由系统根据学校、课程、学期、A/B 卷等信息得出并另存于关系型数据库。最后向 Redis 发起 SET 请求。
学生请求试卷。根据学校 ID 和试卷 ID 得出 key 并向 Redis 发起 GET 请求。
使用 Redis Sentinel 来实现主从读写分离,提高读取性能,并实现故障时自动主从切换。
主从之间的复制延迟可以忽略不计,因为上传试卷到试卷被读取之间通常有几天时间。
性能估算
用户行为建模
假设每个学生一学期 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)
版权声明: 本文为 InfoQ 作者【高远】的原创文章。
原文链接:【http://xie.infoq.cn/article/ed21cefd2bd376ea09b15017d】。未经作者许可,禁止转载。
评论