zookeeper 学习总结

本文深入探讨了Zookeeper的一致性原理,包括CAP理论、BASE原则及ZAB协议,并介绍了Zookeeper的配置与使用方法,适合希望深入了解分布式协调服务的技术人员阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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的通信协议

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值