服务器上kafka单机版安装以及shell简单测试&kafka限流
在Kafka 2.8之后,引入了基于Raft协议的KRaft模式,支持取消对Zookeeper的依赖。在此模式下,一部分Kafka Broker被指定为Controller,另一部分则为Broker。这些Controller的作用就是以前由Zookeeper提供的共识服务,并且所有的元数据都将存储在Kafka主题中并在内部进行管理。
下面研究这种方式启动一个单机版kafka。
1. 安装
1. 下载
curl -O https://dlcdn.apache.org/kafka/3.3.1/kafka_2.13-3.3.1.tgz
2. 解压安装
- 解压
- 启动
# 生成集群ID
[root@VM-8-16-centos kafka_2.13-3.3.1]# KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"
[root@VM-8-16-centos kafka_2.13-3.3.1]# echo $KAFKA_CLUSTER_ID
lQAOBsE1Q6irBeQFkt5Rqg
#用这个唯一ID格式化Kafka存储目录
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c config/kraft/server.properties
Formatting /tmp/kraft-combined-logs with metadata.version 3.3-IV3.
# 启动kafka
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-server-start.sh config/kraft/server.properties
- 测试
[root@VM-8-16-centos ~]# jps | grep ka
4629 Kafka
- 接下来我们以守护进程方式启动kafka
[root@VM-8-16-centos kafka_2.13-3.3.1]# nohup bin/kafka-server-start.sh config/kraft/server.properties &
[1] 5641
2. shell 测试kafka
1. 简单测试
- 创建topic然后查看描述信息
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-topics.sh --create --topic test1 --bootstrap-server localhost:9092
Created topic test1.
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-topics.sh --describe --topic test1 --bootstrap-server localhost:9092
Topic: test1 TopicId: sbJcTX91TAqD9fczBXvH9g PartitionCount: 1 ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: test1 Partition: 0 Leader: 1 Replicas: 1 Isr: 1
当我们创建完topic 之后会在当前服务器的目录创建topic对应的目录信息
[root@VM-8-16-centos kraft-combined-logs]# ll
总用量 28
-rw-r--r-- 1 root root 249 12月 5 21:42 bootstrap.checkpoint
-rw-r--r-- 1 root root 0 12月 5 21:44 cleaner-offset-checkpoint
drwxr-xr-x 2 root root 4096 12月 5 21:47 __cluster_metadata-0
-rw-r--r-- 1 root root 4 12月 5 21:53 log-start-offset-checkpoint
-rw-r--r-- 1 root root 86 12月 5 21:42 meta.properties
-rw-r--r-- 1 root root 14 12月 5 21:53 recovery-point-offset-checkpoint
-rw-r--r-- 1 root root 14 12月 5 21:54 replication-offset-checkpoint
drwxr-xr-x 2 root root 4096 12月 5 21:51 test1-0
- 生产几条消息
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-console-producer.sh --topic test1 --bootstrap-server localhost:9092
>hello kafka
>myname is kafka
- 消费者消费消息
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-console-consumer.sh --topic test1 --from-beginning --bootstrap-server localhost:9092
hello kafka
myname is kafka
- 删除test1
# 删除
bin/kafka-topics.sh --delete --topic test1 --bootstrap-server localhost:9092
# 再次查看目录(可以看到其是先标记位逻辑删除,然后再删除掉目录)
...
drwxr-xr-x 2 root root 4096 12月 5 21:51 test1-0.55585b77a4644fb8bb0ed567a82b29ba-delete
[root@VM-8-16-centos kraft-combined-logs]# ll | grep test1
- 尝试直接向一个不存在的topic写入数据,测试会直接创建topic
# 直接写消息
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-console-producer.sh --topic test2 --bootstrap-server localhost:9092
>hello test21
[2022-12-05 22:05:35,059] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 4 : {test2=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient)
>hellotest22
# 消费消息
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-console-consumer.sh --topic test2 --from-beginning --bootstrap-server localhost:9092
hello test21
hellotest22
- 创建topic指定分区数量
# 创建一个分区位4,副本为1的主题。 副本必须小于集群broker 数量
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-topics.sh --create --topic test1 --bootstrap-server localhost:9092 --partitions 4 --replication-factor 1
Created topic test1.
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-topics.sh --describe --topic test1 --bootstrap-server localhost:9092
Topic: test1 TopicId: YvB0zKr5R-K3Qq7DAw9kMA PartitionCount: 4 ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: test1 Partition: 0 Leader: 1 Replicas: 1 Isr: 1
Topic: test1 Partition: 1 Leader: 1 Replicas: 1 Isr: 1
Topic: test1 Partition: 2 Leader: 1 Replicas: 1 Isr: 1
Topic: test1 Partition: 3 Leader: 1 Replicas: 1 Isr: 1
# 查看目录
[root@VM-8-16-centos kraft-combined-logs]# ll | grep test
drwxr-xr-x 2 root root 4096 12月 5 22:09 test1-0
drwxr-xr-x 2 root root 4096 12月 5 22:09 test1-1
drwxr-xr-x 2 root root 4096 12月 5 22:09 test1-2
drwxr-xr-x 2 root root 4096 12月 5 22:09 test1-3
drwxr-xr-x 2 root root 4096 12月 5 22:05 test2-0.4043937575044d579345a7a5fc2cb8e7-delete
- 查看所有的topic以及查看指定topic 消息数据数量、从偏移量消费数据
[root@VM-8-16-centos kafka_2.13-3.3.1]# ./bin/kafka-topics.sh --list --bootstrap-server localhost:9092
__consumer_offsets
quickstart-events
test1
[root@VM-8-16-centos kafka_2.13-3.3.1]# ./bin/kafka-run-class.sh
USAGE: ./bin/kafka-run-class.sh [-daemon] [-name servicename] [-loggc] classname [opts]
[root@VM-8-16-centos kafka_2.13-3.3.1]# ./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --topic test1 --time -1 --bootstrap-server localhost:9092
test1:0:24
test1:1:12
test1:2:24
test1:3:0
# 指定offset,指定offset,必须指定partition来进行消费(如下是分区1,偏移位10,所以读出来2条)
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-console-consumer.sh --topic test1 --partition 1 --offset 10 --bootstrap-server localhost:9092
mymsg_5
mymsg_6
- 消费消息指定group,然后查看消费者组进度记录 (LAG 表示消息堆积的情况,也就是对应分区未处理的消息)
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-console-consumer.sh --topic test1 --group g1 --bootstrap-server localhost:9092
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-consumer-groups.sh --list --bootstrap-server localhost:9092
g1
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-consumer-groups.sh --describe --group g1 --bootstrap-server localhost:9092
Consumer group 'g1' has no active members.
GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
g1 test1 0 28 28 0 - - -
g1 test1 1 14 14 0 - - -
g1 test1 2 28 28 0 - - -
g1 test1 3 0 0 0 - - -
- __consumer_offsets 好像是保存消费者进度的一个topic
bin/kafka-console-consumer.sh --topic __consumer_offsets --from-beginning --bootstrap-server localhost:9092
2. 关闭自动创建topic
上面看到,当我们发送消息的时候,如果topic 不存在kafka 默认会帮我们创建topic。有时候我们需要关闭自动创建,创建topic 必须走申请创建的流程。
编辑配置文件。 config/kraft/server.properties 文件增加如下配置,然后重启
auto.create.topics.enable=false
3. 安装web管理端
docker run -d -p 8080:8080 -v /opt/kafka-map/data:/usr/local/kafka-map/data -e DEFAULT_USERNAME=admin -e DEFAULT_PASSWORD=admin --name kafka-map --restart always dushixiang/kafka-map:latest
然后用默认的账号密码登录进去,创建集群后即可查看相关的集群以及topic信息。也可以从管理端消费消息与发送消息。
3. kafka 限流
如果kafka客户端是认证的,那么可以使用userId和clientId两种认证方式。如果没有认证只能使用clientId限流。一般也是用clientId 做限流。
- 服务器端配置
bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --add-config 'producer_byte_rate=51200,consumer_byte_rate=51200' --entity-type clients --entity-name clientA
对clientId=clientA的客户端添加限流设置。producer_byte_rate表示每秒最多能写入到消息量,单位为byte/sec。consumer_byte_rate表示每秒最多能消费的消息了,单位也为byte/sec。设置后立即生效。
# 查看配置如下
[root@VM-8-16-centos kafka_2.13-3.3.1]# bin/kafka-configs.sh --bootstrap-server localhost:9092 --describe --entity-type clients --entity-name clientA
Quota configs for client-id 'clientA' are consumer_byte_rate=30.0, producer_byte_rate=30.0
- 代码配置
// 生产者
props.put(ProducerConfig.CLIENT_ID_CONFIG, "clientA");
// 消费者
props.put(ConsumerConfig.CLIENT_ID_CONFIG, "clientA");
- 测试可以修改流量后,生产者发送多字节数的串。 修改消费者流量查看消费者每次收到的条数做比对,同理生产者也是这么测试。 亲测有效。
- 对于超出流量处理
1.生产者:把数据记录到log文件,再计算延时时间,再等待ThrottleTime时间后响应给producer。
2.对于consumer,计算延时时间,等待throttletime后,kafka从log读取数据响应给consumer。 如果Consumer的RequestTime < ThrottleTime,则consumer在ThrottleTime 时间内会不断重复发送fetch请求,kafka 会堆积大量无效请求,占用资源。
参考:https://kafka.apache.org/quickstart
不再依赖zk的kraft: https://blog.csdn.net/sD7O95O/article/details/125985869