Kafka 初级使用

博文目录


通过 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里,保证自己的无状态,从而在水平扩容时非常方便





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值