考试数据存储方案
前言
本文用以说明考试试卷存储方案详细设计。
词汇表
Redis: Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库.
Sentinel: Redis Sentinel provides high availability for Redis.
Redisson: Redis Java client with features of In-Memory Data Grid.
1. 业务背景
参考前一模块内容
2. 约束和限制
参考前一模块内容
3. 总体架构
[必选,描述经过备选架构决策后定下来的架构方案,这一章主要是描述架构的 3R:Rank、Role、Relation]
[技巧:1. 系统边界白盒图描述系统内的角色与外界的交互(Rank + Role + 外部 Relation);2. 系统架构图来描述内部的 Role + 内部 Relation]
[注意:不建议一张图同时描述系统架构的 3R 以及与外界的交互,因为图太复杂,画系统边界白盒图的时候,系统内部的 Relation 可以不画]
3.1 架构分析
3.1.1 高可用
对于考试试卷信息来讲,集中安排在某一个月内,且每天安排四场考试,上午下午各两场,要确保在考试时间段内的可用,并且需要采用主从且需要在故障时进行自动切换,不影响考试正常进行。
20 门课的安排信息需要内存大概:20*8B=160B.
20 门课程的题目信息需要内存:20*100(假设 100 道)*400B = 800000B = 781.25MB
3.1.2 高性能
每场考试开始前一分钟所有考生集中读取数据,性能分析如下:
请求试卷:1000W * 20(课) / 20(周末不考试)/4(每天 4 堂考试)/1 分钟 = 5W 请求/s
这样的请求量理论上讲单台 Redis 已经可以满足,但是为了满足高可用要求和一定的性能冗余需要进行主从集群构建。
综上所述,采用一主两从的哨兵模式的主从架构即可, 每台机器 1G 内存即可。
3.2 总体架构

1)Sentinel 集群由三台服务器组成,采用 Raft 集群选举模式,可实现高可用。
2)Redis 集群采用一主两从模式,主从复制。
3)由 Sentinel 监控 Redis 集群,当主服务器发生故障,可实时选举新的主节点提供写服务,并将最新主从信息通知客户端。
4)应用端通过 Redisson 客户端连接 Sentinel 集群,并采用主写,主从读模式。
4. 详细设计
4.1 核心功能

4.2 关键设计
1)可用性
采用一主两从复制架构,并用哨兵集群进行监控,哨兵集群本身就实现高可用,当主从复制集群出现主节点故障,可以由哨兵集群实时选举主节点提供读写服务。如果从节点故障可以实时告知客户端最新的集群读写信息列表,客户端按照特定的路由策略进行读写请求分派。
2)高性能
Redis 本身具有极高的读写性能,其 OPS 单机可达到 10W/s,采用一主两从集群,主从同时提供读服务,足以应付考试时获取考试安排信息和考试题目的 10W/s 的请求。
4.3 设计规范
数据结构设计:
1)选用 sorted sets 存放每门课考试安排信息,用课程 ID 作为 member, 用考试开始时间(yyyyMMddhh)作为 score, 如 2021010610。当开始开始考试前一分钟,通过当天日期和开考时间前后一小时范围获取考试课程 ID。
2)依然选用 sorted sets 存放每门课考试的题目信息,用课程 ID 作为 key, 题目内容作为 member, 用题目编号作为 score。开考时一次将所有题目按存放顺序获取到本地,考试过程中读取本地考试题目完成作答。
5. 质量设计
6. 演进规划
版权声明: 本文为 InfoQ 作者【皓月】的原创文章。
原文链接:【http://xie.infoq.cn/article/1159c1eb8217d2efdb0047683】。文章转载请联系作者。
评论