CAP

在任意的分布式系统中,最多只能同时满足两个:Consistency、Availability、Partition-tolerance

Consistency

image-20241116174059552

  1. Consistency 指的是 Linearizability Consistency
  2. 在 Linearizability Consistency 的保证下,所有分布式环境下的操作都像在单机上一样
  3. 所有节点的状态一直是一致的

Availability

image-20241116175420454

  1. 在分布式系统中,任意非故障的节点都必须对客户的请求产生响应
  2. 当系统满足 Availability 时,除非所有节点全部崩溃,不然都能返回消息 - Netflix Eureka

Partition Tolerance

image-20241116175709307

  1. 在一个分布式系统中,如果出现了一些故障,可能会使得部分节点之间无法连通
  2. 由于故障节点无法连通,造成整个网络会被分成几块区域
    • 从而使数据分散在这些无法连通的区域中的情况,从而发生了分区错误
  3. 如上图,如果需要的数据只在 Sever A 中,当出现分区错误时,无法获取到数据
    • 如果能分区容错,既即便出现这种情况,分布式系统也能容忍,并能返回消息
  4. Partition-tolerance
    • 分布式系统允许网络丢失从一个节点发送到另一个节点的任意多条消息
  5. 在现代网络通信中,节点故障或者网络丢包会经常发生
    • 如果没有 Partition-tolerance,即分布式系统不允许这些节点间的通信出现任何错误
    • 如果不接受 Partition-tolerance,很多系统都无法正常工作了

Netflix Eureka 为 AP 系统,并支持最终一致性,并非论文中的线性一致性

AP vs CP

在大部分情况下,分布式系统的设计都会保留 P,而在 C 和 A 中二选一

Type Distributed system
CP Google BigTable、Hbase、MongoDB、Redis、MemCacheDB
AP Amazon Dynamo、Apache Cassandra、Netflix Eureka
CA Apache Kafka

Kafka Replication

CA

  1. Kafka Replication 通过将数据复制到不同的节点上,从而增强了数据在系统中的持久性(Durability)和可用性(Availability)
  2. 在 Kafka Replication 的系统设计中,所有的数据日志存储是在同一个数据中心中 - 在同一个数据中心出现网络分区的概率非常低

架构设计

  1. 先通过 Zookeeper 选举出一个 Leader
  2. 该 Leader 负责维护一组被称为同步数据副本(In-sync-replica)的节点,所有的数据写入都必须在这个 Leader 中记录 - ZAB 协议

三台服务 - Leader + Replication1 + Replication2

image-20241116182320378

出现网络分区 - Leader 与 Replication1 无法通讯

image-20241116182506593

所有副本都无法通讯,Apache Kafka 允许只有 Leader 在工作

image-20241116182634959

如果 Leader 挂了,则 Zookeeper 会重新选举