http://zookeeper.apache.org/releases.html下载最新稳定版的zookeeper
本例用的是zookeeper-3.4.8.tar.gz
先安装基本的软件:
#apt-get -y install gcc make lrzsz(xshell远程传输文件的软件)
在Ubuntu操作系统的 / 目录下创建应用目录:
#mkdir -p /data/app/
#cd /data/app/
Zookeeper伪分布式环境搭建:
#tar xzvf zookeeper-3.4.8.tar.gz -C /data/app/
创建三个集群节点:
#mv zookeeper-3.4.8 zookeeper-3.4.8-node1
#cp -r zookeeper-3.4.8-node1 zookeeper-3.4.8-node2
#cp -r zookeeper-3.4.8-node1 zookeeper-3.4.8-node3
创建数据存放路径:
#cd /data/
#mkdir -p zookeeper/zoo1 zookeeper/zoo2 zookeeper/zoo3
创建zookeeper软链接, 便于在不同版本之间切换
ln -s /data/app/zookeeper-3.4.8-node1 /data/app/zookeeper1
在/etc/profile.d目录下创建文件 zookeeper_env.sh, 内容如下:
#!/bin/bash
ZOOKEEPER_HOME=/data/app/zookeeper1
PATH=$ZOOKEEPER_HOME/bin:$PATH
#source /etc/profile
创建zoo.cfg文件:
#cd /data/app/zookeeper-3.4.8-node1(2、3)
#cd conf
#cp zoo_sample.cfg zoo.cfg
配置zoo.cfg文件:
#zookeeper-3.4.8-node1的配置
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/data/zookeepr/zoo1
server.1=192.168.92.131:2887:3887
server.2=192.168.92.131:2888:3888
server.3=192.168.92.131:2889:3889
#zookeeper-3.4.8-node2的配置
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2182
dataDir=/data/zookeepr/zoo2
server.1=192.168.92.131:2887:3887
server.2=192.168.92.131:2888:3888
server.3=192.168.92.131:2889:3889
#zookeeper-3.4.8-node3的配置
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2183
dataDir=/data/zookeepr/zoo3
server.1=192.168.92.131:2887:3887
server.2=192.168.92.131:2888:3888
server.3=192.168.92.131:2889:3889
参数说明:
tickTime=2000:
tickTime这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳;
initLimit=10:
initLimit这个配置项是用来配置Zookeeper接受客户端(这里所说的客户端不是用户连接Zookeeper服务器的客户端,而是Zookeeper服务器集群中连接到Leader的Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。
当已经超过10个心跳的时间(也就是tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒;
syncLimit=5:
syncLimit这个配置项标识Leader与Follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒;
dataDir=/data/zookeepr/zoo1
dataDir顾名思义就是Zookeeper保存数据的目录,默认情况下Zookeeper将写数据的日志文件也保存在这个目录里;
clientPort=2181
clientPort这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求;
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
server.A=B:C:D:
A是一个数字,表示这个是第几号服务器,B是这个服务器的ip地址
C第一个端口用来集群成员的信息交换,表示的是这个服务器与集群中的Leader服务器交换信息的端口
D是在leader挂掉时专门用来进行选举leader所用
创建ServerID标识:
除了修改zoo.cfg配置文件,集群模式下还要配置一个文件myid,这个文件在dataDir目录下,这个文件里面就有一个数据就是A的值,在上面配置文件中zoo.cfg中配置的dataDir路径中创建myid文件
#cd /data/zookeeper/zoo1
#vim myid
1
#cd /data/zookeeper/zoo2
#vim myid
2
#cd /data/zookeeper/zoo3
#vim myid
3
启动zookeeper:
#cd /data/app/zookeeper-3.4.8-node1/bin
#./zkServer.sh start
JMX enabled by default
Using config: /data/app/zookeeper-3.4.8-node1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
#cd /data/app/zookeeper-3.4.8-node2/bin
#./zkServer.sh start
JMX enabled by default
Using config: /data/app/zookeeper-3.4.8-node2/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
#cd /data/app/zookeeper-3.4.8-node3/bin
#./zkServer.sh start
JMX enabled by default
Using config: /data/app/zookeeper-3.4.8-node3/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
检查集群是否启动:
# echo stat|nc localhost 2181
# echo stat|nc localhost 2182
# echo stat|nc localhost 2183
或者:
#cd /data/app/zookeeper-3.4.8-node1/bin
#./zkCli.sh
#cd /data/app/zookeeper-3.4.8-node2/bin
#./zkCli.sh
#cd /data/app/zookeeper-3.4.8-node3/bin
#./zkCli.sh
伪集群部署注意事项:
在一台机器上部署了3个server;需要注意的是clientPort这个端口如果在1台机器上部署多个server,那么每台机器都要不同的clientPort.
比如 server.1是2181,server.2是2182,server.3是2183
最后几行唯一需要注意的地方就是
server.X 这个数字就是对应 data/myid中的数字。你在3个server的myid文件中分别写入了1,2,3,那么每个server中的zoo.cfg都配 server.1,server.2,server.3就OK了
以下是在三台不同的虚拟机上配置zookeeper集群:
在第一台虚拟机上安装配置zookeeper(192.168.92.131)
#tar xzvf zookeeper-3.4.8.tar.gz -C /data/app/
创建第一个节点:
#mv zookeeper-3.4.8 zookeeper-3.4.8-node1
创建数据存放路径:
#cd /data/
#mkdir -p zookeeper/zoo1
创建zoo.cfg文件:
#cd /data/app/zookeeper-3.4.8-node1
#cd conf
#cp zoo_sample.cfg zoo.cfg
配置zoo.cfg文件:
#zookeeper-3.4.8-node1的配置
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/data/zookeepr/zoo1
server.1=192.168.92.131:2887:3887
server.2=192.168.92.132:2888:3888
server.3=192.168.92.133:2889:3889
创建ServerID标识:
除了修改zoo.cfg配置文件,集群模式下还要配置一个文件myid,这个文件在dataDir目录下,这个文件里面就有一个数据就是A的值,在上面配置文件中zoo.cfg中配置的dataDir路径中创建myid文件
#cd /data/zookeeper/zoo1
#vim myid
1
将server1上已经配置好的/data/zookeeper/zoo1/和/data/app/zookeeper-3.4.8-node1目录分别拷贝至server2和server3。然后将其上的/data/zookeeper/zoo1/myid的内容修改为2和3.
分别启动zookeeper
注:启动第一台的时候可能会报错,提示zoo2和zoo3,等全部启动完成之后就不会报错了。
以下是还没有测试的:
1. 此处使用主机名而不是ip,因此需要在三台节点的 /etc/hosts中配置映射关系
192.168.17.130 masternode
192.168.17.131 worknode1
192.168.17.132 worknode2
2. 为了方便在不同节点上拷贝文件,此处配置ssh,互相交换公共密钥,示例:
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub masternode
ssh-copy-id -i ~/.ssh/id_rsa.pub worknode1
ssh-copy-id -i ~/.ssh/id_rsa.pub worknode2
实现三个节点两两之间相互无密码访问,然后使用scp命令进行拷贝
./zkServer.sh start启动一个server,这时会报大量错误?其实没什么关系,
因为现在集群只起了1台server,zookeeper服务器端起来会根据zoo.cfg的服务器列表发起选举leader的请求,
因为连不上其他机器而报错,那么当我们起第二个zookeeper实例后,leader将会被选出,
从而一致性服务开始可以使用,这是因为3台机器只要有2台可用就可以选出leader并且
对外提供服务(2n+1台机器,可以容n台机器挂掉)