要想kafka跑的好,如下几点要知晓。
Graceful shutdown
建议开启如下参数:
controlled.shutdown.enable=true
注意:
只有在broker上承载的分区都具有副本时(副本大于1,且副本存活),controller节点才会成功关闭
Balancing leadership
每当Broker停止或崩溃时,该broker的分区的领导权就转移到其他副本。
这意味着,默认情况下,当broker重新启动时,它将只是所有分区的关注者,这意味着它不会用于客户端读写,这对于整个集群来说吞吐会受到1/N的降低(N表示集群节点数)
为了避免这种不平衡,kafka提供了一种优先副本的概念preferred replicas
.
如果一个分区的副本列表是1、5、9,那么节点1比节点5或节点9更适合作为leader,因为它位于副本列表的前面。
可以使用如下命令来恢复已恢复副本的领导权:
# 老版本工具
bin/kafka-preferred-replica-election.sh --zookeeper zk_host:port/chroot
# 新版本工具
当然每次在服务器启动后执行该操作,可能很无聊,因此可以设置如下参数来自动执行:
auto.leader.rebalance.enable=true
Balancing Replicas Across Racks
机架层面的副本均衡。
机架感知特性将相同分区的副本分散到不同的机架上,这扩展了Kafka为broker失败提供的覆盖机架失败的保证,如果机架上的所有broker同时失败,就限制了数据丢失的风险。
该特性还可以应用于其他broker分组,如EC2中的可用性区域。
您可以通过向broker配置添加属性来指定broker属于特定的机架:
broker.rack=my-rack-id
当创建、修改或重新分发一个主题时,将遵循机架约束,确保副本尽可能多地跨越多个机架(一个分区将跨越最小(#机架,复制因子)不同的机架)。
用于将副本副本分配给broker的算法,会确保每个broker的leader数量是恒定的,而不管broker是如何分布在机架上的。这确保了平衡的吞吐量。
注意:
明智的做法是为每个机架配置相同数量的broker
Mirroring data between clusters
我们将在Kafka集群之间复制数据的过程称为“镜像”,以避免与单个集群中节点之间的复制混淆。
Kafka附带一个用于在Kafka集群之间镜像数据的工具,即MirrorMaker
,该工具可以从源集群进行消费,并生产到目标集群。
常用的场景就是在另外一个数据中心提供副本。
您可以运行许多这样的镜像进程来提高吞吐量和容错能力。
使用mirrormaker进行迁移topic到另外的集群:
bin/kafka-mirror-maker.sh
--consumer.config consumer.properties
--producer.config producer.properties --whitelist my-topic
需要注意,我们必须使用--whitelist
参数指定topic,该参数支持java的正则表达式结构,比如--whitelist 'A|B'
,或者--whitelist '*'
.
通常在使用kafka-mirror-maker时,建议配合auto.create.topics.enable=true
使用,可以大批量的进行topic迁移。
Checking consumer position
检查消费者的位移,有时候了解消费者当前的位置时很有必要的。
kafka有一个工具,它将显示所有消费者在一个消费者组中的位置,以及他们与日志结束的距离
# 在my-group的消费者上消费my-topic的主题
# 可以查看整个消费者组的消费情况
$ bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group my-group
Managing Consumer Groups
ConsumerGroupCommand工具可以list, describe, or delete
一个消费组,消费者组可以手动删除,也可以在该组最后提交的偏移量过期时自动删除。
只有在组中没有任何活动成员时,手动删除才有效。
如下命令可以列出所有主题的所有消费者组:
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list
查看指定消费者组
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group my-group
当然可用试用一些额外的参数来查看更多的消费者信息:
- --members: 查看消费者组中活跃的消费者
- --members --verbose: 该参数还可以查看分配给每个成员的分区
- --offsets: 该参数实际上可以被
--describe
参数中的内容覆盖掉 - --state: 该参数可以提供组级别的信息
- --delete: 该参数可以手动删除一个或多个消费者组
- -reset-offsets: 该参数用于重置消费者组的偏移量,此选项在同一时间支持一个消费者组,同时需要使用
--all-topics或--topic
指定范围
# 查看消费者组成员
$ bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group my-group --members
CONSUMER-ID HOST CLIENT-ID #PARTITIONS
consumer1-3fc8d6f1-581a-4472-bdf3-3515b4aee8c1 /127.0.0.1 consumer1 2
consumer4-117fe4d3-c6c1-4178-8ee9-eb4a3954bee0 /127.0.0.1 consumer4 1
consumer2-e76ea8c3-5d30-4299-9005-47eb41f3d3c4 /127.0.0.1 consumer2 3
consumer3-ecea43e4-1f01-479f-8349-f9130b75d