目录
zk
zk本来是大数据这边的一个技术,解决服务与服务之间的协调工作.近年来各种集群涌现.集群每个节点之间的协调工作就成了一个问题.比如dubbo,kafka这些.这篇主要介绍zk集群的搭建.单节点参照我之前写过博客 : http://blog.csdn.net/shangmingtao/article/details/78008016
集群介绍
zk集群有个特点,半数以上节点存活整个集群就能正常提供服务.
举个栗子:
集群节点数为3个 : 一个leader两个follower,leader宕机会在两个follower中选一个作为新leader.集群可用
集群节点数为4个: 一个leader三个follower,leader宕机了,三个follower中的一个也宕机了.集群就不可用了(这里宕机了两台机器,剩下两台可用机器.不满足”以上”条件)
今天我们用三台机器搭建集群
server1:192.168.1.3
server2:192.168.1.5
server3:192.168.1.9
下载安装
下载地址(官方) :http://mirror.bit.edu.cn/apache/zookeeper/
cd /usr/local/
tar -xzvf zookeeper-3.4.6.tar.gz
cd zookeeper-3.4.6
mkdir data
mkdir logs
cd conf/
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
server1配置
zoo.cfg:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-3.4.6/data #数据目录,需要自己提前建好
dataLogDir=/usr/local/zookeeper-3.4.6/logs #日志目录,也需要自己提前建好
clientPort=2181
server.1=192.168.1.3:2888:3888 #这里的1下边讲是怎么来的
server.2=192.168.1.5:2888:3888
server.3=192.168.1.9:2888:3888
配置本机id
cd /usr/local/zookeeper-3.4.6/data #zoo.cfg中的dataDir
echo "1" > myid #这里的"1"代表本机id,如果本机是192.168.1.5那就应该是"2" > myid
启动集群
这里我为了省事没有配置环境变量,大家有需要还是到我写的第一篇去找怎么配吧.
cd /usr/local/zookeeper-3.4.6/bin
./zkServer.sh start #启动
./zkServer.sh stop #停止
./zkServer.sh status #查询节点状态
检查集群是否搭建成功
通过./zkServer.sh status
命令我们可以看到如下信息
leader :
[root@yqtpro60 bin]# ./zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
follower:
[root@template bin]# ./zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
防火墙配置
这里防火墙我们要开启三个端口分别是:
2181 : 客户端访问zk server的端口
2888 : zk节点与节点间互访的端口
3888 : zk与其他应用程序通讯端口
配置方法 :
Step 1 : vi /etc/sysconfig/iptables
Step 2 : 添加如下三行
-A INPUT -s 192.168.1.6/24 -p tcp -m tcp --dport 2888 -j ACCEPT
-A INPUT -s 192.168.1.6/24 -p tcp -m tcp --dport 3888 -j ACCEPT
-A INPUT -s 192.168.1.6/24 -p tcp -m tcp --dport 2181 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -j ACCEPT #这条太关键了,下边讲
Step 3 :service iptables restart
经过如上配置我们现在允许所有192.168.1.*的机器对本机的2181,2888,3888端口的访问,同时允许本机所有访问.大家注意啊,这是一个内网配置方案 , 如果需要外网访问需要放行外网ip为源地址包.大家自行配置.
最后说下-A INPUT -s 127.0.0.1/32 -j ACCEPT
为什么重要.昨天我在配置集群时候发现其中一台机器不论如何执行./zkServer.sh status
都不能正常输入结果.输出的信心如下:
[root@template bin]# ./zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
通过查看bin目录下的zookeeper.out
日志输出文件发现有这样两行
2018-03-15 09:55:04,384 [myid:1] - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxnFactory@197] - Accepted socket connection from /127.0.0.1:53084
2018-03-15 09:55:04,386 [myid:1] - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@827] - Processing srvr command from /127.0.0.1:53084
2018-03-15 09:55:04,388 [myid:1] - INFO [Thread-17:NIOServerCnxn@1007] - Closed socket connection for client /127.0.0.1:53084 (no session established for client)
这个问题也是折腾了我两个多小时(有点尴尬),当我们通过./zkServer.sh status
查看节点状态时,我们发起一个源ip为:127.0.0.1 源port:53084 目的ip:127.0.0.1 目的port:2181的tcp连接.那如果我们不配置-A INPUT -s 127.0.0.1/32 -j ACCEPT
,这样的包是过去防火墙的.所以最终导致Error contacting service. It is probably not running.
但即便如此我们的集群工作是正常的.只是./zkServer.sh status
的命令执行出现了问题.