写点什么

千万级学生管理系统考卷模块存储架构设计

作者:泋清
  • 2022 年 6 月 19 日
  • 本文字数:1945 字

    阅读完需:约 6 分钟

1. 业务背景

学生管理系统服务多个学校,学生规模千万级。考试前,所有学生会从管理系统下载考试试卷。学生管理系统需要支持大量学生同时下载考卷,而服务不中断。考试结束前,学生会集中提交考卷,


新系统要求

  1. 支持 1000 万级别的学生数

  2. 学生同时下载各级试卷而服务不中断,试卷数据不可丢失

  3. 试卷保密,考试开始前只有出题教师可用看到考卷;考试过程中,试卷对学生公开可见;考试结束后,试卷重新对学生关闭保密。

  4. 考试结束前,学生提交答卷,学生可重提交,但只有最后一次提交的答卷有效。考试结束后,学生不可再访问已提交的答卷。

  5. 系统保存每个学生的考试答卷,只有改卷老师可调阅考卷和批改学生答卷。


本文档只针对存储架构进行设计。对以上业务需求部分,由其他设计文档进行设计。


以下系统整体黑盒图显示系统与用户和数据库交互关系。

2. 约束和限制

考试结果保留 3 年

3. 总体储存架构

3.1 分析评估

假设以下数据

  1. 在校 4 年 1000 万学生,每年新增 250 万学生

  2. 一学年 2 个学期

  3. 每个学生一学期平均 20 门课程

  4. 每门学科每年 2 次考试

  5. 每门考试 20 道判断题、20 道选择题、4 道大题(答案 200 字以内)- 所有答案存储空间估算为:4 x 200 + 20 + 20 = 840 字,估算 1000 字

  6. 考试答案保存 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

  1. 5-10 万 QPS

  2. 使用中等规模的 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 高可用

  1. 考试试卷和学生答卷使用 HBase 数据库集群存储。因为考试试卷之间,学生答卷之间,没有太大关系逻辑,而且试卷和答卷都可看做大数据,适合使用 HBase 数据库存储。

  2. 试卷同时使用 Redis Sentinel 主从架构缓存。Sentinel 可以自动切换主机,保证试卷数据下载可用性。

  3. 学生成绩数据使用 SQL 数据库集群,方便老师统计学生成绩。使用主备架构,把成绩保存到备机,防止成绩数据丢失。

  4. 使用互备式分区架构,在南北两个分区分别设立备机。由于学校数目固定,学生规模也不会有很大扩展,备机分区改变的可能性比较小,可以使用互备式架构,也降低成本。

3.1.3 可扩展

数据库集群可方便扩展。

3.1.4 成本

数据库集群可根据需求增加和减少数据库数量,便于控制成本。

3.2 数据存储设计

3.2.1 试卷数据存储设计

  1. 试卷数据存储在 Hbase 中,Row Key 包括年级、科目、和其他信息(例如 A、B 卷),Row Content 包括试卷内容。

  2. 把从 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. 演进规划

学生规模不会增加太多,存储设计无需过多演进


发布于: 刚刚阅读数: 6
用户头像

泋清

关注

还未添加个人签名 2019.03.24 加入

还未添加个人简介

评论

发布
暂无评论
千万级学生管理系统考卷模块存储架构设计_#架构训练营_泋清_InfoQ写作社区