Zookeeper简介
Zookeeper最主要的使用场景,是作为分布式系统的分布式协同服务。
分布式系统定义
分布式系统:是同时跨越多个物理主机,独立运行的多个软件所组成的系统。 类比一下:分布式系统就是一群人一起干活。人多力量大,每个服务器的算力是有限的,但是通过分布式系统,由n个服务器组成的集群,算力是无限扩张的。
分布式系统面临的问题
分布式系统的优点就是“人多干活快,并且互为备份”。但是,缺点在于存在协调的问题,各个机器节点需要一起工作应能够同步和共享,这需要依赖于服务进程间的通信。
类比一下,就是一个研发团队,开发软件时,需要考虑到,谁是开发组长;开发任务如何分配;组长如何了解项目进度;离职如何做好交接;开发组长离职,谁来接替;新人如何快速融入项目组等等。
分布式系统通信方式
分布式系统中各个机器之间的通信方式:(1)通过网络进行信息共享;(2)通过共享存储(svn)
Zookeeper如何解决分布式系统问题
Zookeeper对分布式系统的协调,采用的机器之间通过共享存储的方式进行通信。
Zookeeper负责存储任务的分配和完成情况等共享信息。每个分布式应用节点订阅共享信息。
当主节点(Master)对某个从节点的分工信息作出改变时,相关订阅的从节点会得到zookeeper的通知,取得自己最新的任务分配。完成工作后,从节点再把完成情况存储到zookeeper。
主节点订阅了该任务的完成情况信息,就会得到zookeeper的完工通知。
注:Slave节点要想获取Zookeeper的更新通知,需要事先在关心的数据结点上设置观察点。
关键词与总结
关键词
分布式系统,协同,信息共享,共享存储。
总结
大多数分布式系统中出现的问题,都源于信息共享出了问题。如果各个节点间信息不能及时共享和同步,那么就会在协作过程中产生各种问题。
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环境搭建
单机模式
搭建
1、下载文档版本Zookeeper
https://zookeeper.apache.org/releases.html
2、上传Zookeeper压缩包至linux服务器
3、解压
tar -zxvf zookeeper-3.4.14.tar.gz
4、进入Zookeeper-3.4.14目录,创建data目录
cd zookeeper-3.4.14
mkdir data
5、修改配置文件名称
cd conf
mv zoo_sample.cfg zoo.cfg
6、修改zoo.cfg中的data属性
dataDir=/root/zookeeper-3.4.14/data
7、Zookeeper启动
cd /zookeeper-3.4.14/bin
./zkServer.sh start
验证
其他命令
关闭Zookeeper服务
./zkServer.sh stop
查看状态
./zkServer.sh status
集群模式
伪集群模式
在一台服务器上运行多个Zookeeper实例, 用端口进行区分。
必须保证每个配置文档的各个端口不能冲突,需要保证zoo.cfg
文件中clientPort
和dataDir
在各个实例中不同。另外,还要在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
mkdir zkcluster
4、解压zookeeper-3.4.14.tar.gz到zkcluster目录下
tar -zxvf zookeeper-3.4.14.tar.gz -C /zkcluster
5、改变名称
mv zookeeper-3.4.14 zookeeper01
cp -r zookeeper01/ zookeeper02
cp -r zookeeper01/ zookeeper03
6、分别在zookeeper01、zookeeper02、zookeeper03目录下创建data及log目录
mkdir data
cd data
mkdir logs
7、修改配置文件名称
cd conf
mv zoo_sample.cfg zoo.cfg
8、配置每一个Zookeeper的dataDir、clientPort
- zookeeper01
clientPort=2181
dataDir=/zkcluster/zookeeper01/data
dataLogDir=/zkcluster/zookeeper01/data/logs
- zookeeper02
clientPort=2182
dataDir=/zkcluster/zookeeper02/data
dataLogDir=/zkcluster/zookeeper02/data/logs
- zookeeper03
clientPort=2183
dataDir=/zkcluster/zookeeper03/data
dataLogDir=/zkcluster/zookeeper03/data/logs
配置集群
1、在每个Zookeeper的data目录下创建myid文件,内容分别是1,2,3(myid文件用来记录每个服务器的ID)
touch myid
2、在每一个Zookeeper的zoo.cfg配置客户端访问端口clientPort和集群服务器IP列表
server.1=10.211.55.4:2881:3881
server.2=10.211.55.4:2882:3882
server.3=10.211.55.4:2883:3883
#server.服务器ID=服务器IP地址:服务器之间通信端⼝:服务器之间投票选举端⼝
启动集群
一次启动三个Zookeeper实例
./zkServer.sh start