zookeeper集群搭建

机器分布

ip 结点 作用
10.1.1.185 namenode master
10.1.1.111 datanode111 slave
10.1.1.196 datanode196 slave
10.1.1.197 datanode197 slave
10.1.1.198 datanode198 slave
10.1.1.199 datanode199 slave
10.1.1.200 datanode200 slave
10.1.1.201 datanode201 slave
10.1.1.202 datanode202 slave

配置

tickTime

tickTime=2000

Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔(milliseconds),也就是每个 tickTime 时间就会发送一个心跳

initLimit

initLimit=10

zookeeper集群中的包含多台server, 其中一台为leader, 集群中其余的server为follower. initLimit参数配置初始化连接时, follower和leader之间的最长心跳时间. 此时该参数设置为5, 说明时间限制为5倍tickTime, 即5*2000=10000ms=10s.

syncLimit

syncLimit=5

该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为2, 说明时间限制为2倍tickTime, 即4000ms.

dataDir

dataDir=/data/zookeeper_data

该参数指定存储数据快照的目录

dataLogDir

日志目录,如果不指定的话使用dataDIr目录的值

clientPort

clientPort=2181

the port at which the clients will connect

maxClientCnxns

maxClientCnxns=500

于指定服务器端最大的连接数

server.A=B:C:D

server.1=namenode:2888:3888

server.2=datanode111:2888:3888

server.3=datanode196:2888:3888

server.4=datanode197:2888:3888

server.5=datanode198:2888:3888

server.6=datanode199:2888:3888

server.7=datanode200:2888:3888

server.8=datanode201:2888:3888

server.9=datanode202:2888:3888

A:即为集群中server的id标示,很多地方用到它,如选举过程中,就是通过id来识别是哪台服务器的投票。如初始化sessionId的时候,也用到id来防止sessionId出现重复。

B:即该服务器的host地址或者ip地址。

C:一旦Leader选举成功后,非Leader服务器都要和Leader服务器建立tcp连接进行通信。该通信端口即为C。

D:在Leader选举阶段,每个服务器之间相互连接,进行投票选举的事宜,D即为投票选举时的通信端口。

另: 要求在dataDir目录中创建一个myid文件,里面写上上述serverid中的一个id值,即表明某台服务器所属的编号。

同步配置

1、复制一份配置到各台机器

2、创建目录, mkdir -p /data/zookeeper_data;chown hadoop.hadoop -R /data/zookeeper_data

3、在各台机器上,创建文件myid

环境变量

export JAVA_HOME=/usr/local/jdk1.7.0_79/
export PATH=$JAVA_HOME/bin:$PATH 

必须的,添加不必重复添加

启动与检查

启动得手动到各台机器运行:

bin/zkServer.sh start

当集群机器很多时,你需要自主写启动脚本,批量启动:

#!/bin/bash
ZK_HOME=/data/hadoop/zookeeper-3.4.8
SSH_ENV=" -p 22 -q "
if [ -n $1 ];then
    action=$1
else
    action=status
fi
echo "$action zkServer…"
for i in 10.1.1.185 10.1.1.111 10.1.1.196 10.1.1.197 10.1.1.198 10.1.1.199 10.1.1.200 10.1.1.201 10.1.1.202
do
echo $i
ssh $SSH_ENV $i "$ZK_HOME/bin/zkServer.sh $action"
done
# namenode 上查看,只监听了3888端口
[hadoop@namenode zookeeper-3.4.8]$  netstat -na|grep 888
tcp        0      0 10.1.1.185:22003            10.1.80.122:58886           ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.185:3888      :::*                        LISTEN      
tcp        0      0 ::ffff:10.1.1.185:3888      ::ffff:10.1.1.199:25975     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.185:3888      ::ffff:10.1.1.201:11027     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.185:3888      ::ffff:10.1.1.111:20332     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.185:3888      ::ffff:10.1.1.197:54407     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.185:3888      ::ffff:10.1.1.200:30329     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.185:3888      ::ffff:10.1.1.202:3644      ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.185:28405     ::ffff:10.1.1.198:2888      ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.185:3888      ::ffff:10.1.1.198:58670     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.185:3888      ::ffff:10.1.1.196:13981     ESTABLISHED 
# 查看datanode198,监听了2888与3888端口,
# 而其他的与namenode机器上的一样,只监听了3888端口
[hadoop@datanode198 zookeeper-3.4.8]$  netstat -na|grep 888
tcp        0      0 ::ffff:10.1.1.198:2888      :::*                        LISTEN      
tcp        0      0 ::ffff:10.1.1.198:3888      :::*                        LISTEN      
tcp        0      0 ::ffff:10.1.1.198:2888      ::ffff:10.1.1.200:44297     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:2888      ::ffff:10.1.1.202:21779     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:2888      ::ffff:10.1.1.196:6190      ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:3888      ::ffff:10.1.1.202:17785     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:48136     ::ffff:10.1.1.196:3888      ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:3888      ::ffff:10.1.1.200:58028     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:2888      ::ffff:10.1.1.111:8897      ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:2888      ::ffff:10.1.1.197:19055     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:24218     ::ffff:10.1.1.197:3888      ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:2888      ::ffff:10.1.1.185:28405     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:3888      ::ffff:10.1.1.201:39047     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:2888      ::ffff:10.1.1.201:62869     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:58670     ::ffff:10.1.1.185:3888      ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:3888      ::ffff:10.1.1.199:11938     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:2888      ::ffff:10.1.1.199:33511     ESTABLISHED 
tcp        0      0 ::ffff:10.1.1.198:27643     ::ffff:10.1.1.111:3888      ESTABLISHED 

结论:Leader 选择datanode198为主结点,其他都为slave

#查看状态
./bin/zkServer.sh status
#namenode是follower
[hadoop@namenode zookeeper-3.4.8]$ ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/hadoop/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: follower
#datanode198 是leader
[hadoop@datanode198 zookeeper-3.4.8]$ ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /data/hadoop/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: leader
#全部查看
[hadoop@namenode zookeeper-3.4.8]$ sh start_all.sh status
status zkServer…
10.1.1.185
ZooKeeper JMX enabled by default
Using config: /data/hadoop/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: follower
10.1.1.111
ZooKeeper JMX enabled by default
Using config: /data/hadoop/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: follower
10.1.1.196
ZooKeeper JMX enabled by default
Using config: /data/hadoop/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: follower
10.1.1.197
ZooKeeper JMX enabled by default
Using config: /data/hadoop/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: follower
10.1.1.198
ZooKeeper JMX enabled by default
Using config: /data/hadoop/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: leader
10.1.1.199
ZooKeeper JMX enabled by default
Using config: /data/hadoop/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: follower
10.1.1.200
ZooKeeper JMX enabled by default
Using config: /data/hadoop/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: follower
10.1.1.201
ZooKeeper JMX enabled by default
Using config: /data/hadoop/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: follower
10.1.1.202
ZooKeeper JMX enabled by default
Using config: /data/hadoop/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: follower

问题与解决方法

1、启动时失败 - /data/zookeeper_data/myid file is missing

请在dataDir目录中创建一个myid文件,写入serverid;注意必须都创建,因为启动时会跑到各机器检测

echo 1 > /data/zookeeper_data/myid

2、如果还失败,请查看是否为防火墙的原因

3、提示JAVA_HOME环境变量没有检测到

在运行的用户的home目录下的(我这里是/home/hadoop/), ~/.bashrc添加

export JAVA_HOME=/usr/local/jdk1.7.0_25/
export PATH=$PATH:$JAVA_HOME/bin