模块四作业 - 学生管理系统的考试试卷存储方案
1.试卷存储结构:
采用 hashtable 结构,为降低网络峰值消耗,单个试卷区分为文本部分和图片部分,且每个图片分为一个键值对,则具体结构如下:
示例:
2.试卷写流程
试卷原始数据由教师上传至系统,保存于 Hbase 中,数据结构为:学校 ID+课程 ID+试卷 ID:试卷内容
考试前一天,系统跑批将第二天考试的试卷加载到 redis 中;
3.试卷读流程
考生登录系统后,选择考试菜单进入考试流程;
系统读取 redis,根据试卷 ID 首先获取试卷文本部分;
如当前或随后一道题目有图片,则根据试卷 ID+图片序号获取试题图片;从而将试卷分解为多个部分分别读取,缓解系统和网络压力;
考试完成,考试提交试卷,考试结果存入 Hbase 中;
4.性能估算
总试卷写请求估计
1000 万学生,每一门考试平均有 100 个学生参加,20 门课程,平均分布在 10 天内,试卷上传时间集中在 2 个小时,故写 TPS 为: 1000 万/100 个学生*20 门课/10 天/7200 秒 =30 次/秒
单个试卷存储量估计
文本部分:20 个判断题 200 字节+20 个选择题 200 字节+4 个大题*1000 字节=12KB
图片部分:20 个试题图片*50K=1MB
单个试卷总大小 约等于 1MB
redis 集群总容量估计
1000 万学生,每一门考试平均有 100 个学生参加,20 门课程,平均分布在 20 天内考完,则每天的试卷总大小为: 1000 万/100 个学生 20 门课/20 天 1MB = 100 GB
综合考虑学生读取试卷的 TPS 峰值为 5 万/秒; 试卷原始数据保存在 hbase 中,存储结构和 redis 类似;每天晚上跑批把第二天所有试卷加载到 redis,写性能需求可忽略不计,每次批处理写入量为 100G;
单台 redis 的读性能为 5 万-10 万/秒;
故 Redis sentinel 集群可采用 4 台 8C64G 服务器即可,单台服务器存储约 25G 数据,提供峰值读并发为 5 万/4=1.25 万/秒;
5.冗余量和扩展性分析
考虑到 redis 数据是从 Hbase 读取且无修改、无需落地,最大可使用单台服务器内存的 80%存储数据,则现集群冗余量为:
最大可存储数据量为 64G*4*80%=200G,冗余 100%;
最大读 TPS 为 5 万*4=20 万/秒,冗余 300%;
如试卷大小或者试卷总存储量增多,可考虑扩容服务器内存到 128G,考虑到 redis 数据无需落地,则:
最大可存储数据量为 128G*4*80%=400G;
最大读 TPS 为 5 万*4=20 万/秒;
评论