最近正在搭建第二个数据中心,学习一下zookeeper的搭建和扩容


简介

Zookeeper是Apache的一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization),命名服务(Naming Service),集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务.ZooKeeper本身可以以Standalone模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性.

搭建

单机模式

1.下载地址(https://archive.apache.org/dist/zookeeper/)

由于公司之前使用的是3.4.6,所以下载时需要选定版本,这一次搭建全使用这个版本

wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
# 解压
tar -zxvf ./zookeeper-3.4.6.tar.gz

2.配置环境变量

vim ~/.bashrc
# 添加
export ZOOKEEPER_HOME=/root/zookeeper-3.4.6
export PATH=$PATH:$ZOOKEEPER_HOME/bin
# 加载
source ~/.bashrc

3.编写配置文件

cp $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg
# 创建data目录
mkdir -p $ZOOKEEPER_HOME/data
vim $ZOOKEEPER_HOME/conf/zoo.cfg
# 文件内容如下
# tickTime ZK中的一个时间单元。ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的。例如,session的最小超时时间是2*tickTime
tickTime=2000
# initLimit Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允许F在 initLimit 时间内完成这个工作
initLimit=10
# syncLimit 在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果L发出心跳包在syncLimit之后,还没有从F那收到响应,那么就认为这个F已经不在线了
syncLimit=5
dataDir=/root/zookeeper-3.4.6/data
clientPort=2181

4.启动单机zookeeper

# 启动
zkServer.sh start

JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

# 查询进程
jps
14484 Jps
14303 QuorumPeerMain

# 查询状态
zkServer.sh status
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: standalone

5.连接zookeeper验证

zkCli.sh 

Welcome to ZooKeeper!
2018-07-10 16:13:20,172 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@975] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2018-07-10 16:13:20,227 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@852] - Socket connection established to localhost/127.0.0.1:2181, initiating session
2018-07-10 16:13:20,234 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x164833edba60001, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1]

集群模式

1.机器列表

hostname ip
server1 10.10.80.46
server2 10.10.80.74
server3 10.10.80.75

2.下载,解压,配置环境变量,与单机相同

3.编写配置文件

这里要指定所有server的地址

server.n=hostname:port1:port2

server.服务器ID=服务器(IP/主机名):跟随者连接领导者的端口:被用于领导者选举的端口

cat zoo.cfg

tickTime=2000                                                   
initLimit=10                                                    
syncLimit=5                                                     
dataDir=/root/zookeeper-3.4.6/data                              
dataLogDir=/root/zookeeper-3.4.6/logs                           
clientPort=2181                                                 
# 保留文件数量
autopurge.snapRetainCount=3 
# 自动清理,单位是小时
autopurge.purgeInterval=1   
snapCount=1000000
                                                                
server.1=10.10.80.46:2888:3888                                  
server.2=10.10.80.74:2888:3888                                  
server.3=10.10.80.75:2888:3888                                  

4.设置myid

数字就是配置文件中的server.X

[root@server1 data] echo 1 > myid
[root@server2 data] echo 2 > myid
[root@server3 data] echo 3 > myid

5.启动集群

[root@server1 bin] ./zkServer.sh start
[root@server2 bin] ./zkServer.sh start
[root@server3 bin] ./zkServer.sh start

6.验证集群

可以使用zookeeper的四字命令,如果没有nc,可以先装一个sudo yum install -y nc

[root@server1 bin] echo ruok | nc 10.10.80.46 2181
imok
[root@server1 bin] echo ruok | nc 10.10.80.74 2181
imok
[root@server1 bin] echo ruok | nc 10.10.80.75 2181
imok

或者使用status命令

[root@server1 bin] zkServer.sh status
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
[root@server2 bin] ./zkServer.sh status
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
[root@server3 bin] ./zkServer.sh status
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

可以看出server2是作为leader

集群扩容

1.新增三台机器,添加配置文件

hostname ip
server4 10.10.80.81
server5 10.10.80.82
server6 10.10.80.88

步骤与之前相同,填写配置文件

zookeeper需要两两建立连接,是由myid大的去连接小的,所以重启的时候从myid小的开始

cat zoo.cfg

tickTime=2000                                                   
initLimit=10                                                    
syncLimit=5                                                     
dataDir=/root/zookeeper-3.4.6/data                              
dataLogDir=/root/zookeeper-3.4.6/logs                           
clientPort=2181                                                 
# 保留文件数量
autopurge.snapRetainCount=3 
# 自动清理,单位是小时
autopurge.purgeInterval=1   
snapCount=1000000
                                                                
server.1=10.10.80.46:2888:3888                                  
server.2=10.10.80.74:2888:3888                                  
server.3=10.10.80.75:2888:3888       
server.4=10.10.80.81:2888:3888
server.5=10.10.80.82:2888:3888
server.6=10.10.80.88:2888:3888

2.先启动新的三台

[root@server4 bin] ./zkServer.sh start
[root@server5 bin] ./zkServer.sh start
[root@server6 bin] ./zkServer.sh start

这时候发现他们三台并不能用

[root@server1 conf] echo stat | nc 10.10.80.81 2181
This ZooKeeper instance is not currently serving requests

3.重启原来的三台

[root@server1 bin] ./zkServer.sh restart
[root@server2 bin] ./zkServer.sh restart
[root@server3 bin] ./zkServer.sh restart

检查当前的状态

[root@server1 bin] ./zkServer.sh status
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader

[root@server2 bin] ./zkServer.sh status
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

[root@server3 bin] ./zkServer.sh status
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

[root@server4 bin] ./zkServer.sh status
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

[root@server5 bin] ./zkServer.sh status
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

[root@server6 bin] ./zkServer.sh status
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

至此,扩容完成