前言
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,目前很多架构都基于它来实现配置维护、域名服务、分布式同步、组服务等等。
ZooKeeper的基本运转流程:
1.选举Leader
2.同步数据
3.选举Leader过程中算法有很多,但要达到的选举标准是一致的
4.Leader要具有最高的zxid
5.集群中大多数的机器得到响应并follow选出的Leader
环境说明
Zookeeper的部署主要是三种方式:单机模式、集群模式、伪集群模式,本文主要是伪集群模式的搭建过程(集群模式也类似)。
- 系统环境:Ubuntu 14.04、JDK1.8
- 所需工具:Zookeeper-3.4.9
下载zookeeper包
$ curl -O https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
新建5个空目录
$ mkdir -pv /zookeeper/server001
$ mkdir -pv /zookeeper/server002
$ mkdir -pv /zookeeper/server003
$ mkdir -pv /zookeeper/server004
$ mkdir -pv /zookeeper/server005
在每个目录中分别创建data和logs文件夹
解压下载的zookeeper包
$ tar zxvf zookeeper-3.4.9.tar.gz
修改配置文件
Zookeeper 的配置文件主要在conf目录,包括zoo.cfg (zoo_sample.cfg)
和log4j.properties
,修改 zoo_sample.cfg
,重命名为zoo.cfg
,打开zoo.cfg
,将内容修改为如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zookeeper/server001/data
dataLogDir=/zookeeper/server001/logs
clientPort=2181
server.1=127.0.0.1:8881:7771
server.2=127.0.0.1:8882:7772
server.3=127.0.0.1:8883:7773
server.4=127.0.0.1:8884:7774
server.5=127.0.0.1:8885:7775
参数说明:
tickTime:心跳时间,为了确保连接存在的,以毫秒为单位,最小超时时间为两个心跳时间
initLimit:多少个心跳时间内,允许其他server连接并初始化数据,如果ZooKeeper管理的数据较大,则应相应增大这个值
clientPort:服务的监听端口
dataDir:用于存放内存数据库快照的文件夹,同时用于集群的myid文件也存在这个文件夹里(注意:一个配置文件只能包含一个dataDir字样,即使它被注释掉了。)
dataLogDir:用于单独设置transaction log的目录,transaction log分离可以避免和普通log还有快照的竞争
syncLimit:多少个tickTime内,允许follower同步,如果follower落后太多,则会被丢弃。
server.A=B:C:D:
A是一个数字,表示这个是第几号服务器
B是这个服务器的ip地址
C第一个端口用来集群成员的信息交换,表示的是这个服务器与集群中的Leader服务器交换信息的端口
D是在Leader挂掉时专门用来进行选举Leader所用
将zookeeper文件夹拷贝到/zookeeper/server001/
下,并在 /zookeeper/server001/data/
下创建一个myid文件,内容为1
$ echo 1 | sudo dd of=/zookeeper/server001/data/myid
配置伪集群中的另外几台Zookeeper
继续修改~/zookeeper/
目录中的zookeeper配置文件文件中的dataDir、dataLogDir、clientPort配置(server002的配置文件,注意clientPort=2182
,与 server001 中的clientPort=2181
不同,后续修改配置均需设置不同的 clientPort),修改后内容如下:
tickTime=2000
initLimit=10