Zookeeper

关注博客:https://blog.csdn.net/Xgx120413

学习Zookeeper相关的理论及实践。


目录

一、Zookeeper的相关介绍

二、为什么要用到Zookeeper

三、Zookeeper单机部署

四、Zookeeper相关特性

五、常用客户端及命令

六、Zookeeper关于Java客户端

七、Zookeeper一致性原理

八、Zookeeper集群解析

九、服务注册与发现


 

一、 Zookeeper的相关介绍

1. Zookeeper介绍

        ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。 Zookeeper是hadoop的一个子项目。在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在 某些应用中使用,因此需要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。Zookeeper的目的就在于此。

2. 分布式系统由来与特点

Zookeeper_第1张图片        

 分布式系统:一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。

分布性:分布式系统,最显著的特征就是分布性,从简单来看,如果我们做的是个电商项目,整个项目会分成不同的功能,专业点就不同的微服务,比如用户微服务,产品微服务,订单微服务,这些服务部署在不同的tomcat中,不同的服务器中,甚至不同的集群中,整个架构都是分布在不同的地方的,在空间上是随意的,而且随时会增加,删除服务器节点,这是第一个特性。

对等性:对等性是分布式设计的一个目标,还是以电商网站为例,要完成一个分布式的系统架构,肯定不是简单的把一个大的单一系统拆分成一个个微服务,然后部署在不同的服务器集群就够了,其中拆分完成的每一个微服务都有可能发现问题,而导致整个电商网站出现功能的丢失。

比如订单服务,为了防止订单服务出现问题,一般情况需要有一个备份,在订单服务出现问题的时候能顶替原来的订单服务。

这就要求这两个(或者2个以上)订单服务完全是对等的,功能完全是一致的,其实这就是一种服务副本的冗余。

还一种是数据副本的冗余,比如数据库,缓存等,都和上面说的订单服务一样,为了安全考虑需要有完全一样的备份存在,这就是对等性的意思。

并发性:接触的不是多线程的角度,而是更高一层,从多进程,多JVM的角度,例如在一个分布式系统中的多个节点,可能会并发地操作一些共享资源,如何准确并高效的协调分布式并发操作。

缺乏全局时钟:在分布式系统中,节点是可能反正任意位置的,而每个位置,每个节点都有自己的时间系统,因此在分布式系统中,很难定义两个事务纠结谁先谁后,原因就是因为缺乏一个全局的时钟序列进行控制,当然,现在这已经不是什么大问题了,已经有大把的时间服务器给系统调用。

故障随时会发生:任何一个节点都可能出现停电,死机等现象,服务器集群越多,出现故障的可能性就越大,随着集群数目的增加,出现故障甚至都会成为一种常态,怎么样保证在系统出现故障,而系统还是正常的访问者是作为系统架构师应该考虑的。

 

3. 大型网站分布图

Zookeeper_第2张图片

        整个架构分成很多个层:应用层,服务层,基础设施层与数据服务层,每一层都由若干节点组成,这是典型的分布式架构。

        zookeeper在其中又是扮演什么角色呢,如果可以把zk扮演成交警的角色,而各个节点就是马路上的各种汽车(汽车,公交车),为了保证整个交通(系统)的可用性,zookeeper必须知道每一节点的健康状态(公交车是否出了问题,要派新的公交【服务注册与发现】),公路在上下班高峰是否拥堵,在某一条很窄的路上只允许单独一个方向的汽车通过【分布式锁】。如果交通警察是交通系统的指挥官,而zookeeper就是各个节点组成分布式系统的指挥官。

 

4. 分布式系统带来的问题

        如果把分布式系统和平时的交通系统进行对比,哪怕再稳健的交通系统也会有交通事故,分布式系统也有很多需要攻克的问题,比如:通讯异常,网络分区,三态,节点故障等。

通讯异常:通讯异常其实就是网络异常,网络系统本身是不可靠的,由于分布式系统需要通过网络进行数据传输,网络光纤,路由器等硬件难免出现问题。只要网络出现问题,也就会影响消息的发送与接受过程,因此数据消息的丢失或者延长就会变得非常普遍。

网络分区:网络分区,其实就是脑裂现象,本来有一个交通警察,来管理整个片区的交通情况,一切井然有序,突然出现了停电,或者出现地震等自然灾难,某些道路接受不到交通警察的指令,可能在这种情况下,会出现一个零时工,片警零时来指挥交通。

但注意,原来的交通警察其实还在,只是通讯系统中断了,这时候就会出现问题了,在同一个片区的道路上有不同人在指挥,这样必然引擎交通的阻塞混乱。

这种由于种种问题导致同一个区域(分布式集群)有两个相互冲突的负责人的时候就会出现这种精神分裂的情况,在这里称为脑裂,也叫网络分区。

三态:三态是什么?三态其实就是成功,与失败以外的第三种状态:超时态。在一个jvm中,应用程序调用一个方法函数后会得到一个明确的相应,要么成功,要么失败,而在分布式系统中,虽然绝大多数情况下能够接受到成功或者失败的相应,但一旦网络出现异常,就非常有可能出现超时,当出现这样的超时现象,网络通讯的发起方,是无法确定请求是否成功处理的。

节点故障:节点故障在分布式系统下是比较常见的问题,指的是组成服务器集群的节点会出现的宕机或“僵死”的现象,这种现象经常会发生。

 

5. CAP理论

C(一致性):数据在分布式环境下的多个副本之间能否保持一致性,这里的一致性更多是指强一致性;

A(可用性):分布式系统一直处于可用状态,对于请求总是能在有限的时间内返回结果致性;

P(分区容错性):除非整个网络故障,分布式系统在任何网络或者单点故障时,仍能对外提供满足一致性和可用性的服务;

一个分布式系统中,不可能同时满足一致性、可用性、分区容错性这三个基本需求,最多只能同时满足其中的两项。

Zookeeper_第3张图片

不可能把所有应用全部放到一个节点上,因此精力往往就花在怎么样根据业务场景在A和C直接寻求平衡。

 

二、 为什么要用到Zookeeper

1. Zookeeper设计目标

        ① 简单的数据结构:共享的树形结构,类似文件系统,存储于内存;

        ② 可以构建集群:避免单点故障,3-5台机器就可以组成集群,超过半数正常工作久能对外提供服务;

        ③ 顺序访问:对于每个读请求,zookeeper会分配一个全局唯一的递增编号,利用这个特性可以实现高级协调服务;

        ④ 高性能:基于内存操作,服务于非事务请求,适用于读操作为主的业务操作。3台zk集群能达到13W QPS

 

2. 哪些场景需要用到zk?

        ① 数据发布订阅 ② 负载均衡 ③ 命名服务 ④ Master选举 ⑤ 集群管理 ⑥ 配置管理 ⑦ 分布式队列 ⑧ 分布式锁

 

三、 Zookeeper单机部署

1. 环境要求:必须要有jdk环境,本次讲课使用jdk1.8

2. Windows部署Zookeeper流程

        ① 安装JDK1.8(自行查资料安装)

        ② 安装Zookeeper,在官网http://zookeeper.apache.org/下载zookeeper。(我下载的是zookeeper-3.4.12版本)解压zookeeper-3.4.6至D:\zookeeper-3.4.12。在D:\ 新建data及log目录

        ③ ZooKeeper的安装模式分为三种,分别为:单机模式(stand-alone)、集群模式和集群伪分布模式。ZooKeeper 单机模式的安装相对比较简单,如果第一次接触ZooKeeper的话,建议安装ZooKeeper单机模式或者集群伪分布模式。安装单击模式。 至D:\zookeeper-3.4.12\conf 复制 zoo_sample.cfg 并粘贴到当前目录下,命名zoo.cfg。

Zookeeper目录结构:

bin                 存放系统脚本

conf               存放配置文件

contrib           zk附加功能支持 

dist-maven    maven仓库文件

docs              zk文档

lib                  依赖的第三方库

recipes          经典场景样例代码

src                 zk源码

zk服务端启动流程:

Zookeeper_第4张图片

zk客户端启动流程:

Zookeeper_第5张图片

3. Linux系统部署Zookeeper流程(集群)

(ps:这里重点不在安装这些流程上,重点在于znode,watch,常用命令及后面的服务注册与发现等详细讲解。因此安装流程只是一带而过)

① 安装JDK1.8(安装流程请自行解决)

② 下载zookeeper安装包

        wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz

③ 解压Zookeeper安装包

        tar -zxvf zookeeper-3.4.10.tar.gz

④ 修改Zookeeper文件夹名称:

        重命名: mv zookeeper-3.4.10 zookeeper

⑤ 修改zoo_sample.cfg文件

        cd /usr/local/zookeeper/conf
        mv zoo_sample.cfg zoo.cfg
        修改conf: vi zoo.cfg 修改两处
                (1) dataDir=/usr/local/zookeeper/data(注意同时在zookeeper创建data目录
                (2)最后面添加
                        server.0=192.168.212.154:2888:3888
                        server.1=192.168.212.156:2888:3888
                        server.2=192.168.212.157:2888:3888

⑥ 创建服务器标识(分别要建立三台服务器节点)

        服务器标识配置:
        创建文件夹: mkdir data
        创建文件myid并填写内容为0: vi
        myid (内容为服务器标识 : 0)

⑦ 复制zookeeper(将已经配置好的zookeeper复制到node1和node2中)

        进行复制zookeeper目录到node1node2
        还有/etc/profile文件
        把node1node2中的myid文件里的值修改为1和2
        路径(vi /usr/local/zookeeper/data/myid)

⑧ 启动zookeeper
        路径: /usr/local/zookeeper/bin
        执行: zkServer.sh start
        (注意这里3台机器都要进行启动)
        状态: zkServer.sh
        status(在三个节点上检验zk的mode,一个leader和俩个follower)

        scp -r  /soft  root@zk2:/

        scp -r  /soft  root@zk3:/

四、Zookeeper相关特性

        zk的特性从会话、数据节点、版本、watcher、ACL权限控制、集群角色这部分了解,其中重点需要掌握数据节点与Watcher

1. 会话

        客户端与服务端的一次会话连接,本质是TCP长连接,通过会话可以进行心跳检测和数据传输;

Zookeeper_第6张图片

会话(session)是zookeeper非常重要的概念,客户端和服务端之间的任何交互操作斗鱼会话有关

会话状态

        看上图,zk客户端和服务端成功连接后,就创建了一次会话,zk会话在整个运行期间的生命周期中,会在不同的会话状态之间切换,这些状态包括:

        CONNECTING、CONNECTED、RECONNECTING、RECONNECTED、CLOSE

         一旦客户端开始创建Zookeeper对象,那么客户端状态就会变成CONNECTING状态

        ② 同时客户端开始尝试连接服务器,连接成功后,客户端状态变为CONNECTED

        ③ 通常情况下,由于断网或其他原因,客户端与服务端之间会出现断开情况,一旦碰到这种情况,Zookeeper客户端会自动进行重连服务,同时客户端状态再次变成CONNECTING,直到重新连接上服务端后,状态又变为CONNECTED

        ④ 通常情况下,客户端的状态总是介于CONNECTING和CONNECTED之间。但是,如果出现诸如会话超时、权限检查或是客户端主动退出程序等情况,客户端的状态就会之间变更为CLOSE状态

 

2. ZK数据模型

        Zookeeper的视图结构和标准的Unix文件系统类似,其中每个节点称为“数据节点”或ZNode,每个ZNode可以存储数据,还可以挂载子节点,因此可以称之为“树”。

        第二点需要注意的是,每一个ZNode都必须有值,如果没有值,节点是不能创建成功的。

Zookeeper_第7张图片

        ① 在Zookeeper中,ZNode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据

        ② 通过客户端可对ZNode进行增删改查操作,还可以注册watcher监控ZNode的变化

 

3. Zookeeper节点类型

① ZNode有两种类型:

        短暂(ephemeral):(create -e /app1/test1 "test1" 客户端断开连接zk删除ephemeral类型节点)

        持久(persistent):(create -s /app1/test2 "test2" 客户端断开连接zk不删除persistent类型节点)

② ZNode有四种形式的目录节点(默认是persistent)

        PERSISTENT

        PERSISTENT_SEQUENTIAL(持久序列/test0000000019)

        EPHEMERAL

        EPHEMERAL_SEQUENTAIl

③ 创建ZNode时设置顺序标识,ZNode名称后面会附加一个值,顺序号是一个单调递增的计数器,由父节点维护

Zookeeper_第8张图片

④ 在分布式系统中,顺序号可以被用于为所有的时间进行全局排序,这样客户端可以通过顺序号推断事件的顺序

 

4. Zookeeper节点状态属性

Zookeeper_第9张图片

 

5. ACL保障数据安全

        ACL机制,表示scheme:id:permissions,第一个字段表示采用哪一种机制,第二个id表示用户,permissions表示相关权限(如只读,读写,管理等)。

        Zookeeper提供了如下几种机制(scheme):

        ① world:它下面只有一个id,叫anyone, world:anyone 代表任何人,zookeeper中对所有人有权限的节点就是属于world:anyone的

        ② auth:它不需要id,只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authentication,也支持username/password形式的authentication)

        ③ digest:它对应的id为username:BASE64(SHA1(password)),它需要先通过username:password形式的authentication

        ④ ip:它对应的id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:192.168.1.0/16,表示匹配前16个bit的IP段

 

五、命令行

1. 服务端常用命令

在准备好相应的配置后,可以直接通过zkServer.sh进行服务的相关操作:

① 启动zk服务:sh bin/zkServer.sh start

② 查看zk服务状态:sh bin/zkServer.sh status

③ 停止zk服务:sh bin/zkServer.sh stop

④ 重启zk服务:sh bin/zkServer.sh restart

 

2. 客户端常用命令

使用zkCli.sh -server 192.168.1.1:2181连接到服务端后,连接成功后,系统会输出Zookeeper相关环境及配置信息。命令行工具一些简单操作如下:

① 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容 

② 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据 

③ 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串  [-e] [-s] 【-e 零时节点】 【-s 顺序节点】

④ 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串  [watch]【watch 监听】

⑤ 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置 ·

⑥ 删除文件: delete /zk 将刚才创建的 znode 删除,如果存在子节点删除失败 

⑦ 递归删除:rmr  /zk将刚才创建的 znode 删除,子节点同时删除

⑧ 退出客户端: quit ·

⑨ 帮助命令: help

3. ACL常用命令

Zookeeper的ACL(Access Control List),分为三个维度:scheme、id、permission

通常表示为:scheme:id:permission

① schema:代表授权策略

② id:代表用户

③ permission:代表权限

 

关注博客:https://blog.csdn.net/Xgx120413

关注享学课堂

你可能感兴趣的:(zookeeper)