OceanBase实践入门:高可用原理和容灾方案-云栖社区-阿里云
mq4096 2019-08-05 18:04:22 浏览1090
本文内容是直播的文字稿,直播视频回放地址https://tech.antfin.com/community/live/773
OceanBase的高可用可以做到自动故障切换和不丢一点数据,即使是异地多机房部署也是如此。这是
OceanBase的特性之一。OceanBase的高可用机制是数据库内核能力不可分割的一部分,且是常态运行不存在
需要的时候才发现失效了。
高可用方案要点
通常对高可用的要求就是数据库如果出问题了要能够自动切换,并且切换后不丢数据。
能自动切换,服务恢复时间才有可能最短,衡量指标就是RTO。切换后服务恢复时,数据丢失多少,衡量指标
就是RPO。分析一个高可用方案就从这两点入手。
数据库不丢数据的关键——事务日志
数据库事务要满足ACID特性,其中D就是持久化,其关键点就是事务日志的设计。事务日志必须先于数据修改
前生成并落盘,即常说的Write-Ahead Logging(WAL)。数据修改通常不会立即落盘。事务日志除了能用于本
机数据库宕机恢复外,还可以用于构建冗余副本(即备库)并保持主备同步。
然而不同数据库在实现上面方案的细节上又不完全相同,导致实际效果并不完全一样,需要懂这个原理才能区
分。比如说MySQL自身有两套事务日志,即InnoDB的Redo日志和Server的Binlog日志。前者格式是记录数据
块的变化,后者格式是记录修改数据的SQL。前者记录未提交事务的日志(因为InnoDB有UNDO),而后者只记
录已提交的事务日志。所以MySQL实例宕机恢复时都有可能没办法保证两套事务日志完全一致,更不用说依赖
Binlog做主从同步。如果MySQL是依赖Binlog做主从同步并且Binlog有可能不立即落盘,那么这个同步方案就
不能绝对保证不丢数据。
ORACLE的主备同步是传输事务日志(记录物理块的变化),并且REDO都是及时落盘。所以ORACLE的宕机恢
复,主备切换只要顺利的话都是可以不丢数据。不过如果REDO日志有缺失的话就不能保证了。
所以需要一种机制保证事务日志的可靠性。仅仅在本机落盘成功并不算可靠,因为可能会因为硬件问题导致无
法获取盘上的事务日志。最可靠的方式是本机事务在提交的时候把事务日志在备库主机上也落盘成功,这种方
案叫强同步。ORACLE的最大保护模式的备库就是强同步。它有个弊端就是备库必须可用,否则主库也会拒绝提
供服务。所以ORACLE会建议至少配置两个最大保护模式的备库。这样只要有一个备库接收到主库的事务日志并
落盘成功主库的事务即可返回。MySQL仿照ORACLE提供了一个半同步的技术,但是它在备库都不可用的时候
会降级为异步同步而不是像ORACLE那样让主库拒绝服务。ORACLE认为在最大保护模式下数据一致性最重要,
宁可不要可用性。而MySQL则把可用性放在数据一致性前面。所以业务核心重要数据通常放在ORACLE比
MySQL上更可靠。即使ORACLE也提供最大可用和最大性能同步模式,也不会改变这点。
OceanBase的事务也遵循日志先行原理,事务日志简称CLog。OceanBase没有UNDO设计,CLog落盘只包含
要提交事务的日志,在事务提交环节CLog先落盘,OceanBase的数据修改不落盘(内存富余的情况下会在很长
一段时间内都不会落盘)。OceanBase的数据冗余至少是三副本,角色上划分为1个主副本2个备副本。事务提交
时,主副本的CLog除了自己落盘外还会同时发往其他两个备副本。跟ORACLE的最大保护机制不一样的时候,
OceanBase认为三个副本只要有一半以上成员将CLog落盘成功时这个事务就是可以提交的。所以有个极端案例
评论