Kafka基本原理详解(超详细):https://blog.csdn.net/weixin_45366499/article/details/106943229
什么是kafka
kafka是一个分布式、流数据处理系统。可以作为消息中心,但经典的应用场景还是应用服务的数据收集,大型网站用户浏览登录等一系列动作操作流数据的收集,配合ELK做数据、日志收集分析处理。以及搭配hadoop大数据使用。
1. 环境准备
zookeeper集群安装可参考:https://blog.csdn.net/yuanlaijike/article/details/79916792
主机名 | IP | 说明 |
master | 192.168.56.104 | zk flower节点 |
slave1 | 192.168.56.102 | zk master节点 |
slave2 | 192.168.56.105 | zk flower节点 |
项 | 说明 |
服务器 | centos7 |
kafka | 2.7.0 |
主机名 | IP | 说明 |
master | 192.168.56.104 | kafka节点1 |
slave1 | 192.168.56.102 | kafka节点2 |
slave2 | 192.168.56.105 | kafka节点3 |
关闭防火墙
$ systemctl stop firewalld #关闭防火墙
$ systemctl disable firewalld #禁止开机启动
2. 下载&安装
准备安装目录
[root@master local]# pwd
/root/local
$ mkdir kafka #新建应用目录
$ mkdir kafka/logs #消息存储目录
$ chmod 777 -R kafka/ #授予所有人权限
github当前最新版本是2.7.0
# 下载2.7.0安装包
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.7.0/kafka_2.13-2.7.0.tgz
# 解压到安装目录
$ tar -zxvf kafka_2.13-2.7.0.tgz -C /root/local/kafka
3. 修改配置
$ cd kafka/kafka_2.13-2.7.0
$ vim config/server.properties
通用配置
#kafka会留存所有消息,存放到每个分区下的segment目录下的.log文件中。这个log目录就是kafka的数据目录。可配置多个,逗号分隔
log.dirs=/root/local/kafka/logs
# zookeeper集群配置
zookeeper.connect=192.168.56.104:2181,192.168.56.102:2181,192.168.56.105:2181
分节点配置broker.id,必须保证每个节点的id唯一:
kafka节点1
broker.id=0
kafka节点2
broker.id=1
kafka节点3
broker.id=2
修改启动脚本,vim bin/kafka-server-start.sh:
调小内存消耗,-XX:ParallelGCThreads=1设置核数(我虚拟机是1核),否则启动后使用kafka命令时总会告警。我们提前修改就省得待会再改再重启了,告警如下:
4. 启动
# 用&表示后台启动
$ ./bin/kafka-server-start.sh config/server.properties &
启动成功后控制台有如下输出。
3台机器分别启动以后,集群搭建完成。我们继续看一下kafka集群在zookeeper的注册目录:
# 进入zookeeper集群任一节点安装目录,执行命令进入客户端
$ ./zkCli.sh
# 查看根目录
$ ls /
可以发现,除了zookeeper这个目录是zk集群注册添加的,其他目录都是kafka集群注册的。
5. 使用命令行操作kafka
请注意:以下命令行中 --bootstrap-server master:9092 效果等同于 --zookeeper master:2181,指定kafka server或者注册中心其一且只能指定其一。如果这两个参数同时指定还会报错。
5.1 创建topic
$ ./kafka-topics.sh --create --bootstrap-server master:9092 --partitions 3 --replication-factor 1 --topic esign-service # topic默认是1个分区1个副本;现指定3个分区,每个分区创建1个副本备份
结果:指定多个分区后,分区随机散落在broker节点的数据目录。如果是1个分区,会随机放在某一borker的kafka数据目录下。这个数据目录就是我们刚才配置过的“log.dirs”。看下图,我们刚才创建的topic=esign-service,指定了3个分区,那这3个分区就是esign-service-0, esign-service-1, esign-service-2。这3个文件夹分别分布在3个kafka节点的数据目录中。
5.2 查看topic列表
$ ./kafka-topics.sh -bootstrap-server master:9092 --list
5.3 查看topic详情
$ ./kafka-topics.sh --bootstrap-server master:9092 --describe --topic esign-service
5.4 向topic发送消息
$ ./kafka-console-producer.sh --bootstrap-server master:9092 --topic esign-service
5.5 消费消息
$ ./kafka-console-consumer.sh --bootstrap-server master:9092 --topic esign-service --from-beginning #能收到之前的消息,且能持续监听
5.6 指定消费者组,消费topic。可以打开多个命令窗口,共同执行以下命令;再起一个非消费者组的消费者。
$ ./kafka-console-consumer.sh --bootstrap-server master:9092 --topic esign-service --group service_group
测试结果:消费者组共同消费同一个topic,消息被组内成员随机消费。但并不影响消费者组外消费者消费全部消息。
5.7 查看消费者组列表
$ ./kafka-consumer-groups.sh --bootstrap-server master:9092 --list
5.8 查看消费者组在topic分区内的偏移量
$ ./kafka-consumer-groups.sh --bootstrap-server master:9092 --describe --group service_group
执行结果如下:
- 可以看到基于订阅发布模式,为什么topic分区内的只能被组内成员之一消费。因为相对于这个组来说,任一成员消费后。该组在topic具体分区内的偏移量都在变化。其他组内成员再来取消息,也只能是没被消费过的消息。
5.9 解码查看分区内数据文件明文,注意替换自己的数据文件目录
$ ./kafka-run-class.sh kafka.tools.DumpLogSegments --files /root/local/kafka/logs/esign-service-1/00000000000000000000.log --print-data-log
执行结果如下:
5.10 查看分区下的索引文件
$ ./kafka-run-class.sh kafka.tools.DumpLogSegments --files /root/local/kafka/logs/esign-service-1/00000000000000000000.index
6. 使用Docker安装kafka监控软件
拉取镜像
$ docker pull sheepkiller/kafka-manager
启动容器
$ docker run -d -p 9000:9000 --name kafka-manager -e ZK_HOSTS=192.168.56.104:2181 sheepkiller/kafka-manager
访问 ip:9000,添加kafka集群
配置完成后就可以登录集群了
测试一下动态添加分区
继续添加分区,详情:
点击添加。我们不需要任何命令,就可以在kafka服务器(1-slave1,即192.168.56.102)上看到有日志输出,效果如下:
我们再查看一下这台有日志输出的,kafka数据目录下的内容,可以看到。对topic=test,已经添加了第3个分区文件夹。名为test-2。