平台: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 集群生产环境安装