千万级学生管理系统的考试试卷存储方案
前言
本文是千万级学生管理系统的考试试卷存储方案设计文档,用于指导万级学生管理系统的考试试卷存储的开发、测试和运维。
1. 业务背景
本系统确定有 1000 万的用户,对 QPS 和存储有较高的需求,所以有以下问题:
l 性能问题: 假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:
请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒。
提交试卷: 1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 30 分钟 = 1700/每秒。
其中请求试卷时 QPS 可以达到 5 万/每秒。这对性能有较高的要求。
2. 约束和限制
1. 在校学生考试结果存储:2.4T;
2. 离校学生考试结果存储:每年增长 0.6T;
3. 试卷请求 QPS:5 万/s;
4. 提交试卷 TPS:1700/s;
5. 存储架构采用 Redis sentinel。
3. 总体架构
3.1 架构分析
3.1.1 高性能
对于试卷存储,需要读的 QPS 远远高于写的 QPS,考试在一分钟内开始,而交卷是陆续在考试结束前 30 分钟内完成。
3.1.2 高可用
面向全国 1000 万的用户,需要保证试卷尽量不丢失,出现故障时能尽快恢复,当出现故障时,能在短时间内恢复可用。
3.1.3 可扩展
在网络上收集的试卷电子版,统一采用文本方式计算,少数试卷不超过 20KB,大部分试卷约 8KB,这里预估一张试卷约 15KB。按照每年考 20 课,每年考两次, 则每年增长:20*15*2/1024≈0.6MB。
这里先预算 3 年,则 3 年内的最大存储为 1.8MB,远远低于目前服务器的磁盘划分空间,这里使用 MySql 服务来存储数据即可。使用服务器本身磁盘存储即可,同时采用服务器磁盘的 RAID1 模式来实现备份即可。所以不考虑可扩展性。
3.2 总体架构
采用 Redis sentinel 存储架构来存储考试试卷, 实现:
1. 主从复制,读写分离。master 实现读写,slave 实现读功能。
2. master 故障时 sentinel 监控到 master 无法连接就从 slave 中选取一个作为新的 master,同时通知其他 slave 已经重新设置了 master,其他 slave 接受到 master 变更信息后更改原来配置的 master 信息。
4. 详细设计
4.1 核心功能
4.1.1 redis 写
redis master 主机用来接受写数据的请求。
4.1.2 redis 读
redis master 和 slave 主机同时接收读数据的请求。
4.1.2 redis sentinel 故障转移
sentinel 通过监控的方式获取主机的工作状态是否正常,当主机发生故障时,sentinel 会自动进行故障转移,并将其监控的从机提升主服务器(master),从而保证了系统的高可用性。
4.2 关键设计
1)redis 写
写数据由老师或者管理员完成,对高并发要求不高。1 台服务器做 master。
2)redis 读
会有 1000 万学生会在 1 分钟内读试卷的场景,QPS 达到 5 万/s。基于 redis 性能,需要考虑服务器的性能,采用高性能的服务器,一台服务器即可轻松满足 5 万/s 的 QPS,而一般性能的服务器,可以达到 1 万/s 的 QPS,这里假设使用一般性能的,至少需要 5 台服务器作为 slave,还要考虑故障迁移的场景,多加一台 slave 服务,那么 6 台服务器作为 slave。
3)redis sentinel 故障转移
在实际生产情况中,redis sentinel 是集群的高可用的保障,为避免 sentinel 发生意外,它一般是由 3~5 个节点组成,这样就算挂了个别节点,该集群仍然可以正常运转。这里使用 3 台服务器作为 sentinel 集群。
4)数据持久化
这里采用 MySql 数据库来存储数据,同时采用 MySql 主备复制来实现 master 中主 MySql 和多台 slaver 中备 MySql 数据同步。
4.3 设计规范
1)Redis Sentinel 采用官方自带的技术方案。
2)MySQL 使用 Innodb 存储引擎,编码格式采用 utf-8mb4。
3)Redis 数据类型采用 String 类型。
5. 质量设计
5.1 Redis Sentinel
需要保证 Sentinel 自身故障时能继续提供故障转移的功能。
5.2 Redis 主从切换
需要保证在故障迁移后,新的 master 能完成读写操作,slaver 提供读操作,新的 master 和 slaver 中主从数据复制正常。
5.2 数据持久化
采用 MySql 服务实现数据持久化,其中使用 MySql 主备实现 redis 的 master 和 slaver 上数据一致。
6. 演进规划
6.1 千万级学生管理系统的考试试卷存储方案一期
实现 1000 万学生同时读取试卷的功能及 Redis Sentinel 故障转移和 MySql 主备复制的功能。
评论