如何设计业务高性能高可用存储架构 - 作业
作业要求
基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:
• 完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构。
• 设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)。
• 对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能。
数据估算
数据大小
假设每门学科每年 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试的答案 20 判断题、20 选择题、4 道大题(答案 200 字以内)
假设每个学生平均一学期 20 门课,其中基础课 10 门,专业必修课 5 门,专业课 5 门。500 所学校有 10 个学院,每个学院 10 个专业。每个题目占用 50 字节。
估算所得,
总共课程数
500 * [100 * 5(专业课)+ 10 * 5(专业必修课)+ 10 (公共基础课)]= 280,000 门课程
学年总考试数
280000 * 2 = 560,000
考试试卷数据大小
试题大小:560,000 * 50 字节 *44 题 = 1.2GB
答案大小:560,000 *( 200 字节 *4 题 + 2 字节*20 题) = 450MB
数据请求并发
假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟
请求试卷 QPS
1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒。
数据结构设计
每个学校的每门课程使用 hash 来存储,试题和答案分开存储,Redis 存储 3 年试题数据(1.65G * 3 = 4.95GB)
试题 hash
Key: Item+学校 ID+课程 ID+考试日期
Hash Key:题目 ID
Value: 试题内容
答案 hash
Key: Answer+学校 ID+课程 ID+考试日期
Hash Key:题目 ID
Value: 试题答案
读写分析
老师准备试卷,将课程考试题目一题一题存入 Redis 试题 hash
学生通过学校 ID,课程 ID 和题目 ID 来获取试题
考试流程
学生登系统获取学生 ID,学校 ID
在 MySQL 选课表中,根据学生 ID 查询到当前是否需要参加课程考试,如果需要,返回课程 ID 和考试日期
根据课程 ID,利用`hgetall`命令,获取课程试题所有题目 ID 和试题内容
存储架构
试题+答案数据大小<2GB, 使用 1 * Redis Master + 2 * Redis Slave 的 sentinel 架构已经够用。(简单原则)
Redis node 配置:16vCPU, 32G Memory (合适原则)
集群性能能支撑 5 万/每秒的试题请求
试题数据主从复制,每个节点都可支持读请求,Master 故障自动切换到 Slave
评论