Kafka命令详解

914 阅读8分钟

主题操作

创建主题

三个必填参数:

  • 主题名字
  • 复制系数
  • 分区

运行命令:

bin/kafka-topics.sh --bootstrap-server 10.3.250.19:9092,103.250.31:9092,10.3.250.32:9092  --create --topic something --replication-factor 3 --partitions 9

增加分区

目的:

  • 增加空间
  • 降低单个分区的吞吐量

运行命令:

bin/kafka-topics.sh --alter --bootstrap-server node1:9092,node2:9092,node3:9092 --topic something --partitions 18

删除主题

目的:

  • 释放空间和资源

tips

如果delete.topic.enable设置为true的时候,删除主题会被忽略

运行命令:

bin/kafka-topics.sh --delete --bootstrap-server node1:9092,node2:9092,node3:9092 --topic something

列出集群里的所有主题

运行命令:

bin/kafka-consumer-groups.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --list

列出主题详细信息

运行命令:

bin/kafka-consumer-groups.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --describe --group connect-dump-kafka-config

显示结果:

Consumer group 'connect-dump-kafka-config' has no active members.

GROUP                     TOPIC              PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID     HOST            CLIENT-ID
connect-dump-kafka-config kafka-config-topic 0          136             136             0               -               -               -


消费者群组

信息存在broker上面,可以使用kafka-consumer-groups.sh列出消费者组群

列出并描述组群

使用--list显示组群

bin/kafka-consumer-groups.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --list
 

显示返回

connect-dump-kafka-config

使用--describe代替--list,并且添加--group可以查看详细信息

bin/kafka-consumer-groups.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --describe --group connect-dump-kafka-config

返回

Consumer group 'connect-dump-kafka-config' has no active members.

GROUP                     TOPIC              PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID     HOST            CLIENT-ID
connect-dump-kafka-config kafka-config-topic 0          136             136             0               -               -               -

字段说明:

字段描述
GROUP消费者群组的名字
TOPIC正在被读取的主题名字
PARTITION正在被读取的分区ID
CURRENT-OFFSET消费者群组最近提交的偏移量,也就是消费者在分区里读取的当前位置
LOG-END-OFFSET当前高水位偏移量,也就是最近一个被读取消息的偏移量,同时也是最近一个被提 交到集群的偏移量
LAG消费者的 CURRENT-OFFSET 和 broker 的 LOG-END-OFFSET 之间的差距

OWNER|消费者群组里正在读取该分区的消费者。这是一个消费者的 ID,不一定包含消费 者的主机名

删除群组

旧版的kafka消费者客户端才支持删除群组的操作。 如果要删除群组,必须要关闭所有正在执行的消费者

偏移量管理

  • 显示消费者群组的偏移量
  • 删除
  • 获取

导出偏移量

倒入偏移量

主要倒入的时候需要关闭所有的消费者

动态配置变更

覆盖主题的默认配置

主题的参数可以进行单独的设置。大部分都有broker级别的默认值。

--entity-type topics

覆盖客户端的默认配置

对于客户端来说,只能覆盖身缠着的配额和消费者的配额参数

-- entity-type clients

列出被覆盖的配置

--describe 命令

移除被覆盖的配置

动态配置可以删除,这样就可以恢复到集群的默认配置

--delete-config 命令

分区管理

  • 重新选举首领
  • 将分区分配给broker

首选的首领选举

副本清单里面的第一个分区会成为首领,但是重启broker之后,并不会自动恢复原先首领的 身份

命令:

bin/kafka-leader-election.sh  --bootstrap-server node1:9092,node2:9092,node3:9092 --election-type PREFERRED --topic something --partition 1

结果:

Valid replica already elected for partitions

也可以使用json文件来进行选举

{
    "partitions": [
        {
         "partition": 1,
         "topic": "foo"
        },
        {
         "partition": 2,
         "topic": "foobar"
        }
    ] 
}

之后添加--path-to-json-file和指定的json文件就行

修改分区副本

使用场景

  • 集群分布不均衡
  • broker离线造成了分区不同步
  • 新加入的分区需要获取负载

使用工具kafka-reassign-partitions.sh修改分区

步骤

  1. 根据broker清单和主题清单生成一组迁移步骤
  2. 执行
  3. 校验

执行命令

bin/kafka-reassign-partitions.sh --zookeeper zoo1.example.com:2181/kafka-cluster --generate --topics-to-move-json-file topics.json --broker-list 0,1
 

修改复制系数

通过使用json对象来完成,显示指定所需的副本数量。集群将完成重新分配过程,并使用新的复制系数

转储日志片段

可以使用工具来解码分区的日支片段

运行命令:

kafka_2.13-2.8.0]$ bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files /tmp/kafka-logs/kafka-config-topic-0/00000000000000000000.log

结果:

Dumping /tmp/kafka-logs/kafka-config-topic-0/00000000000000000000.log
Starting offset: 0
baseOffset: 0 lastOffset: 29 count: 30 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 0 CreateTime: 1621594901966 size: 3407 magic: 2 compresscodec: NONE crc: 1872302228 isvalid: true
baseOffset: 30 lastOffset: 69 count: 40 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 3407 CreateTime: 1621594901966 size: 4426 magic: 2 compresscodec: NONE crc: 2260083211 isvalid: true
baseOffset: 70 lastOffset: 135 count: 66 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 7833 CreateTime: 1621594901967 size: 8153 magic: 2 compresscodec: NONE crc: 2699350932 isvalid: true

这个工具同时可以验证日支片段的索引文件是否损坏

副本验证

使用kafka-replica-verification.sh验证集群分区副本的一致性。

这里需要在--topic-white-list使用正则表达式。

运行命令:

bin/kafka-replica-verification.sh --broker-list node1:9092,node2:9092,node3:9092 --topic-white-list 'something*'

结果:

2021-05-24 14:18:00,600: verification process is started.
2021-05-24 14:18:30,515: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:19:00,804: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:19:30,911: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:20:01,021: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:20:31,134: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:21:01,226: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:21:31,314: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:22:01,401: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:22:31,477: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:23:01,565: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:23:31,650: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:24:01,728: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:24:31,802: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:25:01,870: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:25:31,945: max lag is 0 for partition something-7 at offset 0 among 18 partitions
2021-05-24 14:26:02,533: max lag is 0 for partition something-7 at offset 0 among 18 partitions

消费和生产

kafka-console-consumer.shkafka-console-producer.sh这两个工具包装了java客户端

控制台消费者

kafka-console-consumer.sh工具提供了从一个或多个主题上读取消息的方法。

从头开始读取消息:

bin/kafka-console-consumer.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --topic something --from-beginning

控制生产者

kafka-console-producer.sh工具提供了向Kafka写入消息

通过命令生产消息:

bin/kafka-console-producer.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --topic something

客户端acl

使用kafka-acls.sh工具可以控制客户端访问控制

不安全操作

移动集群控制器

将控制器从一个broker迁移到另一个broker上

取消分区重分配

分区重分配流程:

  1. 发起重分配请求
  2. 集群控制器将分区添加到broker上
  3. 新的broker开始复制分区,知道副本达到同步状态
  4. 集群控制器从分区副本清单中移除就的broker

由于是并行执行,可能存在故障导致无法重启

移除一个进行中的分区重分配任务的步骤:

  1. 从zookeeper上删除admin/reassign_partitions节点
  2. 重新选举控制器

移除待删除的主题

如果集群没有启用主题删除功能,那么命令行工具发起的请求会一直被挂起。不过这种挂起请求是可以被移除的

主题的删除是通过在 /admin/delete_topic 节点下创建一个以待删除主题名字命名的子节 点来实现的。

手动删除主题

要求在线下关闭集群里所有的 broker

  1. 关闭集群里所有的 broker。
  2. 删除 Zookeeper路径/brokers/topics/TOPICNAME,注意要先删除节点下的子节点。
  3. 删除每个 broker 的分区目录,这些目录的名字可能是TOPICNAME-NUM,其中NUM是指分区的ID。
  4. 重启所有的 broker。