Kafka分布式消息系统(搭建Zookeeper集群) - Part.2
kafka使用zookeeper来管理Brokers(kafka服务进程)、执行partition(分区)的leader选举、当出现变更时向kafka发送通知(新建topic、删除topic、broker上线、broker下线)。zookeeper通常配置为集群,一般3个或者5个,其中一个为leader,其余为follower。kafka强依赖于zookeeper,如果没有zookeeper则无法运行,这篇文章主要讲述如何在CentOS 7上搭建zookeeper集群。简单起见,以root身份登录系统并进行操作。
有很多的术语,例如Topic、Broker、Partition,本文将不再译成中文,因为英文的这几个单词本身就很好懂了。
配置运行环境
修改主机名
我们是要搭建一个集群,既然是集群,那么自然是多台服务器。对于zookeeper,一般的建议是部署3或5台,在这篇文章中,将会部署3台。为了便于区分,我们将三台服务器的主机名分别命名为kafka1、kafka2、kafka3。
为了节约资源,每台服务器都会安装kafka和zookeeper,因此,没有将服务器命名为zookeeper1。
# hostnamectl set-hostname kafka1
大多数操作,都需要在其他两台服务器上重新执行一遍,注意执行的时候修改ID,比如在另两台上分别执行 hostnamectl set-hostname kafka2 和 hostnamectl set-hostname kafka3。后面的例子也是一样。
执行完成后,记得退出重新登录系统。
安装epel源
使用yum命令进行安装时,系统自带的源可能比较老旧,此时可以先安装epel源。
# rpm -Uvh http://mirrors.kernel.org/fedora-epel/epel-release-latest-6.noarch.rpm
然后查看下现有源:
# yum repolist
在我的机器上,显示有23,449条记录。
安装java
kafka和zookeeper都是使用Java开发的,因此需要先在系统上安装Java。
# yum install -y java
安装nc和其他工具
netcat,一个简单而有用的工具,透过使用TCP或UDP协议的网络连接去读写数据。之所以叫做netcat,因为它是网络上的cat,它是一个功能强大的网络调试和探测工具,可以使用它来快速测试我们的组件是否安装、运作正常。
本文会使用这个工具来验证zookeeper和kafka是否安装成功。使用下面的命令进行安装:
# yum install -y nc
其他一些工具就不详细介绍了,大家可以自行百度:
# yum install -y wget ca-certificates zip net-tools vim tar
禁用Swap
zookeeper对于内存有比较高的要求,为了使zookeeper运行的更快,可以禁用掉Swap。
在linux里面,当物理内存不够用了,而又有新的程序请求分配内存,那么linux就会选择将其他程序暂时不用的数据交换到物理磁盘上(swap out),等程序要用的时候再读进来(swap in)。这样做的坏处显而易见,swap in/swap out这里的代价比较大,相比数据一直放在内存里面,多了读磁盘的操作,而磁盘IO的读取速度比内存慢10倍以上。
# sysctl vm.swappiness=1; \ echo 'vm.swappiness=1' | sudo tee --append /etc/sysctl.conf
因为有的Linux系统不支持将Swap设为0,因此这里将Swap设为1。
配置DNS
我们是要搭建一个有三台服务器的集群,如果直接使用ip进行配置,不方便也很容易眼花看错。像下面这样修改DNS配置,注意将ip改为你自己的服务器IP:
# echo "192.168.0.31 kafka1 192.168.0.31 zookeeper1 192.168.0.32 kafka2 192.168.0.32 zookeeper2 192.168.0.33 kafka3 192.168.0.33 zookeeper3" | sudo tee --append /etc/hosts
配置完成后,执行 ping -c 4 zookeeper1
,可以看到已经生效了。
ping -c 4 zookeeper1 PING zookeeper1 (192.168.0.31) 56(84) bytes of data. 64 bytes from kafka1 (192.168.0.31): icmp_seq=1 ttl=64 time=0.080 ms 64 bytes from kafka1 (192.168.0.31): icmp_seq=2 ttl=64 time=0.055 ms 64 bytes from kafka1 (192.168.0.31): icmp_seq=3 ttl=64 time=0.057 ms 64 bytes from kafka1 (192.168.0.31): icmp_seq=4 ttl=64 time=0.057 ms --- zookeeper1 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 2999ms rtt min/avg/max/mdev = 0.055/0.062/0.080/0.011 ms
安装和配置zookeeper
下载kafka压缩包
zookeeper本来是独立的、用于服务治理的组件,可以单独进行安装、独立部署。但是因为kafka强依赖于zookeeper,所以将它作为全家桶的一部分,和kafka的安装包放到一起了。
zookeeper的安装很简单,就是一个压缩包,只要下载kafka的压缩包到本地,然后解压即可:
mkdir -p ~/downloads; cd ~/downloads; \ wget http://mirror.bit.edu.cn/apache/kafka/1.1.0/kafka_2.11-1.1.0.tgz; \ mkdir -p /opt/kafka; tar -xvzf kafka_2.11-1.1.0.tgz -C /opt/kafka; \ cd /opt/kafka/kafka_2.11-1.1.0;
这里我下载了安装包,并解压到了/opt/kafka文件夹。
创建数据目录
新建一个/data/zookeeper文件夹,用于保存zookeeper产生的数据。在默认情况下,zookeeper将数据保存在 /tmp/zookeeper下。
# mkdir -p /data/zookeeper; \ chown -R root:root /data/zookeeper;
创建/data/log/zookeeper文件夹,用于保存zookeeper产生的日志。
# mkdir -p /data/log/zookeeper; \ chown -R root:root /data/log/zookeeper;
配置zookeeper
进入kafka的安装目录,cd /opt/kafka/kafka_2.11-1.1.0;
,zookeeper的默认配置位于 config/zookeeper.properties。可以使用cat命令查看一下:
# cat config/zookeeper.properties # 保存数据的位置 dataDir=/tmp/zookeeper # 客户端连接的端口号 clientPort=2181 # 客户端最大连接数,0表示不限制连接数 maxClientCnxns=0
如无特殊说明,后续操作均位于/opt/kafka/kafka_2.11-1.1.0目录下。
使用vim工具编辑zookeeper.properties,修改如下(或者本地编辑好,然后使用FTP上传覆盖):
# 数据文件 dataDir=/data/zookeeper # 日志文件,为了更好的性能,通常将日志文件挂载在单独的磁盘分区 dataLogDir=/data/log/zookeeper # 客户端连接的端口号 clientPort=2181 # 客户端最大连接数,0表示不限制连接数 maxClientCnxns=0 # 心跳超时时间单位ms,2秒 tickTime=2000 # 同步最大时长,10个心跳单位,也就是20秒 initLimit=10 # 请求收发最大时长,5个心跳单位,也就是10秒 syncLimit=5 # zoo服务器集群,还记得前面修改过DNS吧?(注意删除后两行,因为现在还没有配置) server.1=zookeeper1:2888:3888 server.2=zookeeper2:2888:3888 server.3=zookeeper3:2888:3888
2181端口用于客户端连接,2888和3888用于集群内的服务器之间通信。
配置zookeeper的Id
执行下面的命令,设置本台zookeeper的id:
echo "1" > /data/zookeeper/myid
启动zookeeper
在安装目录(/opt/kafka/kafka_2.11-1.1.0)下的bin文件夹中,包含了一系列的shell脚本,这些脚本用于管理zookeeper和kafka。执行下面的命令,启动zookeeper:
# bin/zookeeper-server-start.sh config/zookeeper.properties
此时,屏幕会被zookeeper的日志所填满,如果运行成功,只会看到INFO、WARN信息,如果出现ERROR信息,则说明存在异常,此时需要查看具体的异常信息。如果你一步步按我上面的执行,那么到现在这里是不应当出现异常的。
# bin/zookeeper-server-start.sh config/zookeeper.properties [2018-06-27 00:51:51,884] INFO Reading configuration from: config/zookeeper.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig) [2018-06-27 00:51:51,895] INFO Resolved hostname: zookeeper1 to address: zookeeper1/192.168.0.31 (org.apache.zookeeper.server.quorum.QuorumPeer) [2018-06-27 00:51:51,895] ERROR Invalid configuration, only one server specified (ignoring) (org.apache.zookeeper.server.quorum.QuorumPeerConfig) [2018-06-27 00:51:51,897] INFO autopurge.snapRetainCount set to 3 (org.apache.zookeeper.server.DatadirCleanupManager) [2018-06-27 00:51:51,897] INFO autopurge.purgeInterval set to 0 (org.apache.zookeeper.server.DatadirCleanupManager) [2018-06-27 00:51:51,897] INFO Purge task is not scheduled. (org.apache.zookeeper.server.DatadirCleanupManager) ... ... 以下省略100行
此时zookeeper是以前台方式运行,通常情况下,它都是以后台服务运行的,不阻塞控制台进程。可以这样启动zookeeper:
# bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
当以后台服务运行时,如果想要查看启动日志,可以执行下面的命令:
# cat logs/zookeeper.out | head -100
验证zookeeper正常运行
有好几种方式可以验证zookeeper是否正常运行。
可以使用系统的ps命令,查看zookeeper是否运行:
# ps aux | grep org.apache.zookeeper
也可以使用之前安装的nc工具:
# nc -vz localhost 2181; Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connected to ::1:2181. Ncat: 0 bytes sent, 0 bytes received in 0.02 seconds. # nc -vz zookeeper1 2181 Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.0.31:2181. Ncat: 0 bytes sent, 0 bytes received in 0.02 seconds.
除了验证localhost正常以外,一定要验证zookeeper1是否正常,当集群中的其他服务器搭建起来以后,也要验证是否可以从本机访问集群中的其他服务器。否则可能localhost通过了,但是因为防火墙的原因,zookeeper2不通过。
除了上面的方式以外,也可以通过下面这样使用nc命令验证是否正常:
# echo "ruok" | nc localhost 2181 ; echo
正常的话,将会返回imok,如果有异常,则什么都不会返回。
还可以使用下面的命令,查看当前的状态:
# echo "stat" | nc localhost 2181 ; echo Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT Clients: /0:0:0:0:0:0:0:1:44416[0](queued=0,recved=1,sent=0) Latency min/avg/max: 5/9/13 Received: 5 Sent: 4 Connections: 1 Outstanding: 0 Zxid: 0x2 Mode: standalone Node count: 4
停止zookeeper
停止zookeeper的运行比较简单,执行下面的shell即可:
# bin/zookeeper-server-stop.sh
至此,zookeeper的安装和配置告一段落,zookeeper作为一个独立的组件,可以有很多其他的应用。但在我司,仅将它和kafka搭配使用。而服务的治理、发现,则用另一个和zookeeper对等的组件:consul去实现。关于consul,我会另外写文章向大家介绍。
感谢阅读,希望这篇文章能给你带来帮助!