zookeeper 学习总结

cap :一致性 可用性 分区容错性

BASE原理 :基本可用 + 软状态(同步允许延迟)+最终一致性


一致性协议:2PC(2阶段提交)+3PC(3阶段提交)

3PC = canCommit + preCommit + doCommit

PAXOS引入过半的原则  只要过半通过则通过

zookeeper为分布式应用提供了高效可靠的分布式协调服务

zookeeper采用 zab协议  zookeeper atomic broadcast

zookeeper是分布式数据一致性的解决方案 

单一视图:客户端不管连接哪个服务器看到的视图都一致

zookeeper保证最终一致性

zookeeper将全量数据存储到内存中  实现高吞吐和低延迟


只要集群中有一半机器对外服务 则可以对外服务

zk 有三个角色 :leader + foller + observer    foller和observer都可以对外提供读服务 当只有foller才能选举


znode分临时节点和持久节点  

持久节点需要主动删除才能删除

临时节点与客户端连接服务器会话的时间有关  一旦客户端断开则节点删除 

每个znode都会维护一个stat的数据结构  里面维护这三个版本 : version(znode版本)+cversion(znode子节点版本)+aversion(znode acl版本)

watcher 允许在节点注册客户端感兴趣的事件

acl=access control list 权限控制集合 = CREATE READ WRITE DELETE ADMIN	

zookeeper主要依赖zab进行数据的一致性

zab只允许一个主进程来接受所有客户端的所有请求 并采用zab协议将事务发布到副本进程中去。


所有的事务请求都只能由leader服务器进行转换成事务 并将事务分发给所有foller进行提议 过半则通过 

zab协议分为崩溃恢复(选举新leader)和消息广播 

leader服务器会为每一个事务proposal分配一个事务id(zxid)

zxid 由64位组成  低32位是简单的单调递增的计数器 用于记录客户端每次的请求id  高32位用于储存每次选举出来的epoch值+1


zab协议是zk的核心所在 其规定了任何时候只有一个主进程进行消息广播,主进程失效后必须选举一个新leader

zab协议分三个阶段:发现(looking 选举) + 同步(最后的事务) + 广播 (接受客户端的响应)
 
leader进程与follower进程通过心跳检测机制进行交流   

leader在超时时间内无法获得过半follower的心跳 则进入looking状态(重新选举)

zab协议中每个事务proposal都有一个epoch值表示当前的leader周期  




使用zk
---------------------------------------
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.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# 镜像数据位置
dataDir=D:\\zookeeper\\data\\zookeeper
#日志位置
dataLogDir=D:\\zookeeper\\logs\\zookeeper
#客户端连接的端口
clientPort=2181
#集群中  格式:server.id=ip:port:port
server.1=ip1:2888:3888
server.2=ip2:2888:3888
server.3=ip3:2888:3888

集群中所有的zoo.cfg文件都是一致

在dataDir下面生成一个myid文件 内容就是zoo.cfg中id的值如1 只有一个数字


create -s 顺序节点 -e 临时节点  默认不加则是持久化节点 

ls / 进行查看

get path 用于获取节点内容 

set path value 用于更新节点内容

delete path 用于删除节点 


权限控制:通过在节点中设置acl权限控制访问


zookeeper.addAuthInfo("digest","username:password");// 类似 用户名:密码格式
zookeeper.create(path,value,Ids.CREATOR_ALL_ACL,NodeType);

try {
	// 建立一个连接
	ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 5000, null);
	System.out.println(zk.getState());
	zk.addAuthInfo("digest", "lanwx:123".getBytes());
	//zk.create("/zk-lanwx/childss", "lan".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
	// 无权限
	ZooKeeper zk1 = new ZooKeeper("127.0.0.1:2181", 5000, null);
	System.out.println(new String(zk1.getData("/zk-lanwx/childss", null, null)));
} catch (Exception e) {
	e.printStackTrace();
}




Curator可以很好的作为zookeeper的客户端API可用于分布式锁


zookeeper使用场景
-------------------------
zk是高可用的分布式数据一致性框架

集群中各机器共享 数据一致 


YARN全新一代分布式调度框架


技术内幕
-------------------------
数据模型:树形结构


每个zxid代表一个更新操作


znode节点类型:持久 + 临时 + 顺序

zookeeper采用jute进行数据的序列化和反序列化

zookeeper采用tcp/ip的通信协议

客户端与服务器建立连接后就存在一个会话  





















猜你喜欢

转载自forlan.iteye.com/blog/2407119
今日推荐