首先准备好你的完全分布式集群中的三台从节点虚拟机,利用xftp或命令rz上传zookeeper压缩包并压缩到你的统一解压软件目录下。
小技巧:可以先配好一台虚拟机,利用命令scp发送zookeeper配置文件到另外的虚拟机。
配置zookeeper环境变量
vi /etc/profile
source /etc/profile
配置完环境变量一定要让它生效!!!!
配置完环境变量一定要让它生效!!!!
配置完环境变量一定要让它生效!!!!
切换到zookeeper下的conf目录,重命名文件zoo_sample.cfg为zoo.cfg
cp zoo_sample.cfg zoo.cfg
配置zoo.cfg vi zoo.cfg
dataDir为自创建zookeeper数据目录,这个事随意创建的。
要分别在三台虚拟机中创建此目录,并配置各自的myid,对应上图的server后的数字id。
echo 1 > myid
echo 2 > myid
echo 3 > myid
myid一定不要配置错!!!
启动zookeeper集群命令,三节点分别启动
zkServer.sh start
查看zookeeper集群各节点状态命令
zkServcer,sh status
停止命令
zkServer.sh stop
安装完成了,也该讲讲zookeeper内部是如何实现的
一、角色
通过以上的安装,并操作几个简单的zookeeper命令,你肯定发现了,在执行查看状态命令时出现了不同的两个单词,leader和follower。
没错这俩就是zookeeper角色。
leader 是领导者,他用来发起一个请求并且投票
follower 是跟从者,他用来响应leader的请求并发起投票
PS:投票作用的如果leader死掉时,zookeeper集群中会投票选举出leader
另外还有一个监视leader的角色
observer 用来监视leader,并将leader的状态告诉给follower
二、原子广播
① 有一个写入请求,将请求传给follower
② follower将请求转发给leader
③ leader将请求下发到各个follower,进行投票
④ follower将自己的想法返回给leader
一直在说投票,那么投票是根据什么来进行的呢?
三、选举机制
每个follower都具有两个属性
id---------------serverid,这个就是之前设置的myid,也可以理解为每个公司中员工的资历
zxid------------(可以理解为股份),逻辑时钟,没进行一次投票周期该值都会加1
PS:根据逻辑时钟判断当前的选举状态
PS:投票还遵循的一点是少数服从多数,即过半原则(另外,我们的zookeeper节点最好是单数)
四、zab协议
zookeeper在有序的进行,但他都基于一种协议----------zab协议,也可以说是两种工作模式。
zab协议有两种模式
① 广播模式 已经选举出来的leader,开始对外提供服务,即原子广播。
② 恢复模式 此时的情景是还没有leader(集群刚启动或leader死了新的还没起来)
这是由四种初始角色:
looking 观望
following 跟从但有想法,也就是follower
leading 继承人(准备被继承),也就是leader
observing 监视leader的observer
五、znode
znode是zookeeper自己的文件系统。
① 持久节点
② 临时节点
③ 持久顺序节点
④ 临时顺序节点
六、特性
① 最终一致性:即使在写入的过程中有节点连接不上,当恢复时还是会把节点上的数据写入
② 原子性:事务要么成功要么失败,不会发生局部性
③ 可靠性:每次对zookeeper的操作都会保存在服务端上
④ 实时性:客户端可以读取到zookeeper上的实时数据
⑤ 顺序
⑥ 单一视图:客户端在连接zookeeper中的任意节点上的数据都是一致的
七、监听机制
follower查看leader状态,然后将状态信息进行更新和发送。
八、虚拟机中启动客户端
zkCli.sh -server ip:prot
ip是任意节点ip地址,port为2181,是zookeeper客户端默认端口号
下面是一些zookeeper客户端中一些常用的命令
zookeeper客户端监听机制是为了当znode发生改变时,监听一下,但只能监听一次。
package com.mahaowei.testwatcher;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
/**
* @作者:MHWNB
* @时间:2019年6月18日
*/
public class testWatcher implements Watcher {
public static void main(String[] args) throws Exception {
ZooKeeper client = new ZooKeeper("192.168.145.133:2181",1000,new testWatcher());
byte[] bs = client.getData("/hilll",new testWatcher(),null);
System.out.println(new String(bs));
Thread.sleep(Long.MAX_VALUE);
}
@Override
public void process(WatchedEvent event) {
System.out.println("=============" + event.getState());
}
}