千万级学生管理系统的考试试卷存储方案设计
基于性能估算
以下数据是第六讲中拷贝过来
学生数量:1000w
用户行为:考试
几个关键数据:如图
【考试】
1. 在校学生考试结果存储:2.4T;
2. 离校学生考试结果存储:每年增长 0.6T;
3. 试卷请求 QPS:5 万/s;
4. 提交试卷 TPS:1700/s。
试卷存储评估:
每个学生平均 1 学期 20 门课,1 门课 1 年 2 次考试,一个学生 1 年 20*2 =40 次考试(40 份试卷)
平均每道题题干 100 汉字
每份试卷按 20 判断题、20 选择题、4 道大题(答案 200 字以内),每份试卷的存储字节 20*100*2 + 20*100*2*4 + 4 * 100*2 = 20800 字节= 20.8kb ,每年考试存储下来,40*20.8kb = 1MB
注意这只是试卷的数据量,学生的考试数据是存在 HBase 中的
考试存储架构图
1.所有考试的同学的,读的试卷是一样的,所以试卷用 Redis sentinel 存储
2.老师要基于考试结果进行分析:不同分数之间的学习数量;为有些题目大部分同学打错了等场景。基于这些分析场景,用 MySQL 分库分表比较合适
3.学生只需要查看自己的考试结果,老师分析考试结果,只要分析当年的考试结果,学习要保留多年
总体的学生管理系统存储架构图
选择存储系统
单机是否能存储所有数据:是
单机是否能够支撑写性能:是
单机是否能够支撑读性能:是
是否需要自动切换:需要,考试过程中不能出现问题
方案结果:集群选举方案
数据结构设计:
key:学校 ID+课程 ID+学期(一年 2 学期)+考试类型(期中,期末,或者月考等等)
value:选择 Sorted Set 数据结构,因为某一个试卷,不会存在题目一样的情况,所以需要做一下去重的操作,每一份试卷的顺序都是一样的,需要有顺序
具体业务操作:
新增,删除,修改操作会在试卷发布前完成
读写分析:
1.老师(管理员)维护试卷,根据学校 ID+课程 ID+学期 生成 key,根据题目顺序,维护好试卷内容
2.修改和删除,直接根据 key 读取,进行覆盖和删除
3.考生读取试卷,先通过学生 id,根据当前时间计算出考试类型(期中,期末,或者月考等等),在通过学习 ID+课程 ID+学期(一年 2 学期)+考试类型(期中,期末,或者月考等等)去读取试卷内容
服务器数量和性能分析:
根据之前的课程,一台 32 核的服务器,单机 TPS 是 5-10W,能够符合性能要求,因为是集群选举方案
至少需要 3 台,32 核的服务器的服务器,因为考虑到 redis 还可以存其他的一些数据,内存 32G 足矣,硬盘评估没有依据,没有要求,但是不要太小
评论