Zookeeper-------概述篇

Zookeeper -------- 概述篇

目录

Zookeeper 概述篇

1、Zookeeper是什么

2、Zookeeper有什么特点

3、Zookeeper能干什么


1、Zookeeper是什么

ZooKeeper由雅虎研究院开发,是Google Chubby的开源实现,后来托管到Apache,于2010年11月正式成为Apache的顶级项目。
        ZooKeeper是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调服务
        分布式应用程序可以基于ZooKeeper实现数据发布与订阅、负载均衡、命名服务、分布式协调与通知、集群管理、Leader选举、分布式锁、分布式队列等功能
 

2、Zookeeper有什么特点

2.1  Zookeeper的目标

(1) 高性能
          ZooKeeper将全量数据存储在内存中,并直接服务于客户端的所有非事务请求,尤其适用于以读为主的应用场景

(2)高可用
         ZooKeeper一般以集群的方式对外提供服务,一般3 ~ 5台机器就可以组成一个可用的Zookeeper集群了,每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都相互保持着通信。只要集群中超过一般的机器都能够正常工作,那么整个集群就能够正常对外服务。

(3)严格顺序访问
         对于来自客户端的每个更新请求,ZooKeeper都会分配一个全局唯一的递增编号,这个编号反映了所有事务操作的先后顺序
 

2.2 Zookeeper所拥有的特性

ZooKeeper一般以集群的方式对外提供服务,一个集群包含多个节点,每个节点对应一台ZooKeeper服务器,所有的节点共同对外提供服务,整个集群环境对分布式数据一致性提供了全面的支持,具体包括以下五大特性:

(1)原子性
         所有请求的响应结果在整个分布式集群环境中具备原子性,即要么整个集群中所有机器都成功的处理了某个请求,要么就都没有处理,绝对不会出现集群中一部分机器处理了某一个请求,而另一部分机器却没有处理的情况。

(2)顺序一致性
         从同一个客户端发起的请求,最终将会严格按照其发送顺序进入ZooKeeper中

(3)单一性
         无论客户端连接到ZooKeeper集群中哪个服务器,每个客户端所看到的服务端模型都是一致的,不可能出现两种不同的数据状态,因为ZooKeeper集群中每台服务器之间会进行数据同步

(4)可靠性
        一旦服务端数据的状态发送了变化,就会立即存储起来,除非此时有另一个请求对其进行了变更,否则数据一定是可靠的

(5) 实时性
          当某个请求被成功处理后,ZooKeeper仅仅保证在一定的时间段内,客户端最终一定能从服务端上读取到最新的数据状态,即ZooKeeper保证数据的最终一致性。
 

3、Zookeeper能干什么

3.1 提供命名服务

zookeeper的命名服务功能主要是根据指定名字来获取资源或服务的地址,提供者等信息,利用其znode的特点和watcher机制,将其作为动态注册和获取服务信息的配置中心,统一管理服务名称和其对应的服务器列表信息,我们能够近乎实时地感知到后端服务器的状态(上线、下线、宕机)。
       举例来说,B服务部署在六台服务器上,存在六个完全不同的ip地址,同时B服务本身提供一个dubbo接口对外,此时有个A服务需要调用此接口,如果提供某一台服务器的ip,则存在该服务器宕机情况下接口不可用的情况,再切换ip就会影响服务的正常使用。此时,可以使用zookeeper作为注册中心,B服务的六台服务在指定znode下创建子节点,而A服务调用之前先通过指定znode的路径获取B服务的任意子节点中的ip信息,然后通过ip访问。同时zookeeper动态维护这部分节点,定时利用心跳请求检查B服务的服务器状态,一旦发现某服务器无反馈,就删除节点,防止被A服务获取调用,整个流程如下:

流程图

zookeeper命名服务作用

(1)负载均衡

         轮询服务注册表,尽可能将服务请求均匀分配到所有注册有效的服务器上。

(2)健康检查

         动态维护服务地址注册表,利用心跳请求实时监控注册服务状态,删除无效服务节点,维护有效的地址注册表。

(3)调用监控

         通过统计注册表各个子节点被访问次数来监控服务调用情况。

(4)动态路由

         可以通过配置注册表参数,在不修改服务代码的情况下,动态指定服务访问的机器。

(5)动态配置

         注册表的子节点可以作为单服务器的配置中心,可以直接修改节点配置而不是修改代码的方式,动态修改服务运行的部分参数。

3.2 配置管理

把应用配置放置zookeeper上去,保存在 Zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就行。

大致图解如下:

3.3 可实现分布式锁

基于zookeeper一致性文件系统,实现锁服务。锁服务分为保存独占及时序控制两类。

(1)保存独占:将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除自己创建的distribute_lock 节点就释放锁

(2)时序控制:基于/distribute_lock锁,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次方便

3.4 集群管理

所谓集群管理无在乎两点:是否有机器退出和加入、选举master。

        对于第一点,所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。新机器加入 也是类似,所有机器收到通知:新兄弟目录加入,highcount又有了。

        对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为master就好。

zookeeper简介

3.5 队列管理

      队列管理分两种:FIFO队列和同步队列

(1)FIFO队列

         和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。

(2)同步队列

3.6 分布式与数据复制

Zookeeper作为一个集群提供一致的数据服务,必然在所有机器间做数据复制。数据复制好处:

(1)容错:一个节点出错,不致于让整个系统停止工作,别的节点可以接管它的工作。

(2)提高系统的扩展能力:把负载分布到多个节点上,或者增加节点来提高系统的负载能力;

(3)性能提升:让客户端本地访问就近节点,提高用户访问速度。
-------------------------------------------------------------------------------------------------------------------------------------------

参考:

https://blog.csdn.net/wzk646795873/article/details/79706627