千万级学生管理系统的试卷存储方案
前言
本文是千万级学生管理系统的试卷存储方案,用于指导试卷存储模块的技术实现。
1. 业务背景
为了支持千万级学生的在线考试,需要设计试卷存储访问方案。
2. 约束和限制
1000w名学生,每学期考2次,每次考试集中在一个月,每次考试有20门。
该方案涵盖试卷的上传,下载,归档等业务场景。
该方案不涉及学生答卷的存储。
3. 性能和存储容量估算
3.1 用户行为建模和性能估算
用户 | 行为 | 性能 |
---|---|---|
学生 | 下载试卷,集中在开始开始时一分钟 | 1000w*20(课)/20(周末不考试)/4(每天4堂考试)/1分钟=5万/s |
学生 | 提交答卷,集中在考试结束前30分钟 | 5万/30=1700/s |
老师 | 上传试卷,三天内完成 | 20(课)/8(每天8小时)/3=1次/小时 |
复杂度体现在学生下载试卷的场景,可以选用Redis主从部署来满足QPS高TPS一般的场景。选用Redis Sentinel集群来实现主从自动切换,从而提高可用性。
3.2 存储容量估算
试卷存储:20(课)*2(每学期2次)2(每年2学期)4(一共四学年)1M(每张答卷大小,包含图片)=16021M=320M。
历史试卷存储:320M10年=3200M=3.2G。
Redis是内存数据库,一台32G内存的服务器可以支撑Redis 3.6G的存储容量。
4. 存储系统选型
3台32G内存的物理服务器或虚拟机。
Redis主从部署(一主两从) + Sentinel集群。Sentinel 3个实例分别部署到三台机器上。
5. 存储方案设计
5.1 数据结构分析
Key: 学校ID+考试ID+课程ID
Value: string类型,存放json格式的字符串
5.2 读写分析
学生登录后,选择考试ID(2022年期末考试)和课程ID(数学考试),点击开始考试。根据键值直接请求主库或从库下载试卷。
老师登录后,输入考试ID和课程ID,上传试卷。向主库发起写请求,将键值对写入Redis.
当主库发生故障时,从库可以继续处理用户的读请求。
当主库发生故障时,Sentinel集群自动选主,写请求恢复正常。在选主过程中,发生写操作的概率极低,这里可以忽略。