重学架构之千万级学生管理系统的考试试卷存储方案
前言
文本是学生管理系统考试试卷存储方案,用于指导考试试卷存储方案的开发与落地。
1 业务背景
每门学科每年 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试的答案 20 判断题、20 选择题、4 道大题(答案 200 字以内),在校学生能够看到自己曾经的考试结果,考试结果永久保存。
2 约束与限制
考试试卷永久保存
本期不考虑试卷中有图片的情况
3 用户行为建模和性能估算
假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,
且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,
因此请求试卷估算如下:
1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒。
试卷存储空间估算:
查询以我毕业高校本科生专业目录,96 个专业,每个专业的学生平均 20 门课程,
假设判断题平均 50 个汉字,选择题平均 150 个汉字,大题 100 个汉字,统一采用 UTF8 编码,每张试卷的大小:(20 * 50 + 20 * 150 + 4 * 100)* 3 = 13200 Byte
1)每年试卷存储
96(专业) * 20(课)* 2(次)* 13200 = 50688000 ~= 48 MB
假设平均每所高校 3 万人,可接入 1000 / 3 ~= 300 所高校,
总存储空间:300 * 48 MB ~= 15 GB
同专业不同学科之间有部分课程是相同的,估算每年试卷存储 15 * 80 % = 12 GB
2)每天试卷存储估算
一年考试两次,一学期为 6GB,考试时间为 20 天,平均每天 300MB
请求试卷的带宽总占用
50000 QPS * 13200 * 8 = 4.9 Gb
4 存储系统选择
1) 当前考试数据存储
考试需要支持高并发量,支持 5w QPS,redis 单机可支持,存储数据量 redis 单机可支持,考试期间需要保证服务高可用,需要故障自动切换功能;因此选用 redis sentinel 存储方案
2) 考试全量数据存储
全量数据每年新增 12GB,考虑到业务增长,系统长时间运行全量数据会很大,单机无法支持,因此需要采用分片架构。
试卷内容与考试信息、考试成绩、学生信息等关联不大,可以不用关系型数据库,可以用 HBase 存储全量数据。
5 存储方案设计
1) 当前考试试卷
不同的学校分在不同的 DB 中,db 为学校 ID;
考虑到试卷创建后,不会被修改,直接使用 list 存储;
key:课程 ID
value:[[题目类型, 内容], ...]
题目类型:1 判断题,2 选择题, 3 大题
内容为 json 格式,{"stem": "题目内容", "options":[items...]}
读写分析
开始考试前,系统在全量试卷信息中查询考试试题,将考试试卷数据以 list 的方式,写入到 redis sentinel 集群中,设定过期时间为两小时;
开始考试后,在学校 ID 的 db 中,以课程 ID 为 key 读取试卷试题。
2)全量试卷数据
不同的学校数据分布在不同的 table,表名为学校 ID;
row key:课程 ID + 学期(YYYY_X,如 2022_1,表示 2022 年第一学期)
column family: exam
column:type 题目类型,stem 内容, options_num 选项数量,options_n 选项内容
读写分析
老师录入考试题并提交,在学校 ID 的 table 中以 row key 写入考试内容,考试基本信息写入数据库中;
查询考试试题,或开始考试加载考试试题时,在学校 ID 的 table 中以 row key 读取考试内容。
6 Redis sentinel 集群服务器数量和性能
sentinel 机器 3 台,1 核,1G 内存
由于 redis 单进程模型,考虑到操作系统其它进程,使用 2 台作为数据节点,一主一从,2 核 2G 内存
评论