架构实战营作业四
作业:
设计千万级学生管理系统的考试试卷存储方案
【作业要求】
基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:• 完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构。• 设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)。• 对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能。
解答:
读写性能复杂度分析:
假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:
请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒。
提交试卷: 1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 30 分钟 = 1700/每秒。
解决方案:
试卷库可以使用 HBASE 存储。因为各个学校需要永久存储每年的各科试卷,数据量较大。HBASE 适宜这种结构简单,但数据量较大的应用。
试卷的使用需要使用 Redis 数据结构。根据以上分析,系统的最高 QPS 达到 5 万/秒,HBASE 就不合适了。使用 Redis sentinel 作为存储系统比较合适。因为 Redis 的读性能完全满足 5 万/秒的要求;同时,使用 Redis sentinel 可以较好地解决高可用的问题;并且,Redis 是成熟的开源软件,开发和运维都比较容易。
因为试卷是结构简单的数据,所以使用 Redis 的 String 类型来存放,具体的结构如下:
key: 学校 id+试卷 id
value: 试卷内容
读写流程:
考试当天,提前读取所需试卷及答案(标准考试的答案,比如选择题答案)到 Redis。考生开考时下载到终端进行考试。Redis 的高 QPS 的特性可以满足超过 5 万/秒的 QPS。不过需要注意的系统流量带宽。
考生答题的结果临时存储在本地文件,提交的时候,标准题目可以立刻依据答案进行批改,整个答题结果提交到答题系统的 MySQL 系统存储,那里面带有学生信息,各题目信息以及解答信息。以供老师批改试卷(如果有必要),及后续分析学生的答题/学习情况。
考试结束的时候,系统将考生信息、试卷及答题和批改情况全部上传到 HBASE,留档,供永久保存,备查。
Redis sentinel 架构:
根据以上的复杂度分析,Redis sentinel 需要支持 5 万/秒的 QPS,这对 Redis 来说不是问题。只需采用一主两备的方案即可。架构图如下:
一个 Redis master, 两个 replica,每个节点安装一个 sentinel,作监控和故障切换节点。三个 sentinel 能够保证在 master 出现故障的时候,R2 或 R3 能够进行 fail over,保证系统继续可用。
版权声明: 本文为 InfoQ 作者【库尔斯】的原创文章。
原文链接:【http://xie.infoq.cn/article/5705a95a1e256d8f14ffafbab】。文章转载请联系作者。
评论