先写吧,后面再整理格式

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都可以保存数据,同时还可以挂载子节点,因此构成了一个层次化的命名空间,称为树。

3. paxos 算法

4. zab 算法

5. Raft 算法

100. 学习参考的文章


天真真不知路漫漫
70 声望6 粉丝

1