Zookeeper简介

Zookeeper最主要的使用场景,是作为分布式系统的分布式协同服务。

分布式系统定义

分布式系统:是同时跨越多个物理主机,独立运行的多个软件所组成的系统。 类比一下:分布式系统就是一群人一起干活。人多力量大,每个服务器的算力是有限的,但是通过分布式系统,由n个服务器组成的集群,算力是无限扩张的。

分布式系统面临的问题

分布式系统的优点就是“人多干活快,并且互为备份”。但是,缺点在于存在协调的问题,各个机器节点需要一起工作应能够同步和共享,这需要依赖于服务进程间的通信。
类比一下,就是一个研发团队,开发软件时,需要考虑到,谁是开发组长;开发任务如何分配;组长如何了解项目进度;离职如何做好交接;开发组长离职,谁来接替;新人如何快速融入项目组等等。

分布式系统通信方式

分布式系统中各个机器之间的通信方式:(1)通过网络进行信息共享;(2)通过共享存储(svn)

Zookeeper如何解决分布式系统问题

Zookeeper对分布式系统的协调,采用的机器之间通过共享存储的方式进行通信。
Zookeeper负责存储任务的分配和完成情况等共享信息。每个分布式应用节点订阅共享信息。
当主节点(Master)对某个从节点的分工信息作出改变时,相关订阅的从节点会得到zookeeper的通知,取得自己最新的任务分配。完成工作后,从节点再把完成情况存储到zookeeper。
主节点订阅了该任务的完成情况信息,就会得到zookeeper的完工通知。

注:Slave节点要想获取Zookeeper的更新通知,需要事先在关心的数据结点上设置观察点。

image.png

关键词与总结

关键词
分布式系统,协同,信息共享,共享存储。
总结
大多数分布式系统中出现的问题,都源于信息共享出了问题。如果各个节点间信息不能及时共享和同步,那么就会在协作过程中产生各种问题。
Zookeeper解决协同问题的关键,就是在于保证分布式系统信息的一致性。
**

Zookeeper的基本概念

Zookeeper是一个典型的分布式数据一致性的解决方案。
分布式系统程序可以基于Zookeeper实现 数据订阅/发布、负载均衡、命名服务、集群管理、分布式锁和分布式队列 等功能。

基本概念

集群角色

分布式系统主备模式 在分布式系统中,构成一个集群的每一台机器都有自己的角色,最典型的集群模式就是主备模式(Master/Slave模式)。 Master机器负责读写服务,Slave机器通过异步复制方式获取Master机器的最新数据,只负责读服务。

Zookeeper并没有沿用主备模式,而是引入了 Leader、Follower、Observer 三种角色。
Leader角色:是在Zookeeper集群中的所有机器通过 Leader选举 来选定一台机器作为Leader机器。负责为客户端提供读和写的服务。Follower角色:参与 Leader选举 , 只为客户端提供读操作。Observer角色:不参与 Leader选举 ,不参与写操作的过半写成功策略, 只为客户端提供读操作。(可以在不影响写性能的情况下提升集群的性能)。

会话(session)

客户端会话,一个客户端连接是指客户端和服务端之间的一个长连接。连接的建立开始,客户端的生命周期也会开始。客户端启动时,首先就会与服务端建立一个TCP长连接(Zookeeper对外服务端口为2181)。
通过TCP长连接,客户端能够通过心跳检测与服务端保持有效的会话,也能够向Zookeeper服务器发送请求并接受响应。同时还能够通过该连接接收来自服务器的Watch事件通知。

数据节点(Znode)

节点:通常指的是集群中的每一台机器。
Zookeeper中,节点分为两类,第一类为集群中的机器,称为机器节点。第二类为数据模型中的数据单元,称为数据节点——Znode。Zookeeper将所有数据存储在内存中,数据模型是一个树(Znode Tree),由斜杠(/)进行分割路径,每一个路径就是一个Znode,例如/app/path1。每一个ZNode上都会保存自己的数据内容,同时还会保存一系列属性信息。

版本

Zookeeper的每个ZNode都会存储数据,对于每个ZNode,都会维护一个叫做Stat的数据结构。
Stat记录了ZNode的三个数据版本:version(当前ZNode版本)、cversion(当前ZNode的子节点版本)、aversion(当前ZNode的ACL版本)。

Watcher(事件监听器)

Zookeeper实现分布式协调服务的重要特性。Zookeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发时,Zookeeper服务端会将事件通知到感兴趣的客户端。

ACL

全称:Access Control Lists。采用ACL进行权限控制,定义了五种权限:

  • CREATE —— 创建子节点的权限
  • READ —— 获取节点数据和子节点列表的权限
  • WRITE —— 更新节点数据的权限
  • DELETE —— 删除子节点的权限
  • ADMIN —— 设置节点的ACL权限

注意:CREATE和DELETE这两种权限都是针对子节点的权限控制。

Zookeeper环境搭建

单机模式

Zookeeper只运行在一台服务器上,适合测试环境。

搭建

1、下载文档版本Zookeeper
https://zookeeper.apache.org/releases.html
2、上传Zookeeper压缩包至linux服务器
3、解压

  1. tar -zxvf zookeeper-3.4.14.tar.gz

4、进入Zookeeper-3.4.14目录,创建data目录

  1. cd zookeeper-3.4.14
  2. mkdir data

5、修改配置文件名称

  1. cd conf
  2. mv zoo_sample.cfg zoo.cfg

6、修改zoo.cfg中的data属性

  1. dataDir=/root/zookeeper-3.4.14/data

7、Zookeeper启动

  1. cd /zookeeper-3.4.14/bin
  2. ./zkServer.sh start

验证

启动成功
image.png

其他命令

  • 关闭Zookeeper服务

    1. ./zkServer.sh stop

    image.png

  • 查看状态

    1. ./zkServer.sh status

    启动状态:
    image.png
    未启动状态:
    image.png

    集群模式

    Zookeeper运行在一个集群里,适合生产环境。

    伪集群模式

    在一台服务器上运行多个Zookeeper实例, 用端口进行区分。
    必须保证每个配置文档的各个端口不能冲突,需要保证 zoo.cfg 文件中clientPortdataDir 在各个实例中不同。另外,还要在 dataDir 所对应的目录中创建 myid 文件来指定对应的Zookeeper服务器实例。

  • clientPort端口

如果在1台机器上部署多个server,那么每台机器都要有不同的clientPort,比如server1是2181,server2是2182,server3是2183。

  • dataDir和dataLogDir

dataDir和dataLogDir也需要区分,将数据文件和日志文件分开存放,同时每个server的这两个变量所对应的路径都是不同的。

  • server.X和myid

service.X数字的对应就是data/myid中的数字。在3个server的myid文件中分别写入1,2,3,那么每个server中的zoo.cfg都培server.1,server.2,server.3就行了。

搭建

1、下载文档版本Zookeeper
https://zookeeper.apache.org/releases.html
2、上传Zookeeper压缩包至linux服务器
3、创建目录zkcluster

  1. mkdir zkcluster

4、解压zookeeper-3.4.14.tar.gz到zkcluster目录下

  1. tar -zxvf zookeeper-3.4.14.tar.gz -C /zkcluster

5、改变名称

  1. mv zookeeper-3.4.14 zookeeper01
  2. cp -r zookeeper01/ zookeeper02
  3. cp -r zookeeper01/ zookeeper03

6、分别在zookeeper01、zookeeper02、zookeeper03目录下创建data及log目录

  1. mkdir data
  2. cd data
  3. mkdir logs

7、修改配置文件名称

  1. cd conf
  2. mv zoo_sample.cfg zoo.cfg

8、配置每一个Zookeeper的dataDir、clientPort

  1. - zookeeper01
  2. clientPort=2181
  3. dataDir=/zkcluster/zookeeper01/data
  4. dataLogDir=/zkcluster/zookeeper01/data/logs
  5. - zookeeper02
  6. clientPort=2182
  7. dataDir=/zkcluster/zookeeper02/data
  8. dataLogDir=/zkcluster/zookeeper02/data/logs
  9. - zookeeper03
  10. clientPort=2183
  11. dataDir=/zkcluster/zookeeper03/data
  12. dataLogDir=/zkcluster/zookeeper03/data/logs

配置集群

1、在每个Zookeeper的data目录下创建myid文件,内容分别是1,2,3(myid文件用来记录每个服务器的ID)

  1. touch myid

2、在每一个Zookeeper的zoo.cfg配置客户端访问端口clientPort和集群服务器IP列表

  1. server.1=10.211.55.4:2881:3881
  2. server.2=10.211.55.4:2882:3882
  3. server.3=10.211.55.4:2883:3883
  4. #server.服务器ID=服务器IP地址:服务器之间通信端⼝:服务器之间投票选举端⼝

启动集群

一次启动三个Zookeeper实例

  1. ./zkServer.sh start