1. Introduction
-
当partition leader不再可用,将选择其中一个ISR作为新的leader,此次leader
election是clean,因它保证提交的数据不会丢失,按定义,所有ISR上都存在提交的数据; -
但当除刚刚不可用的leader外,没ISR时该咋办?
-
等待ISR重新联机,这是默认行为,但这可能面临让主题不可用的风险;
-
启用unclean.leader.election.enable=true,并开始对非ISR进行producing,
当replica(复制副本)不同步时,将丢失所有写入旧leader的消息,还会导致消费者出现不一致;
2. Trade Off
-
若允许不同步的副本(out-of-sync replica)成为leader,将出现数据丢失和数据不一致;
-
若不允许他们成为leader,将面临更低的可用性,因必须等待原leader变为可用,然后分区才能恢复在线;
-
这是非常危险的设置,在启用它前必须充分理解其含义,对初学者,建议将其保留为默认值false;
-
但可为某些用例启用此配置,包括度量收集、日志收集,及在某种程度上可接受数据丢失时,以牺牲可用性为代价;
3. Setting
-
为主题设置unclean.leader.election.enable=true;
./kafka-configs.sh \
--bootstrap-server 192.168.0.123:9092 \
--alter --entity-type topics --entity-name product-price \
--add-config unclean.leader.election.enable=true
./kafka-configs.sh \
--bootstrap-server 192.168.0.123:9092 \
--alter --entity-type topics --entity-name product-price \
--delete-config unclean.leader.election.enable