https://www.51cto.com/article/649412.html
Base#
CAP#
一致性
可用性
分区容错性
CA:
Mysql/Oracle/PostgresQL(强调数据的一致性完整性)、RabbitMQ(保证消息传递的顺序和可靠性)
AP:
Redis(提供极高的性能和低延迟)、Kafka(注重高吞吐量和低延迟,快速响应请求)、MongoDB、Cassandra、Elasticsearch
CP:
ETCD(强调数据一致性和分区运行)、Zookeeper、Consul、HBase
在一个分布式系统中,当网络分区发生时,必须在一致性(C)和可用性(A)之间做出权衡:
• **如果选择一致性(C)**:系统将确保所有节点的数据是一致的,但可能会牺牲部分可用性。即,在网络分区时,系统可能会拒绝某些操作,以保证数据一致性。
• **如果选择可用性(A)**:系统将保证每个请求都能得到响应,但可能会牺牲部分一致性。即,在网络分区时,不同节点的数据可能会出现不一致。在分布式系统中,当网络分区发生时,为什么必须权衡一致性和可用性?#
网络分区的影响
网络分区是指系统中的节点由于网络故障而无法互相通信。分区可能导致系统被分成多个孤立的子集,各子集内的节点之间仍能通信,但子集之间无法通信。
一致性 vs 可用性
1. **一致性(Consistency)**:一致性意味着所有节点在同一时间看到的数据是相同的。任何对数据的写操作都必须在所有节点上同步完成后,才能返回成功。
2. **可用性(Availability)**:可用性意味着系统中的每个请求都能收到响应,无论请求涉及哪个节点。权衡的原因
保证一致性,牺牲可用性
当网络分区发生时,如果我们选择保证一致性,这意味着系统必须确保所有节点的数据保持一致。因此,当某个子集的节点无法与其他子集通信时,系统必须拒绝对数据的更新请求,因为无法保证数据在所有节点之间的一致性。这会导致系统的部分或全部功能不可用,直到网络分区问题解决。这种情况下:
• **优势**:数据在所有节点之间保持一致。
• **劣势**:在网络分区期间,系统可能无法处理更新请求,从而降低了可用性。示例:传统的关系型数据库系统(如 MySQL 在严格模式下)可能会拒绝在网络分区期间的写操作,以确保数据一致性。
保证可用性,牺牲一致性
当网络分区发生时,如果我们选择保证可用性,这意味着系统会继续处理请求,即使不同节点的数据可能不一致。这种策略允许系统在网络分区期间继续提供服务,但会导致数据在不同节点之间的状态不同。这种情况下:
• **优势**:系统在网络分区期间仍然可用,能够处理读写请求。
• **劣势**:数据可能在不同节点之间出现不一致。示例:像 Cassandra、DynamoDB 这样的分布式数据库会在网络分区期间继续处理请求,允许数据在不同节点之间暂时不一致,然后通过后续的同步过程来达到最终一致性。