文章目录
通过 shell 操作 kafka
单节点操作
创建主题
创建 test 主题, 可以手动创建, 也可以配置为生产者自动创建
- –zookeeper 192.168.2.121:2181/kafka, kafka集群使用的zookeeper地址(集群时用逗号分隔). 需要注意的是, 如果kafka配置server.properties中, 配置项 zookeeper.connect 指定了kafka集群在zookeeper集群中的根目录(如"/kafka"), 则创建主题时指定zookeeper地址需要与之对应, 不然会报类似 “Error while executing topic command : Replication factor: 1 larger than available brokers: 0.” 这样的错误
- –partitions 1: 主题分区个数, 单broker时, 分区在一个broker上, 多broker时, 一个或多个分区可能会分散在不同的broker上
- –replication-factor 1: 分区副本因子, 即分区副本个数, 分区有leader和follower, 都是分区的副本, 如果分区副本因子值为1, 即只有master副本, 没有follower副本
# 创建1分区1副本的主题
bin/kafka-topics.sh --create --zookeeper 192.168.2.121:2181/kafka --partitions 1 --replication-factor 1 --topic test-1-
# 创建2分区1副本的主题
bin/kafka-topics.sh --create --zookeeper 192.168.2.121:2181/kafka --partitions 2 --replication-factor 1 --topic test-2-1
# 创建2分区1副本的主题, 先指定2个分区, 后续添加一个分区
bin/kafka-topics.sh --create --zookeeper 192.168.2.121:2181/kafka --partitions 2 --replication-factor 1 --topic test-3-1
查看主题
# 列出所有主题
bin/kafka-topics.sh --list --zookeeper 192.168.2.121:2181/kafka
__consumer_offsets
test-1-1
test-2-1
# 查看指定主题 test-1-1
bin/kafka-topics.sh --describe --zookeeper 192.168.2.121:2181/kafka --topic test-1-1
Topic: test-1-1 PartitionCount: 1 ReplicationFactor: 1 Configs:
Topic: test-1-1 Partition: 0 Leader: 0 Replicas: 0 Isr: 0
[root@mrathena kafka-2.11-2.4.1]#
# 查看指定主题 test-2-1
# 第一行是所有分区的概要信息,之后的每一行表示每一个partition的信息, 主题 test-2-1 共有2个分区, 副本因子是1(分区副本只有1个)
# Leader 节点负责给定partition的所有读写请求
# Replicas 表示某个partition在哪几个broker上存在备份。不管这个几点是不是”leader“,甚至这个节点挂了,也会列出
# Isr(In-Sync-Replica) 是Replicas的一个子集,它只列出当前还存活着的,并且已同步备份了该partition的节点
# 第二行: test-2-1主题的0分区, 该分区的leader在broker0上, 该分区的副本在broker0上, 该分区的有效isr在broker0上
# 第三行: test-2-1主题的1分区, 该分区的leader在broker0上, 该分区的副本在broker0上, 该分区的有效isr在broker0上
bin/kafka-topics.sh --describe --zookeeper 192.168.2.121:2181/kafka --topic test-2-1
Topic: test-2-1 PartitionCount: 2 ReplicationFactor: 1 Configs:
Topic: test-2-1 Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: test-2-1 Partition: 1 Leader: 0 Replicas: 0 Isr: 0
[root@mrathena kafka-2.11-2.4.1]#
修改主题
目前kafka不支持减少分区
# 查看指定主题 test-3-1
bin/kafka-topics.sh --describe --zookeeper 192.168.2.121:2181/kafka --topic test-3-1
Topic: test-3-1 PartitionCount: 2 ReplicationFactor: 1 Configs:
Topic: test-3-1 Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: test-3-1 Partition: 1 Leader: 0 Replicas: 0 Isr: 0
[root@mrathena kafka-2.11-2.4.1]#
# 修改为3个分区
bin/kafka-topics.sh -alter --partitions 3 --zookeeper 192.168.2.121:2181/kafka --topic test-3-1
WARNING: If partitions are increased for a topic that has a key, the partition logic or ordering of the messages will be affected
Adding partitions succeeded!
# 查看指定主题 test-3-1
bin/kafka-topics.sh --describe --zookeeper 192.168.2.121:2181/kafka --topic test-3-1
Topic: test-3-1 PartitionCount: 3 ReplicationFactor: 1 Configs:
Topic: test-3-1 Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: test-3-1 Partition: 1 Leader: 0 Replicas: 0 Isr: 0
Topic: test-3-1 Partition: 2 Leader: 0 Replicas: 0 Isr: 0
[root@mrathena kafka-2.11-2.4.1]#
删除主题
如果配置项 delete.topic.enable 允许删除主题才能真的删除
bin/kafka-topics.sh --delete --topic test --zookeeper 192.168.2.121:2181/kafka
Topic test is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.
# 默认允许删除主题, 尝试配置 delete.topic.enable=false 后, 删除失败
bin/kafka-topics.sh --list --zookeeper 192.168.2.121:2181/kafka
test
[root@mrathena kafka-2.11-2.4.1]#
发送消息
kafka自带了一个producer命令客户端,可以从本地文件中读取内容,也可以在命令行中直接输入内容,并将这些内容以消息的形式发送到kafka集群中。默认每一行会被当做成一个独立的消息。
- –broker-list 192.168.2.131:9092
# 运行发送脚本, 然后输入发送内容
bin/kafka-console-producer.sh --broker-list 192.168.2.131:9092 --topic test
>hello world
>hello everyone
>
消费消息
kafka自带了一个consumer命令行客户端,会将获取到内容在命令中进行输出,默认消费建立连接后最新的消息
- –zookeeper 192.168.2.121:2181/kafka, 同样可以消费, 但是每个消费者组消费每个主题每个分区的offset会存储在zookeeper中, 受限于zookeeper并发不足的原因, 这种方式有性能瓶颈, 在kafka-0.9版本提供了offset存储在broker的方式
- –bootstrap-server 192.168.2.131:9092, 要连接的kafka服务器, 每个消费者组消费每个主题每个分区的offset会存储在broker中
- –from-beginning, 将会从最早的消息开始消费(每次使用该参数连接都会)
# 刚连上是没有消息的, 需要producer重新发几条消息, 因为新连接的消费者默认不消费之前的消息
bin/kafka-console-consumer.sh --bootstrap-server 192.168.2.131:9092 --topic test
# --from-beginning, 使用该参数从最早的消息开始消费
bin/kafka-console-consumer.sh --bootstrap-server 192.168.2.131:9092 --topic test --from-beginning
hello world
hello everyone
如果打开了多个终端运行consumer,在producer终端输入内容后,将会在多个consumer的终端窗口上显示出来, 因为默认会给每一个消费者随机分配一个消费者组, 这样就是发布订阅模式了
以上所有的命令都有一些附加的选项,当我们不携带任何参数运行命令的时候,将会显示出这个命令的详细用法
多主题消费
- –whitelist “test|test2”, 正则表达式, 指定要消费的主题的白名单
bin/kafka-console-consumer.sh --bootstrap-server 192.168.2.131:9092 --whitelist "test|test2"
单播消费
一条消息只能被某一个消费者消费的模式,类似queue模式,只需让所有消费者在同一个消费组里即可. 分别在两个客户端执行如下消费命令,然后往主题里发送消息,结果只有一个客户端能收到消息, 因为它们在同一个消费者组
- –consumer-property group.id=group, 配置consumer属性, 指定消费者组
bin/kafka-console-consumer.sh --bootstrap-server 192.168.2.131:9092 --consumer-property group.id=group --topic test
多播消费
一条消息能被多个消费者消费的模式,类似publish-subscribe模式费,针对Kafka同一条消息只能被同一个消费组下的某一个消费者消费的特性,要实现多播只要保证这些消费者属于不同的消费组即可。确保两个客户端指定不同的消费者组即可, 两个客户端都能收到消息
bin/kafka-console-consumer.sh --bootstrap-server 192.168.2.131:9092 --consumer-property group.id=group --topic test
bin/kafka-console-consumer.sh --bootstrap-server 192.168.2.131:9092 --consumer-property group.id=group2 --topic test
查看消费组
bin/kafka-consumer-groups.sh --bootstrap-server 192.168.2.131:9092 --list
console-consumer-66173
group2
group
[root@mrathena kafka-2.11-2.4.1]#
查看消费组的消费偏移量
查看group这个消费者组消费的偏移量, 该消费者组可能会消费多个主题
在test主题的0分区上
- CURRENT-OFFSET: 当前消费到的offset
- LOG-END-OFFSET: 分区最后一条消息的offset
- LAG: 未消费的消息数
在test2主题的0分区上
- 还没有消费过该主题该分区的消息
bin/kafka-consumer-groups.sh --bootstrap-server 192.168.2.131:9092 --describe --group group
GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
group test2 0 - 1 - consumer-group-1-c63e1d81-67f8-4e26-9244-e7db3444692e /192.168.2.131 consumer-group-1
group test 0 11 11 0 consumer-group-1-ef529122-fbec-4c55-a353-21ad65164b32 /192.168.2.131 consumer-group-1
[root@mrathena kafka-2.11-2.4.1]#
查看数据文件
查看 log.dirs 指定的日志文件位置, 每一个文件夹都是按 主题-分区 的方式命名的
- __consumer_offsets 主题有50个分区, 用户记录各消费者组消费每个主题每个分区的offset
- test-1-1 主题只有一个 0 分区
- test-2-1 主题有 0 1 两个分区
- test-3-1 主题有 0 1 2 三个分区
ll
-rw-r--r--. 1 root root 4 12月 30 22:31 cleaner-offset-checkpoint
drwxr-xr-x. 2 root root 141 12月 30 22:04 __consumer_offsets-0
...
drwxr-xr-x. 2 root root 141 12月 30 22:04 __consumer_offsets-49
-rw-r--r--. 1 root root 4 12月 30 22:54 log-start-offset-checkpoint
-rw-r--r--. 1 root root 88 12月 30 22:00 meta.properties
-rw-r--r--. 1 root root 1273 12月 30 22:54 recovery-point-offset-checkpoint
-rw-r--r--. 1 root root 1276 12月 30 22:54 replication-offset-checkpoint
drwxr-xr-x. 2 root root 141 12月 30 22:31 test-1-1-0
drwxr-xr-x. 2 root root 141 12月 30 22:31 test-2-1-0
drwxr-xr-x. 2 root root 141 12月 30 22:31 test-2-1-1
drwxr-xr-x. 2 root root 141 12月 30 22:49 test-3-1-0
drwxr-xr-x. 2 root root 141 12月 30 22:49 test-3-1-1
drwxr-xr-x. 2 root root 141 12月 30 22:52 test-3-1-2
进入 test-1-1-0 目录查看文件, 消息日志文件主要存放在分区文件夹里的以log结尾的日志文件里
ll
-rw-r--r--. 1 root root 10485760 12月 30 22:31 00000000000000000000.index
-rw-r--r--. 1 root root 0 12月 30 22:31 00000000000000000000.log
-rw-r--r--. 1 root root 10485756 12月 30 22:31 00000000000000000000.timeindex
-rw-r--r--. 1 root root 8 12月 30 22:31 leader-epoch-checkpoint
多节点操作
创建主题
# 在3节点(broker)环境下创建2分区3副本的主题
bin/kafka-topics.sh --create --zookeeper 192.168.2.121:2181/kafka --partitions 2 --replication-factor 3 --topic test-3-2-3
查看主题
# 查看指定主题 test-3-2-3
# 第一行是所有分区的概要信息,之后的每一行表示每一个partition的信息, 主题 test-2-1 共有2个分区, 副本因子是1(分区副本只有1个)
# Leader 节点负责给定partition的所有读写请求
# Replicas 表示某个partition在哪几个broker上存在备份。不管这个几点是不是”leader“,甚至这个节点挂了,也会列出
# Isr 是Replicas的一个子集,它只列出当前还存活着的,并且已同步备份了该partition的节点
# 第二行: test-3-2-3主题的0分区, 该分区的leader在broker0上, 该分区的副本在broker0,1,2上, 该分区的有效isr在broker0,1,2上
# 第二行: test-3-2-3主题的1分区, 该分区的leader在broker1上, 该分区的副本在broker1,2,0上, 该分区的有效isr在broker1,2,0上
bin/kafka-topics.sh --describe --zookeeper 192.168.2.121:2181/kafka --topic test-3-2-3
Topic: test-3-2-3 PartitionCount: 2 ReplicationFactor: 3 Configs:
Topic: test-3-2-3 Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Topic: test-3-2-3 Partition: 1 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
发送消息
bin/kafka-console-producer.sh --broker-list 192.168.2.131:9092,192.168.2.132:9092,192.168.2.133:9092 --topic test-3-2-3
>hello world
消费消息
bin/kafka-console-consumer.sh --bootstrap-server 192.168.2.131:9092,192.168.2.132:9092,192.168.2.133:9092 --from-beginning --topic test-3-2-3
hello worl
容错性
broker0是0分区的leader, 测试宕机后是否0分区的leader会切换到其他分区, 发现切换到1分区了, 且在isr中已经没有了0分区, leader的选举也是在ISR(in-sync replica)包含的节点中进行的
ps -ef | grep server.properties
kill -9 2513
# 查看指定主题 test-3-2-3
bin/kafka-topics.sh --describe --zookeeper 192.168.2.121:2181/kafka --topic test-3-2-3
Topic: test-3-2-3 PartitionCount: 2 ReplicationFactor: 3 Configs:
Topic: test-3-2-3 Partition: 0 Leader: 1 Replicas: 0,1,2 Isr: 1,2
Topic: test-3-2-3 Partition: 1 Leader: 1 Replicas: 1,2,0 Isr: 1,2
此时依然可以消费新消息
查看主题分区对应的leader信息
[zk: localhost:2181(CONNECTED) 29] get /kafka/brokers/topics/test-3-2-3
{"version":2,"partitions":{"1":[1,2,0],"0":[0,1,2]},"adding_replicas":{},"removing_replicas":{}}
[zk: localhost:2181(CONNECTED) 27] get /kafka/brokers/topics/test-3-2-3/partitions/0/state
{"controller_epoch":5,"leader":1,"version":1,"leader_epoch":3,"isr":[1,2]}
[zk: localhost:2181(CONNECTED) 28] get /kafka/brokers/topics/test-3-2-3/partitions/1/state
{"controller_epoch":5,"leader":1,"version":1,"leader_epoch":2,"isr":[1,2]}
kafka将很多集群关键信息记录在zookeeper里,保证自己的无状态,从而在水平扩容时非常方便