Kafka有一个同步副本集的概念,这是一组节点不太落后于领导者。
如果网络进行了干净的分区,使得包含前导节点的少数节点位于一侧,而包含另一个同步节点的多数节点位于另一侧,会发生什么情况?
少数派/领导者可能认为它丢失了一堆节点,相应地减小了isr的大小,并愉快地继续进行。
对方可能认为自己失去了领袖,于是选了一个新的领袖,高兴地继续前进。
现在我们有两个领导者在同一个集群中,独立地接受写操作。在一个需要大多数节点在分区后继续的系统中,旧的领导者会下台并停止接受写操作。
Kafka在这种情况下会发生什么?更改isr集合是否需要多数票?如果是这样的话,在领导端检测到中断之前,是否有短暂的数据丢失?
2条答案
按热度按时间drnojrws1#
在Kafka集群中,一个经纪人被选为控制者。
除其他外,主计长负责选举新的领导人。副本管理部分简要介绍了这一点:http://kafka.apache.org/documentation/#design_replicamanagment
Kafka使用zookeeper来确保一次只有一个控制器。但是,您描述的情况仍然可能发生,将zookeeper集合(假设双方仍然可以拥有quorum)和kafka集群拆分为2,从而生成2个控制器。
在这种情况下,Kafka有许多配置来限制影响:
unclean.leader.election.enable
:false默认情况下,这用于防止不同步的副本成为前导。如果没有同步的可用副本,kafka会将分区标记为脱机,以防止数据丢失replication.factor
以及min.insync.replicas
:例如,如果您将它们分别设置为3和2,那么在“大脑分裂”的情况下,如果制作者使用acks=all
另请参阅kip-101,以获取有关在集群重新组合后处理发散的日志的详细信息。mftmpeh82#
我没有测试过这个,但我认为公认的答案是错误的,拉尔斯·弗兰克关于大脑分裂的可能性是正确的。
zookeeper quorum需要一个多数,所以如果zk集合分区,最多只有一方有一个quorum。
作为一个控制器,需要有一个与zk(临时znode注册)的活动会话。如果当前控制器被从zk quorum分区出去,它应该自动停止将自己视为控制器。这最多也得花点时间
zookeeper.session.timeout.ms = 6000
. 仍与zk quorum有联系的经纪人应在他们之间选举一名新的控制人(基于此:https://stackoverflow.com/a/52426734)作为主题分区的领导者还需要一个与zk的活动会话。与zk quorum失去联系的领导者应自愿停止成为其中之一。当选的控制员将检测到一些前任领导人失踪,并将从isr中的领导人中指派新的领导人,这些领导人仍然连接到zk仲裁。
现在,在zk超时窗口期间,分区的前领导者接收到的生产者请求会发生什么变化?有一些可能性。
如果制片人
acks = all
主题是什么min.insync.replicas = replication.factor
,则所有isr应具有完全相同的数据。前领导人最终将拒绝正在进行的写入,而制作人将重试。新当选的领导人不会丢失任何数据。另一方面,在分区恢复之前,它将无法提供任何写请求。它将由生产者决定拒绝客户端请求或继续在后台重试一段时间。否则,很有可能新的领导人将失去到
zookeeper.session.timeout.ms + replica.lag.time.max.ms = 16000
分区修复后,它们将从前领导人处被截断。假设您期望的网络分区比只读的要长。
像这样的方法可以奏效:
您有3个可用性区域,并且期望最多有1个区域与其他2个区域分开
在每个区域中,您都有一个zookeeper节点(或几个),因此两个区域的组合始终可以形成多数
在每个区域你都有一群Kafka经纪人
每个主题都有
replication.factor = 3
,每个可用区域中有一个副本,min.insync.replicas = 2
生产商acks = all
这样,网络分区的zk quorum端应该有两个kafka isr,其中至少有一个与前领导人完全同步。因此,经纪人没有数据丢失,并且可以从仍然能够连接到获胜方的任何生产商处写入数据。