【问题标题】:CAP Theorm - Why Mysql is CACAP 定理 - 为什么 Mysql 是 CA
【发布时间】:2021-02-11 04:06:40
【问题描述】:
根据 CAP
一致性 - 所有节点给出相同的数据
可用性意味着即使一个节点在
集群宕机了。
分区容错意味着集群即使在
如果两个节点之间存在“分区”(通信中断)
(两个节点都已启动,但无法通信)。
但是Mysql默认行为是主从还是主主。
所以,主从
- 没有一致性,因为可能会发生从站滞后,因此从从站读取的数据不一致。
- 没有可用性,因为没有 DBA 干预,从属设备无法成为主设备。
所以,大师大师
- 没有一致性,因为可能会发生从站滞后,因此从从站读取的数据不一致。
- 没有可用性,因为没有 DBA 干预,slave/other-master 无法成为 master。
- 它的部分容错性,因为在网络故障的情况下两者都可以正常工作。
我错过了什么吗?
【问题讨论】:
-
阅读 PACELC 定理可能会有所帮助,因为 CAP 经常令人困惑。
标签:
mysql
system-design
cap
【解决方案1】:
MySQL 数据库引擎在引入节点以平衡集群设计的帮助下达到 CAP 定理。
因此,当您有两 (2) 个节点时,如果两台服务器之间存在网络问题,则集群将分成 2 个分区。并且每一个都将拥有总成员数量的 50% (1/2)。这就是为什么没有一个分区将达到法定人数并且没有一个分区允许查询。因此,要获得完整的分区容差,集群设计至少需要添加第三个节点,这样您的数据库才能达到分区容差以应对一次故障。
因此,即使两个节点之间的“分区”(通信中断)(两个节点都已启动,但无法通信),因为一个分区仍有仲裁(2/3 = 66%,大于 50%)。
【解决方案2】:
第一点是 CAP 定理适用于分布式数据库,应该按照这些术语来阅读。
现在来到 CAP 定理,根据 Wikipedia:
-
一致性:每次读取都会收到最近的写入或错误
-
可用性:每个请求都会收到一个(非错误)响应,但不能保证它包含最近的写入
-
分区容错:尽管节点之间的网络丢弃(或延迟)任意数量的消息,系统仍继续运行。
所以当你说MySql默认行为是主从,那么它意味着master和slave节点只是主节点和辅助节点,并且一次只有单个节点,即主节点用于处理任何用户请求。因此,Partition Tolerance 在这里已经被妥协了。
但是数据库仍然是一致的,因为所有的请求(读/写)都会去主节点,用户会一直得到相同的一致数据。
并且数据库是可用的,因为所有请求都会收到响应,因为所有请求都会到达同一个主节点。
因此默认情况下CA数据库中的Mysql。从属滞后不会影响一致性或可用性。
MySql 还有另一种可能性,通过一些配置调整可以使其成为CP 数据库,并且可用性 需要受到影响。这将是一种分布式的多个主节点,并通过它们之间的网络保持同步。在这种情况下,如果其中任何一个网络或分区中断,则首选一致性,这意味着所有读取请求将获得相同的数据,不会损坏,因为可用性写请求的 /em> 被破坏。