Kafka的集群部署和使用
#相关概念和工作流可以参考大神的这两篇博客
https://www.cnblogs.com/kevingrace/p/9443270.html
https://www.cnblogs.com/kevingrace/p/9021508.html
1.集群服务器架构信息以及基础环境准备
1.服务器架构规划
ip地址 主机名 安装软件 172.31.46.28 kafka01 zookeeper、kafka 172.31.46.63 kafka02 zookeeper、kafka 172.31.46.67 kafka03 zookeeper、kafka 172.31.46.26 kafka-manager kafka-manager
2.关闭防火墙和绑定hosts(集群所有节点都操作)
#设置主机名,每个节点都做。 [root@k8s-master01 ~]# hostnamectl set-hostname kafka01 #4台机器关闭iptables和selinux [root@kafka01 ~]# /etc/init.d/iptables stop [root@kafka01 ~]# vim /etc/sysconfig/selinux ...... SELINUX=disabled [root@kafka01 ~]# setenforce 0 [root@kafka01 ~]# getenforce Permissive #4台机器做hosts绑定,并检查,如果集群规模较大建议做个bind9 [root@kafka01 ~]# vim /etc/hosts 172.31.46.28 kafka01 172.31.46.63 kafka02 172.31.46.67 kafka03 172.31.46.26 kafka-manager [root@kafka01 ~]# ping kafka-manager PING node3 (172.31.46.26) 56(84) bytes of data. 64 bytes from node3 (172.31.46.26): icmp_seq=1 ttl=64 time=0.948 ms [root@kafka01 ~]# ping kafka02 PING node1 (172.31.46.63) 56(84) bytes of data. 64 bytes from node1 (172.31.46.63): icmp_seq=1 ttl=64 time=0.302 ms
3.jdk安装(四台机器都要操作,安装1.7以上版本)
#将jdk-8u131-linux-x64.rpm下载到/opt目录下 下载地址:https://pan.baidu.com/s/1pLaAjPp 提取密码:x27s [root@kafka01 ~]# cd /usr/local/src/ [root@kafka01 src]# ll jdk-8u131-linux-x64.rpm -rw-r--r--. 1 root root 169983496 Sep 28 2017 jdk-8u131-linux-x64.rpm [root@kafka01 src]# rpm -ivh jdk-8u131-linux-x64.rpm [root@kafka01 src]# vim /etc/profile ...... JAVA_HOME=/usr/java/jdk1.8.0_131 JAVA_BIN=/usr/java/jdk1.8.0_131/bin PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/bin:/sbin/ CLASSPATH=.:/lib/dt.jar:/lib/tools.jar export JAVA_HOME JAVA_BIN PATH CLASSPATH [root@kafka01 src]# source /etc/profile [root@kafka01 src]# java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
4.安装zookeeper集群(以下操作需在所有zookeeper节点操作)
#我们先cd到我们的安装目录下(这个根据每个公司的情况,都不一样) [root@kafka01 ~]# cd /iflytek [root@kafka01 iflytek]# wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz [root@kafka01 iflytek]# tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz #做软连接,方面后面升级
[root@kafka01 iflytek]# ln -sv apache-zookeeper-3.6.2-bin zookeeper [root@kafka01 iflytek]# mkdir -p zookeeper/data [root@kafka01 iflytek]# cp zookeeper/conf/zoo_sample.cfg zookeeper/conf/zoo_sample.cfg.bak [root@kafka01 iflytek]# cp zookeeper/conf/zoo_sample.cfg zookeeper/conf/zoo.cfg #修改zookeeper的配置文件,清楚之前的内容,加入新的内容如下所示
[root@kafka01 iflytek]# vim zookeeper/conf/zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 dataDir=/iflytek/zookeeper/data/zookeeper dataLogDir=/iflytek/zookeeper/data/logs clientPort=2181 maxClientCnxns=60 autopurge.snapRetainCount=3 autopurge.purgeInterval=1 server.1=172.31.46.28:2888:3888 server.2=172.31.46.63:2888:3888 server.3=172.31.46.67:2888:3888 -------------------------------------
配置参数说明:
tickTime=2000 #服务器与服务器之间和客户端与服务器之间的单次心跳检测时间间隔, 单 位为毫秒, 类似于 haproxy 针对 real server 的 check inter 间隔时间 initLimit=10 #集群中 leader 服务器与 follower 服务器初始连接心跳次数, 即多少个 2000 毫 秒 syncLimit=5 # leader 与 follower 之间连接完成之后,后期检测发送和应答的心跳次数,如 果该 follower 在设置的时间内(5*2000)不能与 leader 进行通信,那么此 follower 将被视为 不可用。 clientPort=2181 #客户端连接 Zookeeper 服务器的端口, Zookeeper 会监听这个端口,接受 客户端的访问请求 autopurge.snapRetainCount=3 #设置 zookeeper 保存保留多少次客户端连接的数据 autopurge.purgeInterval=1 #设置 zookeeper 间隔多少小时清理一次保存的客户端数据 server.1=172.31.46.28:2888:3888#服务器编号=服务器 IP:LF 数据同步端口:LF 选举端口(表示了不同的zookeeper服务器的自身标识,
作为集群的一部分,每一台服务器应该知道其他服务器的信息。 用户可以从"server.id=host:port:port" 中读取到相关信息。 在服务器的data(dataDir参数所指定的目录)下创建一个文件名为myid的文件,这个文件的内容只有一行,指定的是自身的id值。 比如,服务器"1"应该在myid文件中写入"1"。这个id必须在集群环境中服务器标识中是唯一的,且大小在1~255之间。) ----------------------------------#注意:如果想更换日志输出位置,除了在zoo.cfg加入
"
dataLogDir=/iflytek/zookeeper/data/logs"外,还需要修改zkServer.sh文件,
大概修改方式地方在141行左右,内容如下
[root@kafka01 iflytek]# cp zookeeper/bin/zkServer.sh zookeeper/bin/zkServer.sh.bak
[root@kafka01 iflytek]# vim zookeeper/bin/zkServer.sh
。。。。。。。。。。
141 ZOO_LOG_DIR="$($GREP "^[[:space:]]*dataLogDir" "$ZOOCFG" | sed -e 's/.*=//')" #添加这一行
142 if [ ! -w "$ZOO_LOG_DIR" ] ; then
143 mkdir -p "$ZOO_LOG_DIR"
144 fi
#在启动zookeeper服务之前,还需要在zookeeper节点机器上创建myid,方式如下: [root@kafka01 iflytek]# mkdir zookeeper/data/zookeeper/ #因为我是在服务器1上演示的所以这里把1写进myid这个文件。其他节点类似 [root@kafka01 iflytek]# echo 1 > zookeeper/data/zookeeper/myid #启动zookeeper服务,并检查 [root@kafka01 iflytek]# zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /iflytek/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@kafka01 iflytek]# ps -ef|grep zookeeper
[root@kafka01 iflytek]# lsof -i:2181
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 735986 root 56u IPv4 3794176 0t0 TCP *:eforward (LISTEN)
#查看各个节点zookeeper的角色
[root@kafka01 iflytek]# zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /iflytek/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@kafka02 iflytek]# zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /iflytek/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@kafka03 iflytek]# zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /iflytek/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
2.安装部署kafka和集群管理工具kafka-manager
1.安装kafaka(三个节点同样操作)
[root@kafka01 ~]# cd /iflytek [root@kafka01 iflytek]# wget https://mirror.bit.edu.cn/apache/kafka/2.7.0/kafka_2.13-2.7.0.tgz [root@kafka01 iflytek]# tar -zvxf kafka_2.13-2.7.0.tgz [root@kafka01 iflytek]# ln -sv kafka_2.13-2.7.0 kafka #进入kafka下面的config目录,修改配置文件server.properties: [root@kafka01 iflytek]# cp kafka/config/server.properties kafka/config/server.properties.bak [root@kafka01 iflytek]# vim kafka/config/server.properties broker.id=0 delete.topic.enable=true listeners=PLAINTEXT://172.31.46.28:9092
num.network.threads=3
num.io.threads=8 socket.send.buffer.bytes=102400 socket.receive.buffer.bytes=102400 socket.request.max.bytes=104857600 log.dirs=/iflytek/kafka/data num.partitions=1 num.recovery.threads.per.data.dir=1 offsets.topic.replication.factor=1 transaction.state.log.replication.factor=1 transaction.state.log.min.isr=1 log.flush.interval.messages=10000 log.flush.interval.ms=1000 log.retention.hours=168 log.retention.bytes=1073741824 log.segment.bytes=1073741824 log.retention.check.interval.ms=300000 zookeeper.connect=172.31.46.28:2181,172.31.46.63:2181,172.31.46.67:2181 zookeeper.connection.timeout.ms=6000 group.initial.rebalance.delay.ms=0 #其他两个节点的server.properties只需要修改下面两行,其他配置都一样 [root@kafka02 iflytek]# vim kafka/config/server.properties broker.id=1 ...... listeners=PLAINTEXT://172.31.46.63:9092 ....... [root@kafka03 iflytek]# vim kafka/config/server.properties broker.id=2 ...... listeners=PLAINTEXT://172.31.46.67:9092 ...... #启动kafka服务 [root@kafka01 iflytek]# nohup kafka/bin/kafka-server-start.sh kafka/config/server.properties >/dev/null 2>&1 & [root@kafka01 iflytek]# lsof -i:9092 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 876461 root 122u IPv4 4531968 0t0 TCP ceph-deploy:XmlIpcRegSvc (LISTEN) java 876461 root 141u IPv4 4531973 0t0 TCP ceph-deploy:59560->ceph-deploy:XmlIpcRegSvc (ESTABLISHED) java 876461 root 142u IPv4 4532804 0t0 TCP ceph-deploy:XmlIpcRegSvc->ceph-deploy:59560 (ESTABLISHED) #验证服务,随便在其中一台节点主机执行 [root@kafka01 iflytek]# kafka/bin/kafka-topics.sh --create --zookeeper 172.31.46.28:2181,172.31.46.63:2181,172.31.46.67:2181 --replication-factor 1 --partitions 1 --topic test 出现下面信息说明创建成功 Created topic test. #然后再在其他主机查看上面创建的topic [root@kafka02 iflytek]# kafka/bin/kafka-topics.sh --list --zookeeper 172.31.46.28:2181,172.31.46.63:2181,172.31.46.67:2181 test 到此,kafka集群环境已部署完成!
2.Kafka命令行操作
#查看当前服务器中的所有topic [root@kafka01 iflytek]# kafka/bin/kafka-topics.sh --zookeeper 172.31.46.28:2181,172.31.46.63:2181,172.31.46.67:2181 --list __consumer_offsets test test1 #创建topic [root@kafka01 iflytek]# kafka/bin/kafka-topics.sh --zookeeper 172.31.46.28:2181,172.31.46.63:2181,172.31.46.67:2181 --create --replication-factor 3 --partitions 1 --topic test2 选项说明: --topic 定义 topic 名 --replication-factor 定义副本数 --partitions 定义分区数 #删除topic(需要 server.properties 中设置 delete.topic.enable=true 否则只是标记删除) [root@kafka01 iflytek]# kafka/bin/kafka-topics.sh --zookeeper 172.31.46.28:2181,172.31.46.63:2181,172.31.46.67:2181 --delete --topic test #查看某个Topic的详情 [root@kafka01 iflytek]# kafka/bin/kafka-topics.sh --zookeeper 172.31.46.28:2181,172.31.46.63:2181,172.31.46.67:2181 --describe --topic test1 Topic: test1 PartitionCount: 1 ReplicationFactor: 3 Configs: Topic: test1 Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0 #修改分区数 [root@kafka01 iflytek]# kafka/bin/kafka-topics.sh --zookeeper 172.31.46.28:2181,172.31.46.63:2181,172.31.46.67:2181 --alter --topic test1 --partitions 6 #测试生产消息,这个下面的地址加端口填kafka集群中的节点就行了 [root@kafka01 iflytek]# kafka/bin/kafka-console-producer.sh --broker-list 172.31.46.28:9092 --topic test1 >Hello #测试消费信息 [root@kafka02 iflytek]# kafka/bin/kafka-console-consumer.sh --bootstrap-server 172.31.46.63:9092 --topic test1 Hello #查看指定topic中以往所有的数据都读出来(这个前提是消息数据还在默认的保留周期内)--from-beginning: 会把主题中以往所有的数据都读取出来。 [root@kafka03 iflytek]# kafka/bin/kafka-console-consumer.sh --bootstrap-server 172.31.46.67:9092 --from-beginning --topic test1
3.安装kafka集群管理工具kafka-manager简单使用介绍
为了简化开发者和服务工程师维护Kafka集群的工作,yahoo构建了一个叫做Kafka管理器的基于Web工具,叫做 Kafka Manager。kafka-manager 项目地址:https://github.com/yahoo/kafka-manager。这个管理工具可以很容易地发现分布在集群中的哪些topic分布不均匀,或者是分区在整个集群分布不均匀的的情况。它支持管理多个集群、选择副本、副本重新分配以及创建Topic。同时,这个管理工具也是一个非常好的可以快速浏览这个集群的工具,kafka-manager有如下功能:
- 管理多个kafka集群
- 便捷的检查kafka集群状态(topics,brokers,备份分布情况,分区分布情况)
- 选择你要运行的副本
- 基于当前分区状况进行
- 可以选择topic配置并创建topic(0.8.1.1和0.8.2的配置不同)
- 删除topic(只支持0.8.2以上的版本并且要在broker配置中设置delete.topic.enable=true)
- Topic list会指明哪些topic被删除(在0.8.2以上版本适用)
- 为已存在的topic增加分区
- 为已存在的topic更新配置
- 在多个topic上批量重分区
- 在多个topic上批量重分区(可选partition broker位置)
kafka-manager安装过程如下
下载安装 kafka-manager 想要查看和管理Kafka,完全使用命令并不方便,我们可以使用雅虎开源的Kafka-manager,GitHub地址如下: https://github.com/yahoo/kafka-manager 也可以使用Git或者直接从Releases中下载,此处从下面的地址下载 1.3.3.7 版本: https://github.com/yahoo/kafka-manager/releases 需要注意: 上面下载的是源码,下载后需要按照后面步骤进行编译。如果觉得麻烦,可以直接下载编译好的kafka-manager-1.3.3.7.zip。 下载地址:https://pan.baidu.com/s/12j2DEt94WsWRY6dD9aR6BQ 提取密码:8x57 [root@kafka-manager ~]# cd /iflytek [root@kafka-manager iflytek]# unzip kafka-manager-1.3.3.7.zip [root@kafka-manager iflytek]# ln -sv kafka-manager-1.3.3.7 kafka-manager [root@kafka-manager iflytek]# cp kafka-manager/conf/application.conf kafka-manager/conf/application.conf.bak [root@kafka-manager iflytek]# vim kafka-manager/conf/application.conf ................ #kafka-manager.zkhosts="localhost:2181" #注释这一行,下面添加一行,下面的地址,是zookeeper的节点地址 kafka-manager.zkhosts="172.31.46.28:2181,172.31.46.63:2181,172.31.46.67:2181" #启动kafka-manager [root@kafka-manager iflytek]# nohup kafka-manager/bin/kafka-manager >/dev/null 2>&1 & ---------------------------------------------------------------------------------------------------- 需要注意: kafka-manager 默认的端口是9000,可通过 -Dhttp.port,指定端口; -Dconfig.file=conf/application.conf指定配置文件: [root@kafka-manager iflytek]# nohup kafka-manager/bin/kafka-manager -Dconfig.file=kafka-manager/conf/application.conf -Dhttp.port=8080 & ---------------------------------------------------------------------------------------------------- 启动完毕后可以查看端口是否启动,由于启动过程需要一段时间,端口起来的时间可能会延后。 [root@kafka-manager iflytek]# lsof -i:9000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 651368 root 150u IPv4 3296558 0t0 TCP *:cslistener (LISTEN) 最后就可以使用http://172.31.46.26:9000访问了
kafka-mamager测试
新建 Cluster1
点击【Cluster】>【Add Cluster】打开如下添加集群的配置界面:
输入集群的名字(如Kafka-Cluster-test)和 Zookeeper 服务器地址(如localhost:2181),选择最接近的Kafka版本(如0.10.1.1)
-------------------------------------------------------------------
注意:如果没有在 Kafka 中配置过 JMX_PORT,千万不要选择第一个复选框。
Enable JMX Polling
如果选择了该复选框,Kafka-manager 可能会无法启动。
新建完成后,运行界面如下:
查看broker信息
管理 kafka-mamager
新建主题(消息类别)
点击【Topic】>【Create】可以方便的创建并配置主题。如下显示。
查看结果