浅谈zookeeper分布式协调服务内部实现

安装及配置zookeeper

首先准备好你的完全分布式集群中的三台从节点虚拟机,利用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
浅谈zookeeper分布式协调服务内部实现_第1张图片
浅谈zookeeper分布式协调服务内部实现_第2张图片
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分布式协调服务内部实现

一、角色
通过以上的安装,并操作几个简单的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分布式协调服务内部实现_第3张图片
九、以elipse为例,创建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());
	}

}

你可能感兴趣的:(概念介绍)