写点什么

架构实战营 模块四作业

作者:felix
  • 2021 年 11 月 11 日
  • 本文字数:1651 字

    阅读完需:约 5 分钟

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


前言

本文是千万级学生管理系统的考试试卷存储架构设计方案,用于指导考试试卷存储的部署和运维。

词汇表

Redis: 开源内存数据库

Sentinel: 哨兵模式

1. 业务背景

基于千万级学生管理系统的案例来搭建考试试卷存储系统。

假设每门学科每学期 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试的答案 20 判断题、20 选择题、4 道大题(答案 200 字以内),考试结果永久保存,在校学生能够看到自己曾经的考试结果,则考试结果记录的存储量为:

• 在校学生:1000 万 * 20(课)* 2(考试次数) * 1000(答案)* 2(学期) * 3(只有前三年考试)= 2.4T。

• 离校学生:每年 250 万,存储量为 0.6T。

假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:

• 一期试卷考题存储量: 1000(学校) * 100(专业) * 3(年级) * 20(课程) * 5000(试卷) = 30G。

• 请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒。

• 提交试卷: 1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 30 分钟 = 1700/每秒。

• 一期试卷答题结果存储量: 1000 万 * 20(课)* 1000(答案)= 200G

• 一期课程成绩结果存储量: 1000 万 * 20(课)* 200(答案)= 40G

2. 约束和限制

1、试卷考题存储大小 30G, 由于大部分是文字,压缩只有大概在 20G

2、QPS=5w

3. 总体架构

教师出卷:通过题库选择和出题,然后组成一份试卷存入 MySQL,并同步到 Redis。

学生考试:根据学校、专业、班级、课程、考期在 Redis 中分块获取试卷信息,答题之后保存到 HBase 中。

教师阅卷:获取学生的答题结果,进行批阅和评分,将评分结果存入 MySQL,并同步到 HBase 中。

查询成绩:根据学校、专业、班级、课程、考期、学号获取考试的结果和成绩。

3.1 架构分析

3.1.1 高性能

由于考试请求试卷的峰值较大,需要从并发量,请求数据大小进行分析。根据估算 QPS 在 5 万每秒,采用单台 Redis 也能满足要求,但是数据量 250M/s(5w*5k)超出单机吞吐量,至少需要两台机器。

3.1.2 高可用

防止出现从 Redis 中获取试卷信息意外宕机的风险,冗余一台机器的能力。保障关系数据高可用,通过半同步方式部署两台从机。


3.2 总体架构

针对考试试卷,MySQL 进行一主二从自动切换部署,Redis 采用三个 Sentinel 实例的集群和一主二从三个 Redis 实例的集群部署,Sentinel 哨兵监控三个实例,三台服务器上每台部署一个 Sentinel 实例和一个 Redis 实例;HBase 采用集群部署测试。MySQL 存储考题信息、试卷考题关系、课程考试结果;Redis 存储当期的试卷基础信息和试题信息;HBase 存储试卷答题结果信息。

4. 详细设计

4.1 核心功能

4.1.1 教师出卷

从题库中调取题目信息,然后选择或编辑题目,并保存新的考题,并组成一份试卷的关系,保存到数据库中,并发布到 Redis 中。

4.1.2 学生考试

考试时,先从 Redis 中获取试卷基本信息,然后逐块或按题获取题目信息;答题之后,把题目、解答保存到 HBase 中。

4.1.3 教师阅卷

从 HBase 中调取学生答卷信息,并做结果评分,记录保存到 Hase 中;课程考试成绩和答题正确率统计,保存在 MySQL 中。

4.1.4 查询成绩

学生查询答题和评分明细从 HBase 中获取,查询课程成绩从 MySQL 中获取。

4.2 关键设计

1、考题、试卷

考题按照课程题型分表存储;试卷按照学校、专业分表存储;课程考试结果按照学校、专业、课程分表存储;当期试卷在 Redis 上采用 Hash 数据结构存储,key 是学校、专业、班级、课程,field 是试卷基础信息和题型题号两类,value 是具体题目信息。

2、考试结果

课程考试成绩按学校/专业/课程分表存储;学生答题结果按照学校、学号、考试 ID 为 key,题目、答题、评分为列进行存储。

4.3 设计规范

1、MySQL 按学校、专业、课程分表存储;

2、Redis 采用 Hash 数据结构存储;

3、HBase 按学校、学号、考试 ID 键值存储;


发布于: 2021 年 11 月 11 日阅读数: 10
用户头像

felix

关注

还未添加个人签名 2018.09.08 加入

还未添加个人简介

评论

发布
暂无评论
架构实战营 模块四作业