架构实战营模块 4 作业 - 千万级学生管理系统的考试试卷存储方案
千万级学生管理系统的考试试卷存储方案
【作业要求】基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计, 完善考试试卷存储方案, 具体包括:
1)完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构
2)设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)
3)对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能
【提示】性能可以有一定冗余
如果对 Redis sentinel 不熟悉,请参考官方文档: https://redis.io/topics/sentinel
步骤为:存储性能估算->存储系统选择->存储方案设计。
1. 存储性能估算
用户量:
学生预计 1000w。
行为:
试卷的读取,试卷的提交
性能估算:
请求试卷:1000 万*20(课)/20(周末不考试)/4(每天 4 门考试)/1(分钟内下载好卷子) = 250 万请求/分钟 ~= 5 万/秒。QPS=50kps
提交试卷:1000 万*20(课)/20(周末不考试)/4(每天 4 门考试)/30(分钟内提交) = 1700/秒。TPS=1.7kps.
存储容量估算:
在校学生:1000 万*20(课)*2(考试次数)*1000(答案字符数)*2(学期)*3(只有前 3 年考试)=2.4T
离校学生:在校学生的 1/4,也就是 0.6T 的存储量。每年增长 0.6T。
2. 存储系统选择
加载试卷是读多写少的典型场景,所以存储系统需要缓存。而试卷的提交是分散在不同的时间的,所以 TPS 其实不大。
单机不能存储所有数据,需要分区部署,所以采用分区架构。
试卷存储和访问因为需要缓存,所以采用 Redis 的 sentinel 方案,分片集群的方式。
3. 存储方案设计
数据结构设计
Key:试卷 ID+date
Value: 试卷内容
采用 sorted_map,value 采用 Redis 的 string 类型数据结构。
读写分析
读
读 key 的方式,拿到 value
写
存储试卷时,如果 key 已经存在,直接覆盖即可。不存在就新增。
有效期为 1 年,1 年后,放到冷数据库即可。
集群机器数量估算
预估 5 台机器
1 台 master
1 台 slave
主从模式的升级
3 台 sentinel 哨兵
奇数个哨兵用于故障切换时投票,3 台差不多够了。
客观下线后,发生故障迁移,哨兵服务器被推选为主服务器,迁移数据到新主服务器。
评论