副本
副本(replication)策略

ISR
在
- 一是它必须维护与
ZooKeeper 的session (这个通过ZooKeeper 的Heartbeat 机制来实现) 。 - 二是
Follower 必须能够及时将Leader 的消息复制过来,不能“落后太多”。
数据可靠性
- 消息所在
partition 的ISR replicas 会定时异步从leader 上批量复制数据log - 当所有
ISR replica 都返回ack ,告诉leader 该消息已经写log 成功后,leader 认为该消息committed ,并告诉Producer 生产成功。这里和以上”alive”条件的第二点是不矛盾的,因为leader 有超时机制,leader 等ISR 的follower 复制数据,如果一定时间不返回ack (可能数据复制进度落后太多) ,则leader 将该follower replica 从ISR 中剔除。 - 一旦
Leader 收到了ISR 中的所有Replica 的ACK ,该消息就被认为已经commit 了,Leader 将增加HW 并且向Producer 发送ACK 。HW( 高水位) 是Consumer 能够看到的此partition 的位置,LEO 是每个partition 的log 最后一条Message 的位置。HW 能保证leader 所在的broker 失效,该消息仍然可以从新选举的leader 中获取,不会造成消息丢失。

对于
- 1(默认
) :这意味着producer 在ISR 中的leader 已成功收到的数据并得到确认后发送下一条message 。如果leader 宕机了,则会丢失数据。 - 0:这意味着
producer 无需等待来自broker 的确认而继续发送下一批消息。这种情况下数据传输效率最高,但是数据可靠性确是最低的。 - -1:
producer 需要等待ISR 中的所有follower 都确认接收到数据后才算一次发送完成,可靠性最高。但是这样也不能保证数据不丢失,比如当ISR 中只有leader 时( 其他节点都和zk 断开连接,或者都没追上) ,这样就变成了acks=1 的情况。
副本放置策略
为了更好的做负载均衡,
- 将所有存活的
N 个Brokers 和待分配的Partition 排序 - 将第
i 个Partition 分配到第(i mod n) 个Broker 上,这个Partition 的第一个Replica 存在于这个分配的Broker 上,并且会作为partition 的优先副本 - 将第
i 个Partition 的第j 个Replica 分配到第((i + j) mod n) 个Broker 上
假设集群一共有

服务可用性
Leader 选举
Kafka 在Zookeeper 存储partition 的ISR 信息,并且能动态调整ISR 列表的成员,只有ISR 里的成员replica 才会被选为leader ,并且ISR 所有的replica 都有可能成为leader ;Leader 节点宕机后,Zookeeper 能监控发现,并由broker 的controller 节点从ISR 中选举出新的leader ,并通知ISR 内的所有broker 节点。
- 节点名称唯一性:多个客户端创建一个节点,只有成功创建节点的客户端才能获得锁
- 临时顺序节点:所有客户端在某个目录下创建自己的临时顺序节点,只有序号最小的才获得锁
容灾和数据一致性
分布式系统的容灾能力,跟其本身针对数据一致性考虑所选择的算法有关,例如,
ISR 机制能容忍更多的节点失败。假如replica 节点有2f+1 个,每个partition 最多能容忍2f 个失败,且不丢失消息数据;但相对Majority Vote 选举算法,只能最多容忍f 个失败。- 在消息
committed 持久化上,ISR 需要等2f 个节点返回ack ,但Majority Vote 只需等f+1 个节点返回ack ,且不依赖处理最慢的follower 节点,因此Majority Vote 有优势 ISR 机制能节省更多replica 节点数。例如,要保证f 个节点可用,ISR 方式至少要f 个节点,而Majority Vote 至少需要2f+1 个节点。
如果所有
- 等
ISR 任一节点恢复,并选举为leader ; - 选择第一个恢复的节点(不一定是
ISR 中的节点)为leader
第一种方式消息不会丢失(只能说这种方式最有可能不丢而已

如图所示,一开始
因此,为了减少数据丢失的概率,可以设置