主题操作
创建主题
三个必填参数:
- 主题名字
- 复制系数
- 分区
运行命令:
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修改分区
步骤
- 根据broker清单和主题清单生成一组迁移步骤
- 执行
- 校验
执行命令
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.sh和kafka-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上
取消分区重分配
分区重分配流程:
- 发起重分配请求
- 集群控制器将分区添加到broker上
- 新的broker开始复制分区,知道副本达到同步状态
- 集群控制器从分区副本清单中移除就的broker
由于是并行执行,可能存在故障导致无法重启
移除一个进行中的分区重分配任务的步骤:
- 从zookeeper上删除
admin/reassign_partitions节点 - 重新选举控制器
移除待删除的主题
如果集群没有启用主题删除功能,那么命令行工具发起的请求会一直被挂起。不过这种挂起请求是可以被移除的
主题的删除是通过在 /admin/delete_topic 节点下创建一个以待删除主题名字命名的子节 点来实现的。
手动删除主题
要求在线下关闭集群里所有的 broker
- 关闭集群里所有的 broker。
- 删除 Zookeeper路径
/brokers/topics/TOPICNAME,注意要先删除节点下的子节点。 - 删除每个 broker 的分区目录,这些目录的名字可能是
TOPICNAME-NUM,其中NUM是指分区的ID。 - 重启所有的 broker。