写点什么

千万级学生管理系统的考试试卷存储方案

作者:
  • 2022 年 3 月 05 日
  • 本文字数:1717 字

    阅读完需:约 6 分钟

前言

本文是千万级学生管理系统的考试试卷存储方案设计文档,用于指导万级学生管理系统的考试试卷存储的开发、测试和运维。

 

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 主备复制的功能。

 

用户头像

关注

还未添加个人签名 2019.02.19 加入

还未添加个人简介

评论

发布
暂无评论
千万级学生管理系统的考试试卷存储方案_「架构实战营」_成_InfoQ写作平台