写点什么

模块四作业

作者:Geek_1d37ea
  • 2021 年 11 月 23 日
  • 本文字数:3081 字

    阅读完需:约 10 分钟

前言


词汇表

Redis Sentinel redis HA 架构

1. 业务背景

不涉及


2. 约束和限制

  1. 用户量 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. 演进规划


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

Geek_1d37ea

关注

还未添加个人签名 2018.01.21 加入

还未添加个人简介

评论

发布
暂无评论
模块四作业