分区容忍性:依旧先看分区容忍性,主从结构的数据库存在节点之间的通信,他们之间需要通过心跳来保证只有一个 Master。
然而一旦发生分区,每个分区会自己选取一个新的 Master,这样就出现了脑裂,常见的主从数据库(MySQL,Oracle 等)并没有自带解决脑裂的方案。所以分区容忍性是没考虑的。
一致性:不考虑分区,由于任意时刻只有一个主库,所以一致性是满足的。
可用性:不考虑分区,HA 机制的存在可以保证可用性,所以可用性显然也是满足的。
蚂蚁单元化 LDC 架构 CAP 分析
①战胜分区容忍性
在讨论蚂蚁 LDC 架构的 CAP 之前,我们再来想想分区容忍性有啥值得一提的,为啥很多大名鼎鼎的 BASE(最终一致性)体系系统都选择损失实时一致性,而不是丢弃分区容忍性呢?
②OceanBase 的 CAP 分析
上文提到过,单元化架构中的成千山万的应用就像是计算器,本身无 CAP 限制,其 CAP 限制下沉到了其数据库层,也就是蚂蚁自研的分布式数据库 OceanBase(本节简称 OB)。
这时候发生了分区(比如 A 网络断开了),我们将单元 A 对数据段 [0,9] 的写入权限转交给单元 B(更改映射),马老师这次写对了,为 Jack Ma。
而在网络断开前请求已经进入了 A,写权限转交给单元 B 生效后,A 和 B 同时对 [0,9] 数据段进行写入马老师的英文名。
假如这时候都允许写入的话就会出现不一致,A 单元说我看到马老师设置了 Jason Ma,B 单元说我看到马老师设置了 Jack Ma。
然而这种情况不会发生的,A 提议说我建议把马老师的英文名设置为 Jason Ma 时,发现没人回应它。
同样的,B 提出了将马老师的英文名改成 Jack Ma 后,大部分节点都响应了,所以 B 成功将 Jack Ma 写入了马老师的账号记录。
假如在写权限转交给单元 B 后 A 突然恢复了,也没关系,两笔写请求同时要求获得 (N/2)+1 个节点的事务锁,通过 no-wait 设计,在 B 获得了锁之后,其他争抢该锁的事务都会因为失败而回滚。
分区容忍性:OB 节点之间是有互相通信的(需要相互同步数据),所以存在分区问题,OB 通过仅同步到部分节点来保证可用性。这一点就说明 OB 做了分区容错。
可用性分区容忍性:OB 事务只需要同步到 (N/2)+1 个节点,允许其余的一小半节点分区(宕机、断网等),只要 (N/2)+1 个节点活着就是可用的。
极端情况下,比如 5 个节点分成 3 份(2:2:1),那就确实不可用了,只是这种情况概率比较低。
一致性分区容忍性:分区情况下意味着部分节点失联了,一致性显然是不满足的。但通过共识算法可以保证当下只有一个值是合法的,并且最终会通过节点间的同步达到最终一致性。
# 结语
基于用户分库分表的 RZone 设计。每个用户群独占一个单元给整个系统的容量带来了爆发式增长。
RZone 在网络分区或灾备切换时 OB 的防脑裂设计(PAXOS)。我们知道 RZone 是单脑的(读写都在一个单元对应的库),而网络分区或者灾备时热切换过程中可能会产生多个脑,OB 解决了脑裂情况下的共识问题(PAXOS 算法)。
基于 CZone 的本地读设计。这一点保证了很大一部分有着“写读时间差”现象的公共数据能被高速本地访问。
剩下的那一丢丢不能本地访问只能实时访问 GZone 的公共配置数据,也兴不起什么风,作不了什么浪。
比如用户创建这种 TPS,不会高到哪里去。再比如对于实时库存数据,可以通过“页面展示查询走应用层缓存”+“实际下单时再校验”的方式减少其 GZone 调用量。
参考文献:
Practice of Cloud System Administration, The: DevOps and SRE Practices for Web Services, Volume 2. Thomas A. Limoncelli, Strata R. Chalup, Christina J. Hogan.
MySQL 5.7 半同步复制技术
https://www.cnblogs.com/zero-gg/p/9057092.html
BASE 理论分析
https://www.jianshu.com/p/f6157118e54b
Keepalived
https://baike.baidu.com/item/Keepalived/10346758?fr=aladdin
PAXOS
https://en.wikipedia.org/wiki/Paxos_(computer_science)
OceanBase 支撑 2135 亿成交额背后的技术原理
https://www.cnblogs.com/antfin/articles/10299396.html
Backup
https://en.wikipedia.org/wiki/Backup