前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kafka分布式消息系统(搭建Zookeeper集群) - Part.2

Kafka分布式消息系统(搭建Zookeeper集群) - Part.2

作者头像
张子阳
发布2018-09-30 09:56:12
1.5K0
发布2018-09-30 09:56:12
举报
文章被收录于专栏:分布式系统和大数据处理

Kafka分布式消息系统(搭建Zookeeper集群) - Part.2

2018-6-26 作者: 张子阳 分类: 分布式系统

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。

代码语言:txt
复制
# hostnamectl set-hostname kafka1

大多数操作,都需要在其他两台服务器上重新执行一遍,注意执行的时候修改ID,比如在另两台上分别执行 hostnamectl set-hostname kafka2 和 hostnamectl set-hostname kafka3。后面的例子也是一样。

执行完成后,记得退出重新登录系统。

安装epel源

使用yum命令进行安装时,系统自带的源可能比较老旧,此时可以先安装epel源。

代码语言:txt
复制
# rpm -Uvh http://mirrors.kernel.org/fedora-epel/epel-release-latest-6.noarch.rpm

然后查看下现有源:

代码语言:txt
复制
# yum repolist

在我的机器上,显示有23,449条记录。

安装java

kafka和zookeeper都是使用Java开发的,因此需要先在系统上安装Java。

代码语言:txt
复制
# yum install -y java

安装nc和其他工具

netcat,一个简单而有用的工具,透过使用TCP或UDP协议的网络连接去读写数据。之所以叫做netcat,因为它是网络上的cat,它是一个功能强大的网络调试和探测工具,可以使用它来快速测试我们的组件是否安装、运作正常。

本文会使用这个工具来验证zookeeper和kafka是否安装成功。使用下面的命令进行安装:

代码语言:txt
复制
# yum install -y nc

其他一些工具就不详细介绍了,大家可以自行百度:

代码语言:txt
复制
# 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倍以上。

代码语言:txt
复制
# sysctl vm.swappiness=1; \
echo 'vm.swappiness=1' | sudo tee --append /etc/sysctl.conf

因为有的Linux系统不支持将Swap设为0,因此这里将Swap设为1。

配置DNS

我们是要搭建一个有三台服务器的集群,如果直接使用ip进行配置,不方便也很容易眼花看错。像下面这样修改DNS配置,注意将ip改为你自己的服务器IP:

代码语言:txt
复制
# 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 ,可以看到已经生效了。

代码语言:txt
复制
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的压缩包到本地,然后解压即可:

代码语言:txt
复制
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下。

代码语言:txt
复制
# mkdir -p /data/zookeeper; \
chown -R root:root /data/zookeeper;

创建/data/log/zookeeper文件夹,用于保存zookeeper产生的日志。

代码语言:txt
复制
# 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命令查看一下:

代码语言:txt
复制
# cat config/zookeeper.properties
# 保存数据的位置
dataDir=/tmp/zookeeper

# 客户端连接的端口号
clientPort=2181

# 客户端最大连接数,0表示不限制连接数
maxClientCnxns=0

如无特殊说明,后续操作均位于/opt/kafka/kafka_2.11-1.1.0目录下。

使用vim工具编辑zookeeper.properties,修改如下(或者本地编辑好,然后使用FTP上传覆盖):

代码语言:txt
复制
# 数据文件    
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:

代码语言:txt
复制
echo "1" > /data/zookeeper/myid

启动zookeeper

在安装目录(/opt/kafka/kafka_2.11-1.1.0)下的bin文件夹中,包含了一系列的shell脚本,这些脚本用于管理zookeeper和kafka。执行下面的命令,启动zookeeper:

代码语言:txt
复制
# bin/zookeeper-server-start.sh config/zookeeper.properties

此时,屏幕会被zookeeper的日志所填满,如果运行成功,只会看到INFO、WARN信息,如果出现ERROR信息,则说明存在异常,此时需要查看具体的异常信息。如果你一步步按我上面的执行,那么到现在这里是不应当出现异常的。

代码语言:txt
复制
# 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:

代码语言:txt
复制
# bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

当以后台服务运行时,如果想要查看启动日志,可以执行下面的命令:

代码语言:txt
复制
# cat logs/zookeeper.out | head -100

验证zookeeper正常运行

有好几种方式可以验证zookeeper是否正常运行。

可以使用系统的ps命令,查看zookeeper是否运行:

代码语言:txt
复制
# ps aux | grep org.apache.zookeeper

也可以使用之前安装的nc工具:

代码语言:txt
复制
# 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命令验证是否正常:

代码语言:txt
复制
# echo "ruok" | nc localhost 2181 ; echo

正常的话,将会返回imok,如果有异常,则什么都不会返回。

还可以使用下面的命令,查看当前的状态:

代码语言:txt
复制
# 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即可:

代码语言:txt
复制
# bin/zookeeper-server-stop.sh

至此,zookeeper的安装和配置告一段落,zookeeper作为一个独立的组件,可以有很多其他的应用。但在我司,仅将它和kafka搭配使用。而服务的治理、发现,则用另一个和zookeeper对等的组件:consul去实现。关于consul,我会另外写文章向大家介绍。

感谢阅读,希望这篇文章能给你带来帮助!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-6-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Kafka分布式消息系统(搭建Zookeeper集群) - Part.2
    • 配置运行环境
      • 修改主机名
      • 安装epel源
      • 安装java
      • 安装nc和其他工具
      • 禁用Swap
      • 配置DNS
    • 安装和配置zookeeper
      • 下载kafka压缩包
      • 创建数据目录
      • 配置zookeeper
      • 配置zookeeper的Id
    • 启动zookeeper
      • 验证zookeeper正常运行
        • 停止zookeeper
        相关产品与服务
        消息队列 CKafka 版
        消息队列 CKafka 版(TDMQ for CKafka)是一个分布式、高吞吐量、高可扩展性的消息系统,100%兼容开源 Kafka API 2.4、2.8、3.2 版本。CKafka 基于发布/订阅模式,通过消息解耦,使生产者和消费者异步交互,无需彼此等待。CKafka 具有高可用、数据压缩、同时支持离线和实时数据处理等优点,适用于日志压缩收集、监控数据聚合、流式数据集成等场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档