千万级学生系统考试试卷存储架构设计
一、考试模块存储性能需求
考试模块性能需求
在校学生考试结果存储:2.4T;
离校学生考试结果存储:每年增长 0.6T;
试卷请求 QPS:5 万/s;
提交试卷 TPS:1700/s。
二、考试试卷存储方案
考虑到试卷请求的 QPS 达到 5W/S,提交试卷 TPS 微 1700/S,使用 redis 来进行试卷的存储。
2.1 数据结构设计
使用 redis 的有序集合 zset 来存储试卷。该数据结构的特点:去重和排序。
key 的构成:学校 id-院系 id-专业 id-课程 id-学期(如 2021 秋季学期为 202101,春季学期 202100)
score:题目的顺序编号
member:题目,对于其中的小题用 zset 嵌套。在题目中需要关联题库中的题目 id
2.2 试卷操作分析
2.2.1 构建试卷操作
添加试题:根据老师关联的学校 id-院系 id-专业 id-课程 id-学期 作为试卷的 key,向试卷集合中添加实体;
删除试题:根据 key 和指定题号删除试题;
修改试题:根据 key 和指定题号读取试题修改后再进行保存。
2.2.2 读取试卷操作
读取试卷:根据 key 读取对应的试卷并返回;
三、redis 集群服务器数量
由于单张试卷的数据量较大,单个 key 取回的记录预计为 100K,QPS 为 5W/S,请求的数据量为 5G/S;
在校生 1000 万对应的试卷数量为 300W(平均每 30 人共享一门课程的试卷,没人平均有 10 门考试),预估数据量 50G。
对于 redis 来说,单机的 QPS 可以达到 5W/S,结合数据量,sentinal 集群 3 台、主机 1 台、从机 5 台。sentinal 集群的机器配置为 8C16G,主机和从机都是 32C64G 的配置。
评论