模块四作业
前言
词汇表
Redis Sentinel redis HA 架构
1. 业务背景
不涉及
2. 约束和限制
用户量 1000 万
3. 总体架构
3.1 架构分析
3.1.1 高可用
对于课程管理系统来说,试卷管理属于读多写少场景,在开考前 1 分钟试卷请求读取量非常大,如果出现服务中断,不可用等情况,影响范围波及 1000 万学生的正常考试程序。会浪费学校大量人力物力,酿成教学事故。所以试卷内容存储要保证高可用性。
3.2 总体架构
4. 详细设计
本章节描述学生管理系统核心功能之一:试卷管理流程。
4.1 核心功能
4.1.1 试卷管理流程
试卷管理流程按场景分为出卷、下发试卷和机器阅卷三个场景。
出卷场景是老师学期终会录入新的试卷,步骤如下:
1)老师登录系统,打开试卷管理页面
2)老师点击“新增”按钮,弹出试卷信息输入页面
3)依次填写试卷信息,比如试卷名称、试卷课程等
4)确认无误后,点击提交,显示创建试卷成功;如果信息不对,显示错误提示。
5)点击刚创建的试卷页面,选择“导入试题”按钮,弹出试题 excel 文件输入框
6)导入事先准备好的试题模板,点击“提交”,显示试题导入成功;如果试题模板有问题,显示错误信息。
7)点击刚创建的试卷页面,点击“试卷预览”按钮,弹出试卷的试题窗口。
下发试卷场景是当开考后学生打开试卷答题,步骤如下:
1)学生登录系统,打开课程信息页面,显示“开始考试”按钮
2)学生点击“开始考试”按钮,弹出“考试须知”说明框
3)点击确认后,正常显示考卷信息,如考卷名称,考卷日期,总分值,考试时长等。
4)点击“开始答题”按钮,正常显示考题内容。
4.2 关键设计
4.2.1 存储方案设计-试卷内容
试卷管理包括试卷信息和试题管理:试卷信息主要描述试卷的元数据,比如出卷人、课程类型等。为提高试卷下发性能,试题描述和试题答案分开存储,试题管理分为试题描述和参考答案管理。
4.2.1.1 试卷信息表
试卷信息表结构如下:
字段名 字段描述 样例
ID 试卷的唯一标识 10001
NAME 试卷名 大物 2021 年期末试卷 A
CREATOR 出卷人 张三
CREATE_TIME 出卷时间 202110
COURSE_TYPE 课程类型 大物
COURSE_ID 课程 ID 2313
SEMESTER 学期 2021 秋
DURATION 时长(分) 120
SCORE 得分 100
设计的 Redis 数据结构如下:
1)试卷主表用 string,如下:
key 域名:表名:主键值:列名
value 列值
示例如下:
PAPER:PAPER_INFO:10001:NAME "大物 2021 年期末试卷"
PAPER:PAPER_INFO:10001:CREATOR "张三"
PAPER:PAPER_INFO:10001:CREATE_TIME "202110"
PAPER:PAPER_INFO:10001:COURSE_TYPE "大物"
PAPER:PAPER_INFO:10001:COURSE_ID "2313"
PAPER:PAPER_INFO:10001:SEMESTER "202101"
PAPER:PAPER_INFO:10001:DURATION 120
PAPER:PAPER_INFO:10001:SCORE 100
2)主键索引用 string,如下:
key 表名:列名:列值
value 主键值
示例如下:
PAPER_INFO:COURSE_ID:"2313" 10001
3)其他键索引用 set,如下:
key 表名:列名:列值
value 主键集合
示例如下:
PAPER_INFO:COURSE_TYPE:"大物" 10001 10005 10010
常用的操作如下:
1.插入新试卷(出卷自动导入)
2.查某个试卷 ID 的试卷信息 (考试开场)
4.2.1.2 试题描述表
试题描述表结构如下:
字段名 字段描述 样例
ID 考题唯一标识 9000001
PAPER_ID 对应的考卷 ID 10001
ORDER 考卷位置 1,2,3 1
CREATOR 出题人 "李小六"
TYPE 题型:0 判断 1 选择 2 简答 1
SCORE 分值 2
STEM 题干 "地球是圆的吗"
OPTION_CNT 选项个数 4
OPTIONS1 选项 1 是
OPTIONS2 选项 2 否
OPTIONS3 选项 3 N/A
OPTIONS4 选项 4 N/A
OPTIONS5 选项 5 N/A
OPTIONS6 选项 6 N/A
设计的 Redis 结构如下:
试题描述表用 string,如下:
key 域名:表名:主键值:列名
value 列值
示例如下:
PAPER:TEST_INFO:9000001:PAPER_ID "10001"
PAPER:TEST_INFO:9000001:ORDER "张三"
PAPER:TEST_INFO:9000001:CREATOR "202110"
PAPER:TEST_INFO:9000001:TYPE "大物"
PAPER:TEST_INFO:9000001:SCORE 0
PAPER:TEST_INFO:9000001:STEM "地球是圆的吗"
PAPER:TEST_INFO:9000001:OPTION_CNT 2
PAPER:TEST_INFO:9000001:OPTIONS1 "是"
PAPER:TEST_INFO:9000001:OPTIONS2 "否 "
PAPER:TEST_INFO:9000001:OPTIONS3 "N/A "
PAPER:TEST_INFO:9000001:OPTIONS4 "N/A "
PAPER:TEST_INFO:9000001:OPTIONS5 "N/A "
PAPER:TEST_INFO:9000001:OPTIONS6 "N/A "
主键索引用 string,如下:
key 表名:列名:列值
value 主键值
示例如下:
TEST_INFO:STEM:"地球是圆的吗" 9000001
其他键索引用 set,如下:
key 表名:列名:列值
value 主键集合
TEST_INFO:PAPER_ID:10001 9000001 9000002 9000003 9000004
常用的操作如下:
1.插入某个试卷的试题(出卷自动导入)
2.查某个试卷的所有试题 (考试开场)
4.2.1.3 试题答案表
试题答案表结构如下:
字段名 字段描述 样例
ID 考题唯一标识 9000001
PAPER_ID 对应的考卷 ID 10001
ORDER 考卷位置 1,2,3 1
REFER_ANS 答案 “是”
试题答案表用 string,如下
key 域名:表名:主键值:列名
value 列值
示例如下:
PAPER:TEST_ANS:9000001:REFER_ANS "是"
常用的操作如下:
1.插入某个试卷的试题答案 (出卷自动导入)
2.查某道考题的答案 (机器阅卷)
4.2.2 试卷存储性能
经过调研,学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,且请求试卷集中在考试开始的前 1 分钟。估算的请求试卷 TPS 数约为 5 万/每秒。redis 单节点性能在 5~10 万每秒,可以支撑试卷查询请求。
同样的,每门学科每年 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试的答案 20 判断题、20 选择题、4 道大题(答案 200 字以内),考卷保持 10 年以内,估算的试卷数据存储容量为 4G。
总卷子数估算方法为:一个学生一学期 20 门课,一年 2 个学期,4 个年级共开设 4*2*20=160 门课,一门课两次考试,一次考试出两张卷子(AB 卷),一年卷子 640 个,一共存储 10 年试卷,总共 640*10=6400 张卷子。
一张卷子存储容量估算方法为:一张卷子分为三部分存储,一部分是卷子基本信息,一部分是 24 道试题,一部分是 24 道试题答案。分开估算,以卷子基本信息为例,共 9 个字段,redis 分三部分存储,一是主表信息采用 string 存储,一个字段一条 kv 记录,每条记录占 256 个字节,存储估算为 256*9 个字节,二是主键索引用 string 存储,每个字段单建一条 kv 记录,存储估计为 256*9 个字节;三是其他键索引用 set 存储,每个非主键字段 set 集合存储一年的试卷 id(当年试卷查询量大),一个 id 固定长度 6 字节,一年 320 个卷子,平均存储估计为 320*6(id 长度)=1920 个字节,估算一张卷子基本信息存储为 340KB。
256(平均 kv 长度)*9(字段数)+256(平均 kv 长度)*1(按名称主键索引)+6400(试卷数)*6(试卷 id 长度)*4(按出卷人、学期等 4 个其他字段索引) = 156160 字节
以此类推,一道试题的存储是 256(平均 kv 长度) *14(试题描述字段数)+256*9(按试题名主键索引)+ 24(24 道题)*9(试题 id 长度)*4(按试卷 id、题型等其他字段索引) = 6752 字节
一道试题答案的存储是 256(平均 kv 长度)* 4(试题答案字段数)+24(24 道题)*9(试题 id 长度)*1(按试卷 id 等其他字段索引)= 1240 字节
综合以上信息,一张试卷的完整存储数据为:156160+24*(6752+1240)= 347968 字节 ~340KB,一年 640 个卷子,1 年试卷存储量是 218M,10 年的试卷存储约为 2180M,按照内存稳定运行 60%计算,存储空间需要 4G。redis 单点存储空间大于 4G,可以支撑稳定运行。
4.2.3 试卷存储可用性
为了提高试卷存储的可用性,使用 sentinel 技术来解决单点问题,通过 raft 算法进行选举。sentinel 技术采用主从复制,读写分离,并且在 Master 故障时 sentinel 可以自动切换。redis 服务器集群采用 3 哨兵+1 主 2 从的方式来保证试卷存储的高可用。
4.3 设计规范
5. 质量设计
6. 演进规划
版权声明: 本文为 InfoQ 作者【Geek_1d37ea】的原创文章。
原文链接:【http://xie.infoq.cn/article/a13125e996fc10456767cd250】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论