OceanBase
支持强一致性和跨行跨表事务,支持服务器线性扩展
OceanBase整体架构图
定期合并与数据分发:
- UpdateServer冻结当前的活跃内存表,生成冻结内存表,并开启新的活跃内存表,后续的更新操作都写入到新的活跃内存表
- UpdateServer通知RootServer数据版本发生了变化,之后RootServer通过心跳消息通知ChunkServer
- 每台ChunkServer启动定期合并或者数据分发操作,从UpdateServer获取每个子表对应的增量更新数据
查询结果 = 旧子表+ 冻结内存表+新的活跃内存表
= 新子表+ 新的活跃内存表
如何实现强一致性:
1. 操作日志同步到主备的情况下才能够返回客户端写入成功
2. 为了提高可用性,如果主机往备机同步操作日志失败,比如备机故障,主机可以将备机从同步列表中剔除,本地跟新成功后就返回客户端写入成功.
OceanBase数据分为基线数据和增量数据两部分,基线数据分布在多台ChunkServer上,增量数据全部放在一台UpdateServer上.
读写事务
用户的读写请求,都发给MergeServer,
- 只读事务: 由MergeServer发送给相应的ChunkServer分别执行后再合并每个ChunkServer的执行结果
- 读写事务: 由MergeServer进行预处理后,再发生给UpdateServer执行.
数据正确性
- 数据存储校验: 每个存储记录同时保存64位CRC校验码.数据被访问时,重新计算和比对校验码
- 数据传输校验: 每个传输记录同时传输64位crc校验码,数据被接收后,重新计算和比对校验码
- 数据镜像校验: UpdateServer的内存表在主备间必须保持一致,为此UpdateServer为每个MemTable生成一个校验码,MemTable 每次更新时,校验码同步更新并记录在对应的操作日志中,备UpdateServer收到操作日志并重放到MemTable时,也同步更新MemTable检验码并与接收到的校验码对照.
- 数据副本校验: ChunkServer在定期合并生成新的子表时,也同时为每个子表生成一个校验码,并碎新子表汇报给RootServer,以便RootServer核对同一个子表不同副本的校验码