模块四作业:千万级学生管理系统的考试试卷存储方案
【作业要求】基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:• 完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构。• 设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)。• 对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能。
【考试】假设每门学科每年 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试的答案 20 判断题、20 选择题、4 道大题(答案 200 字以内),考试结果永久保存,在校学生能够看到自己曾经的考试结果,则考试结果记录的存储量为:• 在校学生:1000 万* 20(课)* 2(考试次数) * 1000(答案)* 2(学期) * 3(只有前三年考试)= 2.4T。• 离校学生:每年 250 万,存储量为 0.6T。假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:• 请求试卷:1000 万* 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟= 250 万请求/分钟≈ 5 万/每秒。• 提交试卷: 1000 万* 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 30 分钟= 1700/每秒。
数据结构设计
试卷存储(S1)
使用 String
key:前缀(E)+课程编码+试卷编码 (e.g. T_A10_E11)
value:试卷内容(json 串,包含: 标题、说明、注意事项、第几次考试、内容编码、创建人、创建时间)
试卷内容存储(S2)
使用 Hash
key: 前缀(E)+课程编码 (e.g. T_A10)
hashkey:内容编码
hahvalue:题目序号、题目类型、题干、选项、分值、参考答案
题库(S3)
使用 Hash
key: 前缀(T)+课程编码 (e.g. T_A10)
hashkey:题目类型
hahvalue:题目序号、题目类型、题干、选项、分值、参考答案
考试结果存储(S4)
使用 Hash
key: 课程编码+考试编码+班级编码
hashkey:学号
hahvalue:[总得分、考试结果{题目序号、答案、得分、状态、保存时间、更新时间、操作人}、评卷人、评卷时间、提交人、提交时间}]
读写流程
教务处根据课程,负责从题库(S3)组合试卷,可得到试卷存储(S1)、试卷内容存储(S2);
学生考试系统,根据登录学生的学号,考试的课程编码,得到所在班级、考试课程从 S1、S2 得到试卷内容进行展示;
学生在线答卷提交后,根据课程编码、班级编码、学号、得到考试结果存储(S4);
老师在线批卷,根据课程编码、班级编码、 S1、S2、S4 得到学生答题卷面,并根据提示进行判分,更新 S4。
估算集群服务器数量及性能
分析:设每个试卷 100K 大小,试卷存储量为: 240*0.1M= 24M;试卷存储量 24M 忽略不计,主要考虑试卷结果存储量 .
学校考试都安排在一个月内,则每个月考试结果存储空间为:
1000 万* 20(课)* 2(考试次数) * 1M(答案)= 400GB。
每天提交数据为:400GB/30=13.4GB
第周提交数据为:13.4*=93.8GB
存储角度: 一天的数据提交大概为 13.4Gb,一周大概 94GB,可以用一个 Redis Sentinel 集群存储。一周后的结果 dump 到 Mysql。
性能角度: 50k QPS, 单机 30K QPS 比较正常,使用 3 实例 (32 核*128GB)的 Redis Sentinel 。
版权声明: 本文为 InfoQ 作者【dean】的原创文章。
原文链接:【http://xie.infoq.cn/article/5d59b67151b2c820ce9da225f】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论