1、分布中的一致性
谈到分布式,不得谈到CAP(一致性、可用性、分区性),对于分区性是确定的,剩下的就在一致性和可用性中选择,这个选择又是一个痛苦的事情,鱼和熊掌不可兼得。后面出来了BASE理伦,选择不是完全绝对的,可用性有50%的可用,80%的可用,一致性有强一致性和最终一致性。今天谈谈Zookeeper,有人说它是强一致性,也有人说它是最终一致性,个人觉得都有道理。说它是强一致性的理由是有选举的过程中不可用,说它是最终一致性的理由是过半同意就ok,站在不同的角度看它得出的结论不一样,然而它是分布式中一致性的框架总是不会有错的。
一致性的理伦原理一大堆的,有的还把人搞得晕七晕八的,懂得基本的原理,再去实践,最后再总结归纳,这样的过程比较好。下面给出三种不同一致性的实现方案。
1.1 无主节点+广播+定时dump
说明:
- 一个写请求经过路由到集群中的某一台机器,机器执行写数据库和写本地文件操作,然后广播通知其它的节点进行更新操作。
- 这里是最终一致性,即便在通知的过程中有节点失败了,每隔一定的时间进行全量dump操作,从DB里加载数据与本地文件进行比较,发现不一致就更新。
1.2 固定主节点+强一致性
说明:
- 有一个主节点专门接收请求,如果有写请求,就全部转发到其它的节点上,等待所有的节点都操作成功,再返回,保证了强一致性,牺牲了性能。
- 固定主节点有风险,万一它挂了就完蛋了,也有主备的策略可以考虑。
1.3 动态选举主节点+多数返回就成功
说明:
- 每次要选举出一个主节点出来,如果是其它节点发现是写请求,就会转到主节点上。
- 主节点广播发送请求,如果多数返回成功,就成功,避免要全部返回成功就算成功。
大概明白了上面的原理后,学习zookeeper就更方便了,zookeeper的大概原理与第3点相似。
2、Zookeeper
zookeeper是一个分布式一致性框架,它能保证数据的最终一致性,我们利用它的特性完成需求,先看一下基础的用法。我是在mac上安装zookeeper的,先来了解一下基础的命令操作。
2.1 进入命令模式
在zookeeper的解压目录下,进入bin目录下,执行:
./zkServer.sh start
2.2 客户端连接
打开另外一个终端,进入zookeeper安装目录下的bin目录下,执行:
./zkCli.sh
2.3 命令操作
a. 创建一个节点
create /data "myData"
节点类型有:持久化节点、临时节点、顺序节点
zookeeper 顺序节点要创建在目录下,否则ls 不出来,create -e -s /tmp/ "aaa" ls /tmp 就会看到数据
b. 读取节点值
get /data
c. 监听数据变化
get /data watch
然后执行数据变更操作,就可以看到数据变化
set /data "test"
从上面可以看出,zookeeper提供了基础的命令操作:
- 创建节点
- 读取节点值
- 更新节点值
- watch节点变化
- 删除节点
这些基础的功能可以实现很多功能,如数据配置、分布式锁等。
3、实战
TODO