最近在学习分布式的消息系统kafka,特此记录搭建kafka集群过程。
环境:
VM搭建的三个虚拟机,均采用centos-6.8-64.iso
机器IP与名称对应关系如下:
192.168.152.192 master
192.168.152.193 slave1
192.168.152.194 slave2
1. 为了高可用,kafka采用了zookeeper,zookeeper的集群搭建可以参照这里。
2. 总体思路,在一台机器上配置好再远程复制到其他机器即可,SSH互相无密码访问可以参考这里。
3. 在master机器上配置:
3.1 创建必要目录与下载压缩包
[root@master]# mkdir /home/kafka
[root@master]# cd kafka
[root@master]# mkdir kafkalogs #存放kafka消息的目录,也可以使用默认的目录
[root@master]# wget http://apache.opencas.org/kafka/0.9.0.1/kafka_2.11-0.9.0.1.tgz
[root@master]# tar zxvf kafka_2.11-0.9.0.1.tgz .
3.2 修改配置文件
[root@master]# cd kafka_2.11-0.9.0.1/config
主要配置的是server.properties
下面逐一解释:
broker.id=0 #当前机器在kafka机器里唯一标识,与zookeeper的myid一个意思,由于我使用独立zookeeper这里可以注释掉
port=9092 #socket监听的端口
host.name=192.168.152.192 #broker绑定的IP,我这里三台机器都绑定了,后面远程复制的时候记得修改
num.network.threads=3 #broker处理网络的线程数目
num.io.threads=8 #broker处理IO的线程数目
socket.send.buffer.bytes=102400 #kafka发送数据缓冲区的大小,到达阈值才发送
socket.receive.buffer.bytes=102400 #kafka接收数据缓冲区的大小,达到阈值才落地
socket.request.max.bytes=104857600 #kafka所能接受的数据最大值,100MB,这个值应该小于机器配置的Java heap,一般Java heap为内存的1/4
log.dirs=/home/kafka/kafkalogs #存储消息的目录位置
num.partitions=1 #每个主题的默认分区数目,更多的分区可以允许更多的消费,可以提高性能
num.recovery.threads.per.data.dir #在kafka启动和关闭flush时,还原日志时,对于每个数据目录所能使用的线程数目
log.flush.interval.message=10000 #当消息达到10000条时就会强制刷一次数据到磁盘
log.flush.interval.ms=1000 #每过1秒就会强制刷数据到磁盘,单位毫秒
log.retention.hours=168 #消息最大持久化时间,单位小时,即7天
log.retention.bytes=1073741824 #一种持久化策略,当剩余段文件不低于这个阈值,当前段就会从日志消息中删除
log.segment.bytes=1073741824 #一个段文件的最大值,达到最大值会另起一个新的segment
log.retention.check.interval.ms=300000 #每300秒去检验一下段文件是否能被删除
zookeeper.connect=192.168.152.192:12181,192.168.152.193:12181,192.168.152.194:12181 #设置zookeeper的端口
zookeeper.connect.timeout.ms=6000 #连接zookeeper的超时时间
解释完毕,上面也是我配置文件中的内容,注意host.name=192.168.152.192在其他两个机器上要作对应修改
master机器配置完毕
4. 切换到slave1和slave2上创建相应的目录
[root@slave1]# mkdir /home/kafka
[root@slave1]# mkdir /home/kafka/kafkalogs
[root@slave2]# mkdir /home/kafka
[root@slave2]# mkdir /home/kafka/kafkalogs
5. 回到master机器实施远程复制命令
[root@master]# scp -r /home/kafka/kafka_2.11-0.9.0.1 slave1:/home/kafka
[root@master]# scp -r /home/kafka/kafka_2.11-0.9.0.1 slave2:/home/kafka
6. 切换到slave1和slave2上修改配置文件
[root@slave1]# vim /home/kafka/kafka_2.11-0.9.0.1/config/server.properties
找到host.name=一行,替换掉IP,我这里是192.168.152.193,保存退出
[root@slave2]# vim /home/kafka/kafka_2.11-0.9.0.1/config/server.properties
找到host.name=一行,替换掉IP,我这里是192.168.152.194,保存退出
7. 进行验证7.1 先启动zookeeper集群
[root@master]# /home/zookeeper/zookeeper-3.4.6/bin/zkServer.sh start
[root@slave1]# /home/zookeeper/zookeeper-3.4.6/bin/zkServer.sh start
[root@slave2]# /home/zookeeper/zookeeper-3.4.6/bin/zkServer.sh start
7.2 再启动kafka集群
--------------master--------------
[root@master]# cd /home/kafka/kafka_2.11-0.9.0.1/bin
[root@master]# ./kafka-server-start.sh -daemon ../config/server.properties
[root@master]# jps
2750 QuorumPeerMain
3930 Jps
3246 Kafka
--------------slave1--------------
[root@slave1]# cd /home/kafka/kafka_2.11-0.9.0.1/bin
[root@slave1]# ./kafka-server-start.sh -daemon ../config/server.properties
[root@slave1]# jps
3341 Kafka
2632 QuorumPeerMain
3666 Jps
--------------slave2--------------
[root@slave2]# cd /home/kafka/kafka_2.11-0.9.0.1/bin
[root@slave2]# ./kafka-server-start.sh -daemon ../config/server.properties
[root@slave2]# jps
2612 QuorumPeerMain
3682 Jps
3293 Kafka
7.3 创建一个Topic实例:
7.3.1 在一台机器上创建一个主题
[root@master bin]# ./kafka-topics.sh --create --zookeeper 192.168.152.192:12181 --replication-factor 3 --partitions 1 --topic hello
7.3.2 在一台机器上创建一个发布者
[root@slave1 bin]# ./kafka-console-producer.sh --broker-list 192.168.152.193:9092 --topic hello
此时控制台会捕获键盘值,当有换行键被按下表示一条消息被发送出去
7.3.3 在一台机器上创建一个订阅者
[root@slave2 bin]# ./kafka-console-consumer.sh --zookeeper 192.168.152.194:12181 --topic hello --from-beginning
此时控制台会处于接收状态
7.3.4 在slave1上输入信息回车之后,slave2上会同步出现发送过来的消息。要关闭slave1或者slave2,Ctrl+C即可
8. 关闭kafka集群
[root@master bin]# ./kafka-server-stop.sh
[root@slave1 bin]# ./kafka-server-stop.sh
[root@slave2 bin]# ./kafka-server-stop.sh
搭建完毕