ZooKeeper集群由一组Server节点组成,这一组Server节点中存在一个角色为Leader的节点,其余节点都为Follower。当客户端Client链接到ZooKeeper集群,而且执行写请求时,这些请求会被发送到Leader节点上,而后Leader节点上数据变动会同步到集群中其余的Follower节点。html
ZooKeeper采用一种称为Leader election的选举算法(也有称作:分布式选举算法-Paxos)的。在整个集群运行过程当中,只有一个Leader,其余的都是Follower,若是ZooKeeper集群在运行过程当中Leader出了问题,系统会采用该算法从新选出一个Leader,java
ZooKeeper用于三台以上的服务器集群之中,只要还有超过半数的服务器在线,ZooKeeper就可以正常提供服务,过半,意味着实际可以有效参与选举的节点数量是奇书个数,否者不能有效的过半linux
Zookeeper逻辑图以下,算法
我这里使用的是在VMWare中安装centos7每一个虚拟机都选择桥接模式。便可在网络中独立分配一个IP,每台机器单独设定一个IP。apache
192.168.137.122 master 192.168.137.123 slave1 192.168.137.124 slave2
systemctl status firewalld.service #检查防火墙状态 systemctl stop firewalld.service #关闭防火墙 systemctl disable firewalld.service #禁止开机启动防火墙
#SELINUX=enforcing #注释掉 #SELINUXTYPE=targeted #注释掉 SELINUX=disabled #增长
setenforce 0 #使配置当即生效
略centos
在此处为了方便,我将全部网内的节点机器都互相能SSH无密钥登陆,能够理解为双向无密钥登陆。服务器
ssh-keygen -t rsa #生成密钥,一路回车便可,只适用于测试环境,正式环境请设定密码
scp ~/.ssh/id_rsa.pub master:~/.ssh/slave1.id_rsa.pub #在slave1中,将公钥文件传输至master机器上,并修改文件名为slave1.id_rsa.pub scp ~/.ssh/id_rsa.pub master:~/.ssh/slave2.id_rsa.pub #在slave2中,将公钥文件传输至master机器上,并修改文件名为slave2.id_rsa.pub
cd ~/.ssh cat id_rsa.pub >> authorized_keys #这个是master生成的公钥,就在本机 cat slave1.id_rsa.pub >> authorized_keys cat slave2.id_rsa.pub >> authorized_keys
完成后可使用rm -f slave1.id_rsa.pub删除拷贝过来的秘钥文件网络
scp authorized_keys root@master1:~/.ssh scp authorized_keys root@master2:~/.ssh
authorized_keys是公钥的字典文件,这样下来全部的,全部节点的authorized_keys文件中记录的秘钥都相同了,由于能够实现每一个机器的ssh互通了。架构
zookeeper安装很是简单,只要获取到 Zookeeper 的压缩包并解压到某个目录,修改一下配置便可。app
tar -zxvf zookeeper-3.4.8.tar.gz
mv zookeeper-3.4.8 /home/zookeeper #这里能够指定你喜欢的任意目录
# set zookeeperpath export ZOOKEEPER_HOME=/home/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin
cp /home/zookeeper/conf/zoo_sample.cfg /home/zookeeper/conf/zoo.cfg
# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/home/zookeeper/zkdata dataLogDir=/home/zookeeper/zklog # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 server.1=master:2888:3888 server.2=slaver1:2888:3888 server.3=slaver2:2888:3888
tickTime: zookeeper中使用的基本时间单位, 毫秒值.
dataDir: 数据目录. 能够是任意目录.
dataLogDir: log目录, 一样能够是任意目录. 若是没有设置该参数, 将使用和dataDir相同的设置.
clientPort: 监听client链接的端口号.
nitLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户链接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中链接到 Leader 的 Follower 服务器)初始化链接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器尚未收到客户端的返回信息,那么代表这个客户端链接失败。总的时间长度就是 5*2000=10 秒
syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,须要一个端口来从新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通讯的端口。若是是伪集群的配置方式,因为 B 都是同样,因此不一样的 Zookeeper 实例通讯端口号不能同样,因此要给它们分配不一样的端口号。
scp /home/zookeeper root@master1: /home/ scp /home/zookeeper root@master2: /home/
完成后,只需在其余节点上修改vi /etc/profile,以及对应的myid,便可
4,启动Zookeeper集群
cd /home/zookeeper bin/zkServer.sh start
正常会显示以下状态
bin/zkServer.sh -status
如显示一下状态表示启动失败