Zookeeper是什么?
Zookeeper是一个分布式协调服务器,基于paxos实现了Zab一致性算法。
Zookeeper提供了什么?
- 文件系统
对于zk文件系统,在zk文件系统的目录树中,每个目录都被乘坐znode。
- znode可有子目录,并且可存放数据,但是EPHEMERAL类(临时znode)znode除外。
- znode有版本机制,即znode可以存储多个版本的数据。
- znode类型:
- PERSISTENT(持久化目录节点):client与zk断开连接后,该节点依旧存在
- PERSISTENT_SEQUENTIAL(持久化顺序编号目录节点):client与zk断开连接后,该节点依旧存在。且创建新节点时,会被顺序编号
- EPHEMERAL(临时目录节点):区别于PERSISTENT,client断开连接后,znode会被删除
- EPHEMERAL_SEQUENTIAL(临时顺序编号目录节点):区别于PERSISTENT_SEQUENTIAL,client断开连接后,znode会被删除
- 发布/订阅通知机制
- client可以订阅(watch)指定的znode,当znode发生改变时,zk会发布消息通知client。(Redis也有类似的pub/sub机制)基于这个机制zk和redis都可以实现分布式锁以及服务注册与发现(比如dubbo)
Zookeeper可以做什么?
- 服务注册与发现:dubbo
- 配置管理:disconf
- 集群管理:HBase Storm等
- 分布式锁
- 分布式队列
- 进程屏障Barrier
服务注册与发现
作为注册中心,zk大致流程如下,可以实现客户端的负载均衡:
我没有看过dubbo源码,但是根据配置文件,可以大致推出以下结论:
- dubbo:reference:消费者将会监听zookeeper下关于reference下的znode,消费者获得他所有reference的服务注册在zk的信息,维护成一个表。以此实现客户端的负载均衡。
- dubbo:service:生产者将service注册到指定znode
- registry:指定了注册中心的地址,服务注册和发现的address
- dubbo:protocol:指定了RPC的传输和序列化协议123456789101112<!-- 提供方应用信息,用于计算依赖关系 --><dubbo:application name="hello-world-app" /><!-- 使用multicast广播注册中心暴露服务地址 --><dubbo:registry address="zookeeper://224.5.6.7:1234" /><!-- 用dubbo协议在20880端口暴露服务 --><dubbo:protocol name="dubbo" port="20880" /><!-- 声明需要暴露的服务接口 --><dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" /><!-- 声明需要引用的服务接口 --><dubbo:reference interface="com.foo.BarService" actives="10" /><!-- 和本地bean一样实现服务 --><bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />