千万级学生管理系统的考试试卷存储方案
前言
本架构设计方案适用于管理系统考试存储方案设计文档,用于指导千万级管理系统的考试试卷的存储方案。
1. 业务背景
本系统主要是应用于考试试卷存储方案的设计,用于支撑千万级学生管理系统考试试卷的存储。假设每门学科每学期 2 次考试,每个学生平均每个学期 20 门课程,则考试存储量预估记录如下为:
在校学生:1000 万 * 20(课)* 2(考试次数) * 2000(试卷 + 答案解析)* 2(学期) * 3(只有前三年考试)= 4.8T。
离校学生每年记录为: 0.5T
学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时
且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:
请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/s。
提交试卷: 1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 30 分钟 = 1700/秒。
2. 约束和限制
1. 在校学生考试结果存储:2.4T;
2. 离校学生考试结果存储:每年增长 0.6T;
3. 试卷请求 QPS:5 万/s;
4. 提交试卷 TPS:1700/s
3. 总体架构
3.1 架构分析
学生考试结果数据需要永久存档,数据会持续增长,需要分片存储,并且由于针对考试成绩的大量查询只在于改卷结束后,历史的查询会逐步递减,因此需要处理冷热分离存储。
试卷 QPS 请求高达 5w/s, 需要对试卷内容进行缓存,需要评估大概的缓存容量:3000 大学,每个大学开设 50 个专业,一次考试生成 3000 * 50 = 15w 套试卷,按 5 天的考试量计算, 这些每次同时考试的量在 3w 左右。 每套试卷大约 1M, 在同一天考试最高存储量为:30Gb。 可配置一台 32Gb redis 服务专用于试卷缓存的存储,可以加分片存储。
3.2 总体架构
试卷存储访问,读取 qps 比较大,且需要高可用,因此采用 redis 缓存。单台服务器可缓存所有试卷内容,且单台服务器可以抗住 5W 的 QPS,因此不用考虑数据分片,但是考试时读取试卷不能出现故障,需要保证高可用,因此引入 Redis sentinel 部署模式,采用 3 台服务器,1 主 2 从,每台机器同时部署哨兵进程和 Redis 服务进程。
课程考试结果:主要记录课程的考试结果,用于基本信息查询,而且数据存储初期结果采用 redis 缓存, 后期采用 mysql 永久存储。
4. 详细设计
4.1 核心功能
考试试卷缓存设计: 以 学校编号+课程编号+年级编号 作为缓存 key, 把考试内容以 json 的方式存储在缓存中
考试结果存储设计:以学校编号+ 年级编号+ 考试编号作为缓存 key ,考试分数作为结果存储中。 数据表 mysql 按照学校代号作为库名划分,数据表字段名: 主键 id、课程 ID、学生学号、考试成绩结果
评论