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的通信协议
客户端与服务器建立连接后就存在一个会话
zookeeper 学习总结
最新推荐文章于 2025-06-04 20:31:14 发布