首页 > 其他分享 >Zookeeper介绍&集群部署

Zookeeper介绍&集群部署

时间:2023-04-16 14:01:51浏览次数:58  
标签:部署 Zookeeper Leader 集群 path 节点 客户端

一、Zookeeper简介

Zookeeper是一个开源的分布式框架,可用于解决分布式系统中常见的命名服务、状态同步、配置中心、集群管理等问题。它具有如下特性:

  • 顺序一致性:从一个客户端发起的事务请求,最终都会严格按照其发起顺序被应用到 Zookeeper 中;
  • 原子性:所有事务请求的处理结果在整个集群中所有机器上都是一致的;不存在部分机器应用了该事务,而另一部分没有应用的情况;
  • 单一视图:所有客户端看到的服务端数据模型都是一致的;
  • 可靠性:一旦服务端成功应用了一个事务,则其引起的改变会一直保留,直到被另外一个事务所更改;
  • 实时性:一旦一个事务被成功应用后,Zookeeper 可以保证客户端立即可以读取到这个事务变更后的最新状态的数据。

二、Zookeeper的设计目标

目标一:简单的数据模型

Zookeeper 通过树形结构来存储数据,它由一系列被称为 ZNode 的数据节点组成,类似于常见的文件系统。不过和常见的文件系统不同,Zookeeper 将数据全量存储在内存中,以此来实现高吞吐,减少访问延迟。

Zookeeper介绍&集群部署_Zookeeper

目标二:构建集群

由一组 Zookeeper 服务构成 Zookeeper 集群,集群中每台机器都会单独在内存中维护自身的状态,并且每台机器之间都保持着通讯,只要集群中有半数机器能够正常工作,那么整个集群就可以正常提供服务。

Zookeeper介绍&集群部署_Zookeeper_02

目标三:顺序访问

对于来自客户端的每个更新请求,Zookeeper 都会分配一个全局唯一的递增 ID,这个 ID 反映了所有事务请求的先后顺序。

目标四:高性能高可用

ZooKeeper 将数据存全量储在内存中以保持高性能,并通过服务集群来实现高可用,由于 Zookeeper 的所有更新和删除都是基于事务的,所以其在读多写少的应用场景中有着很高的性能表现。

三、Zookeeper的相关概念

3.1 集群角色

Zookeeper 集群中的机器分为以下三种角色:

  • Leader:Zookeeper集群工作的核心,集群内部各个服务器的调度者,为客户端提供写服务,并维护集群状态,它是由集群选举所产生的。对于create、setData、delete等有写操作的请求,则要统一转发给leader处理,leader需要决定编号、执行操作,这个过程称为事务。
  • Follower:为客户端提供读服务,转发事务请求给Leader。定期向 Leader 汇报自己的节点状态。同时也参与写操作“过半写成功”的策略和 Leader 的选举;
  • Observer:对于非事务请求可以独立处理(读操作),对于事务性请求会转发给leader处理。定期向 Leader 汇报自己的节点状态,但不参与写操作“过半写成功”的策略和 Leader 的选举,因此 Observer 可以在不影响写性能的情况下提升集群的读性能。

所谓“过半写成功”策略,即在集群部署模式下,leader将事务请求(例如create指令)发送给大多数(一半以上)的follower且成功执行后,则算作该事务请求成功执行。该策略用于解决针对所有节点写入时间偏长的问题和集群个别节点异常导致数据不能同步成功的问题。

3.2 会话

Zookeeper 客户端通过 TCP 长连接连接到服务集群,会话 (Session) 从第一次连接开始就已经建立,之后通过心跳检测机制来保持有效的会话状态。通过这个连接,客户端可以发送请求并接收响应,同时也可以接收到 Watch 事件的通知。
关于会话中另外一个核心的概念是 sessionTimeOut(会话超时时间),当由于网络故障或者客户端主动断开等原因,导致连接断开,此时只要在会话超时时间之内重新建立连接,则之前创建的会话依然有效。

3.3 数据节点

Zookeeper 数据模型是由一系列基本数据单元 Znode(数据节点) 组成的节点树,其中根节点为 /。每个节点上都会保存自己的数据和节点信息。Zookeeper 中节点可以分为两大类:

  • 持久节点:节点一旦创建,除非被主动删除,否则一直存在;
  • 临时节点:一旦创建该节点的客户端会话失效,则所有该客户端创建的临时节点都会被删除。

临时节点和持久节点都可以添加一个特殊的属性:SEQUENTIAL,代表该节点是否具有递增属性。如果指定该属性,那么在这个节点创建时,Zookeeper 会自动在其节点名称后面追加一个由父节点维护的递增数字。

3.4 Watcher

Zookeeper 中一个常用的功能是 Watcher(事件监听器),它允许用户在指定节点上针对感兴趣的事件注册监听,当事件发生时,监听器会被触发,并将事件信息推送到客户端。该机制是 Zookeeper 实现分布式协调服务的重要特性。

3.5 ACL

Zookeeper 采用 ACL(Access Control Lists) 策略来进行权限控制,类似于 UNIX 文件系统的权限控制。它定义了如下五种权限:

  • CREATE:允许创建子节点;
  • READ:允许从节点获取数据并列出其子节点;
  • WRITE:允许为节点设置数据;
  • DELETE:允许删除子节点;
  • ADMIN:允许为节点设置权限

四、Zookeeper的应用场景

4.1 配置中心

也称为数据的发布/订阅系统。在分布式系统中,可能存在成千上万个服务节点,如果想要对所有服务的某项配置进行更改,由于数据节点过多,逐台进行修改会非常麻烦。此时可在设计时采用统一的配置中心,之后发布者只需要将新的配置发送到配置中心(具体保存在Zookeeper的某个目录节点),其它应用程序监听该目录节点,当配置信息有变化时,每个应用程序会收到Zookeeper的通知,从Zookeeper获取新的配置信息应用到系统中,从而实现配置的集中管理和动态更新。

Zookeeper介绍&集群部署_Zookeeper_03

发布/订阅系统⼀般有两种设计模式,分别是推(Push)模式和拉(Pull)模式。在推模式中,服务端主动将数据更新发送给所有订阅的客户端;而拉模式则是由客户端主动发起请求来获取最新数据,通常客户端都采用定时进行轮询拉取的方式。

ZooKeeper 采用的是推拉相结合的方式:客户端向服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应的客户端发送Watcher事件通知,客户端接收到这个消息通知之后, 需要主动到服务端获取最新的数据。

4.2 命名服务

4.2.1 命名服务介绍

也称为注册中心。在分布式系统中,通常需要一个全局唯一的名字,如生成全局唯一的订单号等,Zookeeper 可以通过顺序节点的特性来生成全局唯一 ID,从而可以对分布式系统提供命名服务。
      它主要存储注册实例应用的名称和ip地址,供其他服务通过RPC(分布式服务框架之一)来调用。

4.2.2 命名服务的实现方式

当一个实例启动后会向zookeeper创建一个临时节点,并存入自己的服务信息(包括应用名和ip等),其他服务通过zookeeper拿到该实例的注册信息即可调用。

一旦该服务宕机了或者主动下线,那么该临时节点则会被删除,其他服务通过watcher监听到下线通知,也就不再调用该服务。

4.3 集群管理

所谓集群管理,包括集群监控与集群控制两大块,前者侧重对集群运行时状态的收集,后者则是对集群进行操作与控制。

在日常开发和运维过程中,我们经常会有类似于如下的需求,看看Zookeeper如何解决:

  • 如何快速的统计出当前生产环境下一共有多少台机器。Zookeeper通过创建临时节点来建立心跳检测机制,当某个服务节点宕机了,则其持有的会话会超时,此时该临时节点会被删除,相应的监听事件就会被触发
  • 如何快速的获取到机器上下线的情况。Zookeeper可通过监听机制解决
  • 如何实时监控集群中每台主机的运行时状态。Zookeeper的每个服务节点还可以将自己的节点状态写入临时节点,从而完成状态报告或节点工作进度汇报

Zookeeper的两大特性:

  • 客户端如果对Zookeeper的数据节点注册Watcher监听,那么当该数据节点的内容或是其子节点列表发生变更时,Zookeeper服务器就会向订阅的客户端发送变更通知。
  • 对在Zookeeper上创建的临时节点,一旦客户端与服务器之间的会话失效,那么临时节点也会被自动删除

五、Zookeeper集群部署

这里使用三台机器,部署过程如下:

5.1 配置Java环境

apt-get -y install openjdk-8-jdk

5.2 部署Zookeeper

wget http://archive.apache.org/dist/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1.bin.tar.gz
tar -xf apache-zookeeper-3.8.1-bin.tar.gz
mv apache-zookeeper-3.8.1-bin /usr/local/zookeeper
cd /usr/local/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
#创建数据目录和日志目录
mkdir /usr/local/zookeeper/{data,logs}

 ##修改zoo.cfg配置
grep -v "^#" zoo.cfg
#zookeeper客户端与服务器之间的心跳时间,单位ms
tickTime=2000
#集群中的follower服务器(F)与leader服务器(L)之间初始连接的心跳次数(tickTime的数量)
initLimit=10
#L和F之间连接完成后,后期检测发送和应答的心跳次数。如果该follower服务器在指定时间内(syncLimit * tickTime,这里为2000ms*5=10000ms,10s)不能与leader进行通信,则该follower服务器被视为不可用
syncLimit=5
#Zookeeper的数据存放路径
dataDir=/usr/local/zookeeper/data
#Zookeeper的事务日志目录。如果该参数不配置,则事务日志存储在dataDir路路径下
dataLogDir=/usr/local/zookeeper/logs
#Zookeeper监听客户端连接的端口
clientPort=2181
#单个客户端IP和单个Zookeeper服务器保持的连接数限制。如果设置为0,那么表明不作任何限制。请注意这个限制的使用范围,仅仅是单台客户端机器与单台ZK服务器之间的连接数限制,不是针对指定客户端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制。
maxClientCnxns=60
#用于配置zookeeper在自动清理的时候需要保留的快照数据文件和对应的事务日志文件的数量
autopurge.snapRetainCount=3
#3.4.0及之后版本,ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能。
autopurge.purgeInterval=1
#集群信息配置格式:service.[myid]=[服务器IP]:[F和L的通信端口]:[选举端口]。谁是Leader谁就有2888端口
server.1=192.168.131.11:2888:3888
server.2=192.168.131.12:2888:3888
server.3=192.168.131.13:2888:3888
 
#在数据目录设置集群id(不同机器id不一致)
echo 1 > /usr/local/zookeeper/data/myid

5.3 启动Zookeeper

/usr/local/zookeeper/bin/zkServer.sh start

5.4 验证Zookeeper集群状态

Zookeeper介绍&集群部署_Zookeeper_04

Zookeeper介绍&集群部署_Zookeeper_05

Zookeeper介绍&集群部署_Zookeeper_06

5.5 Zookeeper集群选举介绍

5.5.1 节点角色状态

  • LOOKING:寻找Leader状态,处于该状态需进入选举流程
  • LEADING:领导者状态,处于该状态的节点为Leader
  • FOLLOWING:跟随者状态,表示Leader已选举,当前节点角色为Follower
  • OBSERVER:观察者状态,表示当前节点角色为Observer

5.5.2 选举ID

  • myid:服务器的唯一标识,通过配置myid指定,集群中唯一
  • zxid(zookeeper transcation id):每个改变Zookeeper状态的操作都会形成一个对应的zxid

5.5.3 Leader选举过程

当Zookeeper服务器初始化启动或半数以上节点不能与Leader保持连接时(eg:Leader宕机,暂停对外服务,所有follower进入LOOKING状态),就会触发Leader选举。选举过程如下:

1st. 第一次选举: 每个服务器都会把票投给自己,此时无法选出leader,那么就会产生第二次选举。每个Zookeeper的投票中都会包含自己的myid和zxid,zxid一开始会有个初始值,后期随着数据更新而自动变化。我们以(myid,ZXID)形式表示。初始阶段,服务器1和服务器2都会投给自己,即服务器1的投票为(1,0),服务器2的投票为(2,0),然后各自将这个投票发给集群中的其他所有机器。

2nd.每个节点接受并检查对方的投票信息,比如投票时间、投票状态是否为LOOKING

3rd.收到其它服务器的投票进行对比处理,优先检查zxid,zxid大的节点为Leader。如果zxid相同则对比myid,myid大的节点为Leader。服务器1的投票是(1,0),它收到投票是(2,0),两者zxid都是0,因为收到的myid=2,大于自己的myid=1,所以它更新自己的投票为(2,0),然后重新将投票发出去。对于服务器2,则无需更新自己的投票,把上一次的投票信息发出即可。

4th.统计投票。由于服务器2已收到2票,超过半数机器,故服务器2当选Leader,服务器1和3分别为Follower(服务器3参与Leader选举时其它机器已不是LOOKING状态,故不会改变选票信息)

成为Leader的必要条件:Leader具有最高的zxid(这意味着数据是最新最全的);当集群的规模为n时,集群中过半机器(数量超过n/2)得到响应并follow选出的Leader

心跳机制:Leader与Follower利用ping感知对方的存活。当Leader不能响应ping时,将重新发起Leader选举

5.6 Zookeeper数据增删改查

对数据进行改变之前请确保Zookeeper正在运行。以下可连接至Zookeeper集群的任意一个节点进行操作。

/usr/local/zookeeper/bin/zkCli.sh -server 192.168.131.13

#help查看支持的命令
addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
addauth scheme auth
close 
config [-c] [-w] [-s]
connect host:port
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
delete [-v version] path
deleteall path [-b batch size]
delquota [-n|-b|-N|-B] path
get [-s] [-w] path
getAcl [-s] path
 getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
printwatches on|off
quit
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
redo cmdno
removewatches path [-c|-d|-a] [-l]
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b|-N|-B val path
stat [-w] path
sync path
version
whoami

#创建数据
create /test "nihao"
#修改数据
set /test "hello"
#验证数据,在其它节点上也能看到一致的数据
ls /
get /test
hello

六、Zookeeper客户端ZooInspector

6.1 客户端编译

git clone https://github.com/zzhang5/zooinspector.git
cd zooinspector
mvn clean package

6.2 Windows客户端使用

Zookeeper介绍&集群部署_Zookeeper_07

Zookeeper介绍&集群部署_Zookeeper_08

Zookeeper介绍&集群部署_Zookeeper_09

标签:部署,Zookeeper,Leader,集群,path,节点,客户端
From: https://blog.51cto.com/u_15796303/6193455

相关文章

  • dockerfile的使用,使用dockerfile部署springboot项目
    文章目录一、dockerfile概述1、dockerfile基础2、Docker执行Dockerfile的大致流程3、镜像、容器、dockerfile的关系二、dockerfile常用保留字1、FROM2、MAINTAINER与LABEL3、RUN4、EXPOSE5、WORKDIR6、USER7、ENV8、ADD9、COPY10、VOLUME11、CMD12、ENTRYPOINT三、使用dockerfile构......
  • 【体验有奖】 玩转 AIGC,Serverless 一键部署 AI 图像生成服务
    玩转AIGC,5分钟Serverless部署StableDiffustion服务AI模型展现出的图像生成能力已经远超人们的预期,只需要给出文字描述就能创造出具有惊人视觉效果的图像,人人都是艺术家的时代即将来临。阿里云Serverless团队全新上线体验“基于函数计算FC+Serverless应用部署StableD......
  • 部署Python3
    1、安装编译工具yum-ygroupinstall"Developmenttools"yum-yinstallzlib-develbzip2-developenssl-develncurses-develsqlite-develreadline-develtk-develgdbm-develdb4-devellibpcap-develxz-develyuminstalllibffi-devel2、下载软件包并解压wgethttps://ww......
  • kubernetes 1.25.0 安装部署
    1.环境说明主机IP地址备注k8s-master192.168.0.200控制节点k8s-node1192.168.0.200工作节点k8s-node2192.168.0.200工作节点2.准备工作(所有节点)分别设置主机名hostnamectlset-hostnamek8s-masterhostnamectlset-hostna......
  • CentOS7---部署Tomcat和安装Jpress
    总览需求1.简述静态网页和动态网页的区别。2.简述Webl.0和Web2.0的区别。3.安装tomcat8,配置服务启动脚本,部署jpress应用。1、简述静态网页和动态网页的区别静态网页:请求响应信息,发给客户端进行处理,由浏览器进行解析,显示的页面,静态网页包含文本、图像、Flash动画......
  • docker:Dockerfile、docker私有仓库、dockercompose介绍、dockercompose部署flask+redi
    目录一、Dockerfile1.1常用和不常用命令1.2dockerfile构建一个djagno项目二、docker私有仓库2.1镜像传到官方仓库2.2镜像分层2.3私有仓库搭建三、dockercompose介绍四、dockercompose部署flask+redis项目4.1新建flask项目app.py4.2编写Dockerfile--》用于构建flask项目的......
  • docker,Dockerfile,docker私有仓库,dockercompose介绍,dockercompose部署flask+redis项目,d
    内容回顾容器操作dockerstart容器id启动容器dockerstop容器id停止容器dockerrm 容器id删除容器ockerrm`dockerps-aq`#正在运行的容器不能删除dockerexec容器id命令让容器执行命令dockercp宿主机目录容器id:容器目录#目录要存在dockercp容......
  • Linux-部署你的项目
    1选择服务器可自行选择,我选择的为aliyun的个人服务器,108一年的。2服务器环境设置2.1安装java1:查看当前java版本[root@localhostsoftware]#java-version2:查看当前服务器已安装的java[root@localhostsoftware]#rpm-qa|grepjava显示:java-1.7.0-openjdk-1.7.0......
  • 个人部署【未实现Nginx前端资源部署】
    【未在Nginx上实现静态资源部署】虚拟机A作为服务器A:安装Nginx、安装Mysql作为主库虚拟机B作为服务器B:安装能采用shell脚本部署项目所需软件:jdkgitmavenjar、安装Mysql作为从库、安装Redis作为缓存。服务器B操作:第一步:使用gitclone命令将远程仓库的代码克隆下来第二步:上......
  • 项目部署
    部署架构:Nginx:部署前端页面、配置反向代理Tomcat:springboot项目两个Mysql:主从复制Redis:缓存 部署环境说明:服务器:*192.168.138.100(服务器A)Nginx:部署前端项目、配置反向代理Mysql:主从复制结构中的主库*192.168.138.101(服务器B)jdk:运行java项目g......