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