Kafka zookeeper 集群生产环境安装 – 21运维
通知: .-...

Kafka zookeeper 集群生产环境安装

kafka&zookeeper 21运维 5653浏览

平台:centos 7.4
10.1.12.85 zk-kafka001
10.1.12.90 zk-kafka002
10.1.12.94 zk-kafka003
10.1.12.95 zk-kafka004
10.1.12.93 zk-kafka005
zookeeper:3.4.14
kafka:2.11
关于kafka的介绍,本文不做解释。只记录配置搭建过程,完全可以用于生产环境配置。
一,配置zookeeper集群。
zookeeper实质就是一个软件,分布式、开源的集群协调软件,每个安装了zookeeper的机器都叫做zookeeper server。其中zookeeper集群里边有两类角色:leader和follower。集群中只有一个leader,其他都是follower,如果一个leader挂掉,那么会按照zookeeper自己的选举机制,选举其他的follower成为新的leader。
所有zookeeper server的数据结构都是一样的,都是树形结构。zookeeper集群安装完毕后,每个zookeeper server 的安装bin目录下都有一个zkCli.sh ,这是zookeeper自带的一个客户端,可以看进去查看zookeeper里边的数据,zk的每个数据目录就是一个znode,可以通过ls 查看。
注意:
(1)默认端口2888和3888中,只有leader会监听2888,其他follower不监听。所有zookeeper都会监听3888端口,用于leader挂了进行选举使用。
(2)zookeeper server节点数量。单台也可以用,但是不具有高可用性。建议设置为奇数个,因为zookeeper 挂了一半的机器会认为集群挂掉。
1,zookeeper集群安装前准备工作。
(1)安装jdk。 这里直接安装1.8。 直接yum search java 找1.8的openjdk安装。

yum install java-1.8.0-openjdk.x86_64  -y

(2)修改主机名。分别设置主机名,这里以节点1为例

hostnamectl  set-hostname zk-kafka001

(3)创建用户并创建软件数据放置目录。这里创建用户kafka,以后zookeeper包括kafka软件都采用这个用户运行。

useradd  -M -s  /sbin/nologin  kafka && mkdir  -p  /data/{kafka,zookeeper}

(4)zookeeper安装包。 这里到apache官网下载,download–zookeeper,地址https://www.apache.org/dist/zookeeper/

软件安装我们设置的默认目录,默认都放置到/usr/local/zookeeper目录,以后的kafka我们会安装到/usr/local/kafka目录。

tar zxvf  zookeeper-3.4.14.tar.gz   -C   /usr/local/
mv zookeeper-3.4.14 zookeeper

(5)设置zookeeper配置文件。
到zookeeper的安装目录,切换到/usr/local/zookeeper/conf目录下:

cp  zoo_sample.cfg   zoo.cfg

编辑zoo.cfg配置文件。

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
server.1=10.1.12.85:2888:3888
server.2=10.1.12.90:2888:3888
server.3=10.1.12.94:2888:3888
server.4=10.1.12.95:2888:3888
server.5=10.1.12.93:2888:3888

配置文件说明:
tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。这个目录也就是我们之前mkdir创建的/data/zookeeper
clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

下面这两个了解:(默认值就好)
initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
syncLimit:这个配置项标识 Leader 与Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是2*2000=4 秒

最后需要添加:

server.1=10.1.12.85:2888:3888
server.2=10.1.12.90:2888:3888
server.3=10.1.12.94:2888:3888
server.4=10.1.12.95:2888:3888
server.5=10.1.12.93:2888:3888

server.A=B:C:D:
A 是一个数字,表示这个是第几号服务器;
B 是这个服务器的 ip 地址;
C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;注意这里只有leader才会监听2888端口,其他follower都不会监听。
D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口
(6)创建myid文件,并输入编号

echo "1" > /data/zookeeper/zookeeper/myid
其他四台分别为   2   3   4   5

(7)修改zookeeper的启动内存大小。
这里请根据实际情况来定,比如我们线上用的是8G内存的机器,我这里控制的是4G。vim /usr/local/zookeeper/bin/zkServer.sh添加:

JVMPARAM="-Xms1G -Xmx4G -Xmn2G"

参数说明:
参数解释说明:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xmx4G:设置JVM最大可用内存为4G。
-Xms1G:设置JVM初始内存为1G。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
设置完以后,下方找到nohup的脚本地方添加 $JVMPARAM参数,这样上边的启动内存大小才会真正生效:

    nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
    -cp "$CLASSPATH" $JVMFLAGS  $JVMPARAM $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &

(8)设置权限并设置服务器启动脚本。
安装目录以及data目录都重置权限:

chown  -R kafka.kafka  /usr/local/zookeeper/
chown  -R kafka.kafka  /data

启动脚本:vim /etc/systemd/system/zookeeper.service

[Unit]
Description=ZooKeeper Service
Documentation=http://zookeeper.apache.org
Requires=network.target
After=network.target
 
[Service]
Type=forking
User=kafka
Group=kafka
Environment=ZOO_LOG_DIR=/data/zookeeper/logs
ExecStart=/usr/local/kafka/zookeeper/bin/zkServer.sh start
ExecStop=/usr/local/kafka/zookeeper/bin/zkServer.sh stop
Restart=always
 
[Install]
WantedBy=default.target

设置完成,应用配置并设置开机启动等:

systemctl daemon-reload  && systemctl enable zookeeper && systemctl start zookeeper

查看服务启动情况:netstat -tnlp 或者ps -ef|grep zookeeper查看

tcp6       0      0 10.1.12.85:3888         :::*                    LISTEN      18124/java          
tcp6       0      0 :::16632                :::*                    LISTEN      18124/java          
tcp6       0      0 :::24189                :::*                    LISTEN      18720/java                  
tcp6       0      0 :::2181                 :::*                    LISTEN      18124/java 

可以看到这里已经正常启动,这个机器是follower,所以没有2888监听,可以看到设置的客户端连接端口2181和3888选举端口已经监听。
查看角色:

[root@zk-kafka001 bin]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@zk-kafka002 bin]#  /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@zk-kafka003 config]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[root@zk-kafka004 local]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@zk-kafka005 local]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower

由此可见,这里我们的zookeeper server 3是集群里边的leader角色,其他都是follower。

(8)查看目录

[root@zk-kafka001 bin]# ./zkCli.sh 
[zk: localhost:2181(CONNECTED) 3] ls /
[kafkagroup, zookeeper]
[zk: localhost:2181(CONNECTED) 4] ls /zookeeper
[quota]
[zk: localhost:2181(CONNECTED) 5] ls /zookeeper/quota
[]
[zk: localhost:2181(CONNECTED) 6] 

其中 kafkagroup, zookeeper 就是两个znode ,集群上每台机器上都有这个znode,也印证了zookeeper 的所有服务器中的所有数据结构(树形结构)是完全相同的。

至此,zookeeper server集群已经安装完成。

2,kafka集群安装
(1) 安装包。这里也是官网下载,https://www.apache.org/dist/kafka/。
(2) 安装包上传到机器以后解压 。这里还是以1节点为例,其他几台都是一样的配置方法。

tar  zxvf  kafka_2.11-2.2.0.tgz   -C  /usr/local/kafka/
mv kafka_2.11-2.2.0/  kafka
chown  -R kafka.kafka  /usr/local/kafka  #设置目录所有者,提升服务器安全。

(3)修改kafka 配置文件

cd  /usr/local/kafka/config/
vim  server.properties

broker.id=1
listeners=PLAINTEXT://: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=/data/kafka
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.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=10.1.12.85:2181,10.1.12.90:2181,10.1.12.94:2181,10.1.12.95:2181,10.1.12.93:2181/kafkagroup
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0

要改的地方一般只有个,有更高需求的请骑行研究参数:
broker.id=10 这个id如果部署的是kafka集群,id是不能一样的。id数字可以自定义。
listeners=PLAINTEXT://:9092 默认kafka端口,如果一台机器上面部署了多个kafka实例,需要两个实例端口不一样。
log.dirs=/data/kafka 这个需要修改,这个是存topic相关信息
num.partitions=1 特别注意,这个叫做默认参数.如果你生产topic时候不设置,那么这个就起作用,如果生产的时候指定,他就不起作用。
zookeeper.connect=10.1.12.85:2181,10.1.12.90:2181,10.1.12.94:2181,10.1.12.95:2181,10.1.12.93:2181/kafkagroup kafka实现功能需要zookeeper调度,所以这是与zk单机或者集群的连接,上面是与集群连接的方式,也可以去掉/kafkagroup,但是zk的znode结构就会比较混乱,所以建议加一个路径.
zookeeper.connection.timeout.ms=6000 —-连接zk超时时间
(4)设置kafka启动内存大小
到/usr/local/kafka/bin/kafka-server-start.sh 编辑:

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx4G -Xms1G"

具体参数值请根据服务器自身配置来决定。
(5)设置kafka 服务脚本

vim /etc/systemd/system/kafka.service

[Unit]
Description=Apache Kafka server (broker)
Documentation=http://kafka.apache.org/documentation.html
Requires=network.target remote-fs.target
After=network.target remote-fs.target kafka-zookeeper.service

[Service]
Type=simple
User=kafka
Group=kafka
ExecStart=/usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties
ExecStop=/usr/local/kafka/bin/kafka-server-stop.sh

[Install]
WantedBy=multi-user.target

systemctl daemon-reload && systemctl enable kafka && systemctl start kafka

查看kafka启动,netstat -tnlp | grep java 看到9092或则会ps -ef | grep kafka 有既定设置,那么说明设置完成。

[root@zk-kafka001 bin]# netstat  -tunlp | grep  java
tcp6       0      0 10.1.12.85:3888         :::*                    LISTEN      18124/java          
tcp6       0      0 :::16632                :::*                    LISTEN      18124/java          
tcp6       0      0 :::24189                :::*                    LISTEN      18720/java          
tcp6       0      0 :::9092                 :::*                    LISTEN      18720/java          
tcp6       0      0 :::2181                 :::*                    LISTEN      18124/java  

其他节点类似设置。
至此,kafka集群配置完成。

3,验证集群。
(1)在任何一台机器上创建一个topic

./kafka-topics.sh --create --zookeeper 10.1.12.85/kafkagroup --replication-factor 5 --partitions 3 --topic aaa
创建完毕以后,可以通过zookeeper的zkCli.sh 查看zk。真实数据并不是存放到了zookeeper,他只是存一些leader和复本信息等。真实数据是存放于我们kafka定义的目录,比如/data/kafka。
[zk: localhost:2181(CONNECTED) 2] ls /kafkagroup/brokers/topics
[aaa, ccc, bbb, ddd, __consumer_offsets]

(2)生产消息

[root@zk-kafka005 bin]# ./kafka-console-producer.sh  --broker-list  10.1.12.85:9092 --topic  aaa
>asdf
>asdfsdfdsaf
>asdfddddddd
写入消息

(3)消费消息
在集群的任何一台机器消费topic aaa

[root@zk-kafka004 bin]# /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic aaa --from-beginning
asdf
asdfsdfdsaf
asdfddddddd

转载请注明:21运维 » Kafka zookeeper 集群生产环境安装