先写吧,后面再整理格式
0. why zookeeper?
最近公司在多服务,多集的分布式场景下,需要用到分布式锁。
最初考虑使用redis 来实现类似的功能。
redis 的做法 :
sexNx key value
SETNX是将 key 的值设为 value,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。
- 返回1,说明该进程获得锁,SETNX将键 lock.id 的值设置为锁的超时时间,当前时间 +加上锁的有效时间。
- 返回0,说明其他进程已经获得了锁,进程不能进入临界区。进程可以在一个循环中不断地尝试 SETNX 操作,以获得锁。
tryLock(){
SETNX Key 1 Seconds
}
release(){
DELETE Key
}
redis 实现分布式锁的缺点:
而作为对比,zookeeper 引入的 watch 机制,以及临时节点。 当一个客户端释放或者失去连接的时候,会自动发消息给监听的客户端。
1. zookeeper 是什么?
ZooKeeper 是一个开源的分布式协调服务
,依托 Paxos 算法。
ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
2. zookeep的原理
2.1 数据模型
Zookeeper提供基于类似于文件系统的目录节点树方式的数据存储,但是Zookeeper并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。
数据模型
与Linux文件系统不同的是,Linux文件系统有目录和文件的区别,而Zookeeper的数据节点称为ZNode
具体可以参考下图:
2.2 znode
ZNode是Zookeeper中数据的最小单元,每个ZNode都可以保存数据,同时还可以挂载子节点,因此构成了一个层次化的命名空间,称为树。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。