模块四作业
前言
本文是千万级学生管理系统的考试试卷存储的设计方案,用于指导学生管理系统中考试子系统的后续开发、测试和运维。
1. 业务背景
考试子系统作为学生管理系统中的核心组成部分,为提高学生考试管理的管理水平,优化资源,尽可能降低考试管理成本,从实际出发帮助学生管理人员有效管理学生考试信息。
2. 性能估算
2.1 性能预估
每个学生平均一学期 20 门课,考试采取机考的方式。
每门考试的答案 20 判断题、20 选择题、4 道大题,假设判断题、选择题、大题占用字数分别为 100 字内、200 字内、200 字内。则共计字数:20*100+20*200+4*200=6800 字。
采用 UTF-8 编码格式,每个中文字符占 3 个字节,每门考试占用字节数:6800*3=20400 字节,即 19.9KB,按照 20KB 计算。
假设每门考试 30 人参加,则试卷总存储量为:1000 万*20 课/30 人*20KB=127GB,按照 150GB 计算。
2.2 估算结果
假设学校的考试都安排在某一个月内,并且提前 3 天放到存储,除去周末,即考试在 20 天内完成,则每 3 天试卷的存储量为:150GB*3 天/20 天=22.5GB。
请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒。
提交试卷: 1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 30 分钟 = 1700/每秒。
3. 存储系统选择
为了应对 5 万的 QPS,Redis 单机的 QPS 理论上在 5 万到 10 万,但从实际出发,采用 Redis Sentinel,一主两从。
每 3 天试卷存储量 22.5GB,单机可以支撑。
4. 存储方案设计
4.1 整体设计
Redis Sentinel 作为试卷存储和访问。
MySQL 集群 存储老师课程考试结果,学生基本信息。
HBase 集群 存储学生考试结果、登录记录、图片信息。
4.2 Redis 数据结构设计
Key: 学校 ID + 专业 ID + 考试 ID
Value: 题目 ID + 题目内容,采用 JSON 格式
试卷初始存储位置为 MySQL,考试前 3 天加载到 Redis
4.3 试卷的读写流程设计
老师提前 3 天将试卷从 MySQL 添加到 Redis 缓存。
学生考试时从 Redis 中读取试卷。
学生考试结束提交试卷时存入 HBase 数据库。
老师从 HBase 数据库获取试卷进行批改,并将修改结果存入 HBase 中。
批改后的试卷将推送一份至 RockMQ 消息队列,最终存入 MySQL 数据库。
老师从 MySQL 中请求试卷进行分析。
4.4 服务器配置
采用 3 台服务器,每台 4 核、64GB 内存。
采用一主两从,单台 QPS 为 2 万,总计 6 万,满足请求试卷时的高峰读请求 5 万 QPS。
评论