第四次作业 设计千万级学生管理系统的考试试卷存储方案
一.存储性能分析汇总
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。
版权声明: 本文为 InfoQ 作者【函数方程(弘宇)】的原创文章。
原文链接:【http://xie.infoq.cn/article/8489f98451a9b6a28cfcdfd59】。文章转载请联系作者。
评论