Kafka学习之Replication tools之Preferred Replica Leader Election Tool

原文链接:https://cwiki.apache.org/confluence/display/KAFKA/Replication+tools#Replicationtools-2.PreferredReplicaLeaderElectionTool

这工具做了啥?

为了支持replication功能,每一个partition可以有多个replica。一个partition的replica列表称为"assigned replicas"。在这个列表中的第一个replica称为"preferred replica"。当创建topic/partitions时,Kafka要确保所有的topic的"preferred replica"要平均的分布在Kafka集群中。在理想的场景中,一个partition的leader应该是"preferred replica"。这保证了leadership带来的负载可以在整个集群中进行均衡。然而,如果有broker shutdown了(比如controlled shutdown,crash,机器故障)的话,那么leadership负载就不均衡了(imbalance)。此工具就是用来在整个集群中恢复leadership的均衡。下面是此工具的操作步骤:

1,此工具更新ZK的路径 "admin/preferred_replica_election",写入一个topic的partition的列表,说明哪些partition的leader需要进行变化。


2,controller对上面说的那个路径进行监听,当数据更新时进行触发,controller会从ZK中读取相应的数据。


3,对于每一个topic的partition,controller先获得preferred replica(就是assigned replicas列表中的第一个replica),如果这个preferred replica不是leader,controller则向preferred replica所在的那个broker发送一个请求,使之成为partition的leader。

注意此工具仅更新ZK上的对应路径上的数据并退出。controller则异步的把某个partition的leadershipi转移到preferred replica。

如何使用此工具?

bin/kafka-preferred-replica-election.sh --zookeeper localhost:12913/kafka 
--path-to-json-file topicPartitionList.json

其中--zookeeper是必填的,--path-to-json-file是可选的,此参数提供了内容为json的文件,其中包含了topic的partition列表。如果没有提供此参数,此工具查询ZK,并得到集群中的所有的topic的partition。此工具在更新ZK路径"/admin/preferred_replica_election"之后就退出了。下面是一个json文件的例子:

{
 "partitions":
  [
    {"topic": "topic1", "partition": "0"},
    {"topic": "topic1", "partition": "1"},
    {"topic": "topic1", "partition": "2"},
 
    {"topic": "topic2", "partition": "0"},
    {"topic": "topic2", "partition": "1"},
  ]
}

FAQ

如果preferred replica不在ISR中会发生什么?

如果preferred replica不在ISR中,controller转移leadership的时会失败。这会确保不会造成数据丢失。当之后又重新出现在in-sync中,那么此工具会再一次运行把leadership转移给它。

在运行此工具后,如果确认所有的partition的leadership成功转移到preferred replica

ListTopicCommand是一个很好的工具,提供了集群中的所有topic的一个overview。对于每一个topic的partition,显示了该partition的leader,assigned replicas,和当前的in-sync replica集合。如果leader和assigned replica的第一个replica一致,那么此工具执行成功,否则,可能必须重新运行一次。

猜你喜欢

转载自damacheng009.iteye.com/blog/2088350