Kafka从零安装到实现基本通信
背景
因项目需求要使用kafka实现消息队列,从零开始学习安装。
zookeeper安装
安装
从官网https://dlcdn.apache.org/zookeeper/
上下载,这里选择3.7.0版本。
注意事项
- zookeeper从3.5.5开始,带有bin名称的包才是编译后的二进制的包,而之前的普通的tar.gz的包里面是只是源码的包,无法直接使用。
配置
- 解压
tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz
- 复制config文件夹下zoo_sample.cfg,重命名为zoo.cfg,作为zookeeper配置文件
- 修改配置文件
tickTime=2000 #session的会话时间 以ms为单位
initLimit=10 #服务器启动以后,master和slave通讯的时间
syncLimit=5 #master和slave之间的心跳检测时间,检测slave是否存活
dataDir=/tmp/zookeeper #保存zk的快照和数据,自行指定
clientPort=2181 #客户端访问zk的端口
# 在末尾添加
#2888是数据同步和消息传递端口,3888是选举端口
server.1=server1IP:2888:3888
server.2=server2IP:2888:3888
server.3=server3IP:2888:3888
- 在 3 中数据目录下建立myid文件,在三个服务器上内容分别为1,2,3
echo 1>>dataDir/myid
- 分别在三个服务器上启动zookeeper
bin/zkServer.sh start
- 查看zookeeper状态
bin/zkServer.sh status
可以看到有一个leader,两个follower
注意事项
- 分布式zookeeper集群必须大于等于三台,且最好为奇数台。如果只有2台,通过 6 步骤查看状态时为standalone
原因:必须满足n/2+1=m, m必须大于部署zk机器数的一半(n/2)可用才认为集群可用,而且奇数台更节省资源
2/2+1=2 一台不能坏
3/2+1=2 可以坏掉一台
4/2+1=3 只能坏一台
5/2+1=3 可以坏2台
- myid不要重复,不能缺失,影响leader的选举
参考:https://www.cnblogs.com/veblen/p/10992103.html - 安装及修改配置文件时,可以在第一台服务器上配置完,通过scp语句传到另外的服务器上,再去改部分配置文件。
kafka安装、配置及建立基本通信
安装
从官网https://kafka.apache.org/downloads
上下载,这里选择 kafka_2.13-3.1.0.tgz版本。
配置
- 解压
tar -zxvf kafka_2.13-3.1.0.tgz
- 修改三台服务器上config/server.properties配置文件
#以master节点为例
broker.id=1 # 每台服务器上不同
#listeners = PLAINTEXT://your.host.name:9092
#9092为kafka端口号
listeners=PLAINTEXT://server1IP:9092
host.name=server1IP
#端口号为zookeeper端口号
zookeeper.connect=server1IP:2180,server2IP:2181,server1IP3:2181
- 在zookeeper启动的前提下,在每个节点上启动broker
#后台运行
bin/kafka-server-start.sh config/server.properties 1>/dev/null 2>&1 &
#通过jps命令查看是否启动
jps
#jps结果
21938 Kafka
4885 Jps
12326 QuorumPeerMain
-
创建topic
bin/kafka-topics.sh --create --bootstrap-server server1IP:9092 --replication-factor 1 --partitions 1 --topic test
-
查看topic
bin/kafka-topics.sh --describe --bootstrap-server server1IP:9092 --topic test
#结果
Topic: test TopicId: r5H3D_sAQIGmCSQMaMiYmQ PartitionCount: 1 ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: test Partition: 0 Leader: 3 Replicas: 3 Isr: 3
-
启动生产者
bin/kafka-console-producer.sh --topic test --bootstrap-server server1IP:9092
-
启动消费者
bin/kafka-console-consumer.sh --topic test --from-beginning --bootstrap-server server1IP:9092
注意事项
-
配置文件中listeners一定要配置,否则会导致生产者无法生产及消费者无法消费(请求不到)。
-
QuorumPeerMain表示zookeeper是否启动,通过jps没有看到的话要重启zookeeper。
重启zookeeper可能遇到端口被占用的情况:
#重启zookeeper
./zkServer.sh restart
#如果遇到重启失败,先看端口是否被占用,root账户下查看,避免看不到某些进程的id
sudo netstat -tunlp
#释放端口重启zookeeper
sudo kill -9 id
./zkServer.sh start
- 创建topic的语句在新版本有所变化,使用旧版本语句会报错。
在旧版本里创建topic语句为
bin/kafka-topics.sh --create --zookeeper server1IP:9092 --replication-factor 1 --partitions 1 --topic test
新版本变为
bin/kafka-topics.sh --create --bootstrap-server server1IP:9092 --replication-factor 1 --partitions 1 --topic test