1.简介
zookeeper原由雅虎研究院开发,后捐赠予apache基金会。zk是一个开源的分布式 应用程序协调服务器,它为分布式的系统提供了一致性的服务。如何保证一致性?其一致性是基于 Paxos 算法的 ZAB协议完成的。zk可以做什么?主要有:配置维护、域名服务、分布式同步、集群管理等。
1.1一致性
Q: zk如何保证分布式系统的一致性?
A:因zk有以下的特点
- 顺序一致性:zk接受多个事务请求(写操作),它会严格按照接受的顺序应用到zk中。
- 原子性:所有事务请求的结果在zk集群中每一台机器上的应用情况都是一致的。要么全部应用成功,要么全部失败。
- 单一视图:无论client链接的是zk集群中的哪台机器,其看到的数据模型是一致的。
- 可靠性:一旦zk成功应用了一个事务,那么该事务所引发的zk状态变更会一直保留下来,直到另一个事务将其修改。
- 最终一致性:一旦一个事务被成功应用,zk可以保证在一个很短暂的时间后,client 最终能够从zk上读取到最新的数据状态。tips:不能保证实时读取到。
1.2Paxos算法
1.2.1算法简介
Paxos算法原由莱斯利-兰伯特 在1990年提出的一种基于消息传递的、具有高容错性的一致性算法。Google Chubby的作者Mike Burrows 说过,世界上只有一种一致性算法,那就是Paxos,所有其他的一致性算法都是Paxos算法的不完整版本。Paxos算法是公认的非常难懂的算法,并且工程实现上也具有很大难度。有名的Paxos工程化实现Google Chubby、ZAB、微信的 PhxPaxos 等。
Paxos算法用于解决什么问题?Paxos算法要解决分布式系统中如何就某个协议达成一致。
1.2.2算法描述
1.2.2.1三种角色
在Paxos算法中由三种角色,分别具有三种不同的行为。但很多时候,一个进程可能同时充当多种角色。
- Proposer :提案者。
- Acceptor:表决者。
- Learner: 学习者、同步者。
1.2.2.2Paxos 算法的一致性
- 每个提案者在提出提案时都会首先获得一个递增的、全局唯一的提案编号N,然后将该编号赋予其要提出的提案。(N有两种方式生成:全局性生成器、提案者自身维护N)
- 每个表决者在accept 某提案后,会将该提案的编号 N 记录在本地,这样每个表决者中保存已经被accept 的提案中会存在一个编号最大的提案,其假设为MaxN。每个表决者仅会 accept 编号大于自己本地 MaxN 的提案。
- 在众多提案中最终只能有一个提案被选定。
- 一旦一个提案被选定,则其他学习者会主动同步(Learn)该提案到本地。
- 没有提案被提出则不会有提案被选定。