千万级学生管理系统 Redis 存储架构
前言
本文是针对千万级学生管理系统的考试模块的存储架构的详细架构设计文档,用于对学生管理系统的考试模块的架构选型、架构性能评估;指导后续的开发、测试、运维。
词汇表
Redis Sentinel:一种 Redis 的高可用架构
1. 业务背景
【考试】
假设每门学科每年 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试的答案 20 判断题、20 选择题、4 道大题(答案 200 字以 内),考试结果永久保存,在校学生能够看到自己曾经的考试结果,则考试结果记录的存储量为:
l 在校学生:1000 万 * 20(课)* 2(考试次数) * 1000(答案)* 2(学期) * 3(只有前三年考试)= 2.4T。
l 离校学生:每年 250 万,存储量为 0.6T。
假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时, 且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:
l 请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒。
l 提交试卷: 1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 30 分钟 = 1700/每秒。
汇总数据如下:
1. 在校学生考试结果存储:2.4T;
2. 离校学生考试结果存储:每年增长 0.6T;
3. 试卷请求 QPS:5 万/s;
4. 提交试卷 TPS:1700/s。
2. 约束和限制
1. 基于前期的调研,Redis 高可用架构只能选择 Redis Sentinel
3. 总体架构
3.1 架构分析
3.1.1 高可用
对于考试的试卷,如果在考试的时候无法实时获取试卷,则在考试的开始会导致考试结束时间无法控制,同时会引起学生的恐慌。因此对于考试的试卷读取功能必须保证高可用性。
3.1.1 高性能
从上述分析来看,读取试卷性能要求至少达到 TPS 大于 5 万/秒
3.2 总体架构
假设主服务器宕机,哨兵 1 先检测到这个结果,系统并不会马上进行 failover 过程,仅仅是哨兵 1 主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行 failover 操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。
4. 详细设计
1. 采用 Redis Sentinel 架构模式;
2. 选用三台 Sentinel,Sentinel 需要选主,至少三台防止脑裂
3. 选择一台 Master,一台 Slave,当 Master 宕机后,由 Master 接管业务数据的读写。
4.1 核心功能
4.1.1 数据结构设计
考试包含试卷的获取、考试的提交、考试考核三种动作,这三种动作分别对应三种数据,试卷内容(试题)、考试答案、考试评分结果。
1. 试卷内容数据结构:采用 ZSet,因为试题是有序的,同一个年级同一个学院使用的试卷是一致的。
key:examination:paper:试卷 ID(不同年级、不同学院、不同专业试卷不同)
value:json 对象,包含试题类型、试题、试题备选答案等,具体数据结构见本文“设计规范”中的“试题数据结构”
2. 考试答案数据结构:采用 Hash Map 存储,因为此数据除了关联试卷外还需要关联学生账号
key:examination:answers:试卷 ID
filed:学生学号
value:json 对象,包含答题 ID、试题类型、试题、试题备选答案、学生选择答案等,具体数据结构见本文“设计规范”中的“考试结果数据结构”
3. 考试评分结果数据结构:采用 Hash Map 存储,因为对学生考试打分进行排序;
key:examination:score:试卷 ID
filed:学生学号
value:分数
4.1.2 数据读写流程
1. 学校统一按年级、学院、学科将考试试卷存储在“试卷内容数据结构”中;
2. 待考试开始后,学生从考试题库中读取指定试卷;
3. 考试答题后,提交答案,将内容存储在“考试答案数据结构”;
4. 老师收到试卷,读取“考试答案数据结构”内容,开始评分,将评分结果存储在“考试评分结果数据结构”;
4.2 关键设计
1)数据存储架构的可靠性:采用 Redis Sentinel 架构,哨兵模式是一种特殊的模式,首先 Redis 提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待 Redis 服务器响应,从而监控运行的多个 Redis 实例。
这里的哨兵有两个作用
通过发送命令,让 Redis 服务器返回监控其运行状态,包括主服务器和从服务器。
当哨兵监测到 master 宕机,会自动将 slave 切换成 master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
4.3 设计规范
试题数据结构
TestPaPaperContent
MultipleChoice
SingleChoice
TrueFalseQuestions
FillInTheBlanksTest
QuestionsAndAnswers
考试结果数据结构
版权声明: 本文为 InfoQ 作者【IT屠狗辈】的原创文章。
原文链接:【http://xie.infoq.cn/article/2b316c49a1522a7a1c08d09c5】。文章转载请联系作者。
评论