模块四作业
一.数据量及调用量预估
1.在校学生(试卷+试题): 2.4T
2.离校学生(试卷+试题)(增量):每年 250 万,存储量为 0.6T
3.试卷请求 QPS:5 万/秒
4.提交试卷 TPS:1700/秒
二.redis 数据结构存储设计
1.试卷设计 - 使用 hash 结构
(1)key:学校 ID + 课程 ID
(2)field:页码 NO
(3)value:试卷页具体内容,JSON 串
学生作答速度不一样,所以按页请求数据,降低每次返回所占带宽。redis 单线程读取数据,提高请求响应速度。
2.提交试卷 - 使用 Sorted Set 结构
(1)key:学校 ID + 课程 ID + 学生 NO
(2)score:题号 NO
(3)value:题号作答结果,JSON 串
按题号存储方便老师批改,方便指定老师批指定题目
3.试卷批改、打分 - 使用 Sorted Set 结构
(1)key:学校 ID + 课程 ID + 学生 NO + "score"
(2)score:题号 NO
(3)value:分数 + 批语
与提交试卷结构对照,方便学生查看试卷和教师协作
三.数据交互流程
出题,存储到 mysql 当中,题目整体的量级较小,选型 mysql 较为合适,普通的主备架构即可
数据预热同步,mysql 的试卷同步到 redis 集群当中,增加读取性能(redis 用于缓存,需要设置数据过期时间)
试卷读取
试卷提交,临时存储到 redis 中,提高 TPS
试卷持久化,redis 内存资源太贵,写入 redis 后使用消息队列异步落盘。由于试卷数据量大,且为非关系型数据,最终使用 hbase 存储。
四.Redis sentinel 集群的服务器数量和性能
1.单机 redis QPS 5~10W/s,满足最高 QPS 5W/s。所以 redis 服务一主一从即可。
(如果成本足够,最好一主两从,防止主宕机之后,从再次宕机导致缓存穿透。即使临时加从节点,主从同步时 fork 会导致 redis 请求阻塞)
2.哨兵最少 3 个,即 3 台机器(不能与服务部署在一台机器,防止机器异常导致剩 2 个哨兵选不出执行哨兵;哨兵节点为基数,防止脑裂)
评论