Kafka学习之Replication tools之controlled shutdown

原文地址:https://cwiki.apache.org/confluence/display/KAFKA/Replication+tools#Replicationtools-1.ControlledShutdown

controlled shutdown是啥意思?

在0.8版本中,每一个partition可以有多个replica。这些replica分布在多个broker上,提供了高可用。在任意的时间点上,只有一个replica可以提供读和写服务。换句话说,只有一个replica可以充当leader的角色。当一个broker需要关闭时(如果需要升级版本,改变配置参数时需要关闭),那么需要把当前broker上提供服务的leader partition迁移到其他同步中(in-sync)的replica上,这就是controlled shutdown工具的作用。

总的来说,它会减少不可用的时间窗口。如果我们简单的关闭一个broker而没有controlled shutdown的话,该broker上的leader partition就会不可用,直到选出一个新的leader。然后我们会顺序的每次选出一个partition作为leader,这个操作对ZK进行读写,选出所有的leader会花掉一些时间,特别是当有很多partition的时候。做一次controlled shutdown允许我们主动的转移leader,以此来减少不可用的时间窗口,有两种方法可以做到这一点。

第一种方法是在broker的配置文件中设置controlled.shutdown.enable。这样在broker关闭之前会尝试转移自己的leader到其他的broker上。还可以设置controlled.shutdown.max.retries和controlled.shutdown.retry.backoff.ms来控制在执行过程中的最大耗费时间和重试次数。

第二种方法是运行一个命令行工具。

下面是这个工具的工作步骤的汇总:

1,找到controller所在的broker的jmx端口。

2,使用要shutdown的broker的端口,向controller发出一个shutdown命令。
3,controller找到broker上当前的leader partition。
4,对于每一个leader partition,controller找到其他broker上的in-sync replica,并在其中选出一个作为leader。
5,如果不能选出leader,那么shutdown失败。
6,命令行工具等待controller的响应。如果发现shutdown不成功,就会重试(可配置)并最终基于controller的响应成功或失败。

注意这个工具仅仅把leadership转移到其他的可用的broker上。它并不会terminate当前的broker。你需要手动的关闭它。

如何使用?

bin/kafka-run- class .sh kafka.admin.ShutdownBroker --zookeeper localhost: 12913 /kafka --broker #brokerId# --num.retries 3 --retry.interval.ms 60

此工具接收一个zookeeper host列表的参数(如果有namespace的话需要包括进去)和想要shutdown的broker id,这两个是必填参数。另外还有一个可选的重试次数和重试之间的时间间隔的设置。如果controller进行shutdown失败,在指定的间隔后会重试。

FAQ

当ack为0时,此工具如何工作?

当一个partition的leadership改变时,当client(producer和consumer)还在对老的leader进行生产,消费,或者等待一个响应时会得到一个错误,client然后会从ZK刷新partition的元数据,并获得partition的新的leader,然后重试。但当producer client设置ack=0的话就不会这样做,这是因为producer不会等待响应结果,也就不知道leadership改变。client会end up loosing messages直到shutdown的broker重新跑起来。

当一个partition的in-sync集合中没有其他的replica时会发生什么?

When a partition does not have any other replicas that are in the "in-sync" set, the tool fails to shutdown the broker. This is to ensure that we do not have an unclean leader election (choosing a replica that is outside the "in-sync" set) and thereby causing data loss. 当这种情况发生时,此工具的shutdown会失败。因为要保证不会出现一个unclean的leader选举(选择一个不再in-sync集合的replica),因为会导致数据丢失。

猜你喜欢

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