ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是大数据生态中的重要组件。它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操做。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。node
它是一个为分布式应用提供一致性协调服务的中间件redis
客户端到服务端的一次请求到响应结束会经历多台计算机数据库
图示1服务器
图示2并发
服务的动态注册和发现,为了支持高并发,OrderService被部署了4份,每一个客户端都保存了一份服务提供者的列表,但这个列表是静态的(在配置文件中写死的),若是服务的提供者发生了变化,例若有些机器down了,或者又新增了OrderService的实例,客户端根本不知道,想要获得最新的服务提供者的URL列表,必须手工更新配置文件,很不方便。分布式
问题 : 客户端和服务提供者的紧耦合高并发
解决方案: 解除耦合,增长一个中间层 -- 注册中心它保存了能提供的服务的名称,以及URL。首先这些服务会在注册中心进行注册,当客户端来查询的时候,只须要给出名称,注册中心就会给出一个URL。全部的客户端在访问服务前,都须要向这个注册中心进行询问,以得到最新的地址。性能
注册中心能够是树形结构,每一个服务下面有若干节点,每一个节点表示服务的实例。大数据
注册中心和各个服务实例直接创建Session,要求实例们按期发送心跳,一旦特定时间收不到心跳,则认为实例挂了,删除该实例。云计算
Job协调问题
三个Job的功能相同,部署在三个不一样的机器上,要求同一时刻只有一个能够运行,也就是若是有一个宕了的话,须要在剩下的两个中选举出Master
继续工做
因此这三个Job须要互相协调
使用共享数据库表。咱们知道数据库主键不能冲突,可让三个Job向表中插入一样的数据,谁成功谁就是Master。缺点是若是抢到Master的Job挂了,则记录永远存在,其余的Job没法插入数据。因此必须加上按期更新的机制。
让Job在启动以后,去注册中心注册,也就是建立一个树节点,谁成功谁是Master(注册中心必须保证只能建立成功一次)。
这样,若是节点删除了,就开始新一轮争抢。
分布式锁, 多台机器上运行的不一样的系统操做同一资源
使用Master选举的方式,让你们去抢,谁能抢到就建立一个/distribute_lock
节点,读完之后就删除,让你们再来抢。缺点是某个系统可能屡次抢到,不够公平。
让每一个系统在注册中心的/distribute_lock
下建立子节点,而后编号,每一个系统检查本身的编号,谁的编号小认为谁持有了锁,好比下图中是系统1持有了锁
系统1操做完成之后,就能够把process_01删除了,再建立一个新的节点 process_04。此时是process_02最小了,因此认为系统2持有了锁。
操做完成之后也要把process_02节点删除,建立新的节点。这时候process_03就是最小的了,能够持有锁了。
注册中心的高可用