写点什么

第四次作业 设计千万级学生管理系统的考试试卷存储方案

发布于: 2021 年 05 月 23 日

一.存储性能分析汇总

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

在校学生:1000 万* 20(课)* 2(考试次数)* 1000(答案)* 2(学期)* 3(只有前三年考试)=2.4T 离校学生:每年 250 万,存储量为 0.6T(逐年增长)


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

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


综上可得

在校学生考试结果存储:2.4T,

离校学生考试结果存储:每年增长 0.6T

试卷请求 QPS:5 万/s(读)

提交试卷 TPS:1700/s


二、存储架构选择逻辑

2.1 提交考试结果存储

单机能否存储所有考试数据 2.4T(而且随着时间推移,该数据会不断递增),不能。是否考虑分区部署,暂不考虑。那么采用分片架构。

老师批阅考试结果,采用 mysql 分库分表的架构。学生提交、查询考试结果采用 Hbase 集群。老师通常需要对学生的考试成绩进行分析、汇总。老师关心相关课程的考试情况,这是进行分库分表的依据。此外,为了区别学生维度,另 copy 一份数据到 Hbase 集群里,来支持学生提交和查询。

对于四台 32 核主机每秒插入 70000 条数据,Hbase 集群足以支撑 1700/s 的需求

2.2 请求试卷

单机能否支持存贮考试试卷信息,可以。单机能否支持读性能,可以。是否支持自动切换,考虑到系统的高可用,最好支持。综上考引入 redis sentinel 主--从架构。


三、redis 数据结构的设计

试卷信息采用 List 结构,

key(考试试卷基本信息):"Grade2::Math::FinalExam"

value(考试题目):

{

"exam_question_id": 1, // 试题序号

"exam_question_content": "试题问题 1", //试题内容

"exam_question_type": 1, //试题类型: 1:单选题

"options": "{"A":"选项 A 内容","B":"选项 B 内容","C":"选项 C 内容","D":"选项 D 内容"}" // 选项,

}.....


四.redis sentinel 的设计

查阅相关文献可知,在不进行批量获取数据的时候,也就是每次发送一个 key 获取一个值的方式处理,windows 系统的基本处理能力只在 1100 条左右,而 linux 环境快于 window 环境,每秒能处理 4000 条左右的数据。采用 linux 系统,为应对 5 万/s 的读取量,大约需要 15 个节点的 slave。


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

还未添加个人签名 2019.10.10 加入

还未添加个人简介

评论

发布
暂无评论
第四次作业 设计千万级学生管理系统的考试试卷存储方案