千万级学生管理系统考卷模块存储架构设计
1. 业务背景
学生管理系统服务多个学校,学生规模千万级。考试前,所有学生会从管理系统下载考试试卷。学生管理系统需要支持大量学生同时下载考卷,而服务不中断。考试结束前,学生会集中提交考卷,
新系统要求:
支持 1000 万级别的学生数
学生同时下载各级试卷而服务不中断,试卷数据不可丢失
试卷保密,考试开始前只有出题教师可用看到考卷;考试过程中,试卷对学生公开可见;考试结束后,试卷重新对学生关闭保密。
考试结束前,学生提交答卷,学生可重提交,但只有最后一次提交的答卷有效。考试结束后,学生不可再访问已提交的答卷。
系统保存每个学生的考试答卷,只有改卷老师可调阅考卷和批改学生答卷。
本文档只针对存储架构进行设计。对以上业务需求部分,由其他设计文档进行设计。
以下系统整体黑盒图显示系统与用户和数据库交互关系。
2. 约束和限制
考试结果保留 3 年
3. 总体储存架构
3.1 分析评估
假设以下数据
在校 4 年 1000 万学生,每年新增 250 万学生
一学年 2 个学期
每个学生一学期平均 20 门课程
每门学科每年 2 次考试
每门考试 20 道判断题、20 道选择题、4 道大题(答案 200 字以内)- 所有答案存储空间估算为:4 x 200 + 20 + 20 = 840 字,估算 1000 字
考试答案保存 3 年
估算保存在校学生试卷答卷所需要的存储空间
1000 万 x 2(学期)x 20(门课)x 2(次考试)x 1000 字 x 3(年)= 2.4 T
估算保存试卷所需要存储空间(保存 3 年,试卷数据 2M)
4(年)x 2(学期)x 20(门课)x 2(次考试)x 2M = 640M
估算试卷下载峰值(假设考试安排在一个月内,4 个年级的学生在不同一时间考试,所有考试学生在考前一分钟下载试卷)
1000(万)/ 4 年级 / 1(分钟)= 41k 请求/s 约为 5 万 QPS
估算学生答卷上载峰值(所有学生在考试结束前半小时交卷)
1000(万)/ 4 年级 / 30(分钟)= 1.388k 请求/s 估算为 2000 TPS
3.1.1 高性能
理论上,一台 Redis 足够支撑试卷下载需求(下载:5 万 QPS,试卷数据:约 640M)
5-10 万 QPS
使用中等规模的 Redis 服务器(Medium Cache Node (cache.m1.medium): 3.35 GB memory),可支持试卷数据。
实际上,我们使用 Redis Sentinel 集群(3 台 Redis 服务器组成比较可靠的集群),主机可写可读,从机只可读,读性能的理论上限可达到 12~15 万 QPS,完全可以满足需求。
学生答卷上载峰值是 2000 TPS,可以直接上传到 HBase 数据库。HBase 集群使用分片架构,各主机可读写,完全可以满足上传峰值需求。
用 MySQL 数据库存储考试成绩,由于访问量不大,一台主机就可以满足读写需求。
可以设立南北两个分区,就近支持南北地区学校访问。
3.1.2 高可用
考试试卷和学生答卷使用 HBase 数据库集群存储。因为考试试卷之间,学生答卷之间,没有太大关系逻辑,而且试卷和答卷都可看做大数据,适合使用 HBase 数据库存储。
试卷同时使用 Redis Sentinel 主从架构缓存。Sentinel 可以自动切换主机,保证试卷数据下载可用性。
学生成绩数据使用 SQL 数据库集群,方便老师统计学生成绩。使用主备架构,把成绩保存到备机,防止成绩数据丢失。
使用互备式分区架构,在南北两个分区分别设立备机。由于学校数目固定,学生规模也不会有很大扩展,备机分区改变的可能性比较小,可以使用互备式架构,也降低成本。
3.1.3 可扩展
数据库集群可方便扩展。
3.1.4 成本
数据库集群可根据需求增加和减少数据库数量,便于控制成本。
3.2 数据存储设计
3.2.1 试卷数据存储设计
试卷数据存储在 Hbase 中,Row Key 包括年级、科目、和其他信息(例如 A、B 卷),Row Content 包括试卷内容。
把从 HBase 读取的试卷存到 Redis,key 包括年级、科目、和其他信息(例如 A、B 卷),可直接使用 HBase 的 key,也可以 HBase 的 key 的以哈希值做 Redis 的 key。Value 是 String data type,存储试卷内容。
3.2.2 学生答卷存储设计
直接把学生试卷答案上传到 HBase 存储,无需经过 Redis。学生答卷的 Row Key 包括学生学号 ID,Row Content 包括学生答卷内容。
3.2.3 学生成绩存储设计
成绩存储在 MySQL 数据库,方便统计分析。
4. 详细设计
4.1. 核心功能
4.1.1 下载试卷
考试试卷模块先去 Redis 读取试卷,如果读取成功,直接返回给用户;如果读取失败,去 HBase 读取试卷,并返回给用户,并且把试卷写到 Redis。下次再读取时,直接从 Redis 读出。
4.1.2 上传学生答卷
学生上传答卷时,系统模块可以直接写入 HBase 数据库。
4.1.3 批改答卷
老师从 HBase 数据库读取学生试卷,批改,并输入考试成绩到 MySQL 数据库。
4.1.4 调阅考试成绩
考试成绩存储在 MySQL 数据库,可以直接读出。
4.2 关键设计
无
4.3 设计规范
考试试卷和学生答卷使用 JSON 格式存储
5. 质量设计
5.1 成本
Redis 开源,可以自建 Redis Sentinel 集群,也可购买云服务商的 Redis 服务。
HBase 也是开源软件,可以自建,也可以购买云服务商的 HBase 服务。
5.2 测试、维护、观测
使用 MySQL、Redis 和 HBase 相关的模块进行测试、运维和观测
6. 演进规划
学生规模不会增加太多,存储设计无需过多演进
版权声明: 本文为 InfoQ 作者【泋清】的原创文章。
原文链接:【http://xie.infoq.cn/article/f2f86df8ba817599c927b1f76】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论