zookeeper工作原理简述

本文深入探讨Zookeeper,一种解决分布式系统中数据访问不确定性、视角不统一等问题的服务。介绍了Zookeeper的基础单元znode,其四种类型及应用场景,如配置管理、名称服务、分布式锁和集群管理。此外,详细讲解了Zookeeper的设计目的、角色、选主流程、数据同步机制以及节点数据操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Zookeeper的出现是为了解决分布式系统中,由于网络不确定性所引起的:数据访问顺序不确定、数据访问视角不统一、节点上下线感知滞后等问题。

1、Zookeeper是什么?

Zookeeper是一个分布式的,开放源码的分布式应用程序系诶套服务,是Google的Chubby一个开源的实现。

2、Zookeeper基础单元

zookeeper基础单元称作znode,类似于操作系统中的文件夹。

对zookeeper的所有操作就相当于对节点的增删改查

Znode有4中类型:

PERSISTENT,PERSISTENT_SEQUENTIAL

创建的znode在客户端断开时还存在

EPHEMERAL,EPHEMERAL_SEQUENTIAL

创建的znode在客户端断开时自动删除

SEQUENTIAL类型会在创建的znode文件夹后面增加一个编号

顺序号是一个单调递增的计数器,由父节点维护

创建4个节点

当退出后

3、zookeeper监听机制

zookeeper会监控znode改编情况

由于其他服务器都在访问某znode

--创建znode删除znode的时候,其他服务器会感知到

--某znode种设置的内容改编,其他服务器会感知到

通过对znode的增加删除,设置内容可以对多个节点进行协调

4、zookeeper可以做什么?

1)配置管理

--多台服务器都需要统一配置文件

--配置文件会动态改变的情况下

该种情况可以通过zookeeper进行统一管理

**通过创建znode将配置内容存入znode中,每台机器都查看同一个znode

2)名称服务

--多台服务器访问某地址,直接访问ip显得不友好

--该地址dns对应ip会变化

该种情况可以通过zookeeper进行统一管理

**通过创建znode将dns与ip对应内容存入znode中,每台机器都查看同一个znode

3)分布式锁

--多台服务器访问同一资源

--该资源修改要有顺序性

--同一时间只有一个客户端访问资源

该种情况可以通过zookeeper节点的持有来控制

**多台服务器共同创建同一个znode,哪台机器创建成功,哪台机器访问资源,访问资源后删除节点

**在多台服务器在某个固定znode下创建带序号的子zonde,按照序号小的先访问,访问后删除节点

4)集群管理

--某台服务器上线

--某台服务器上线

该种情况可以通过zookeeper节点下子节点的增加减少来控制

**服务器上线时在约定好的znode中创建对应名称的   临时znode

**服务器下线时对应的znode自动删除

5、Zookeeper设计目的

1). 最终一致性:

client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。

2). 可靠性:

具有简单、健壮、良好的性能,如果消息被到一台服务器接受,那么它将被所有的服务器接受

3). 实时性:

Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等

原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口 

4. 等待无关(wait-free):

慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。 

5.原子性:

更新只能成功或者失败,没有中间状态。 

6.顺序性:

包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在

消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。

6、Zookeeper角色

--leader:负责投票发起,负责同步数据状态

--learner:负责接收client请求

--follow:隶属learner参与投片

--observer:隶属learner不参与投票,只接收client请求

--client:向zookeeper集群发送请求

7、zookeeper选主流程及数据同步

每台服务器都有属于自己的myid与zxid,投票时先比较zxid,如果相同比较myid

1):集群启动,服务器都是最初状态

--由于服务器都为最初状态,因此每台机器对应的zxid都是0,因此对比myid。

--启动第一台服务器,没有其他服务器,投自己一票,统计票数是否达到了服务器总数

一半以上,服务器为looking状态

--再启动一台服务器,判断两台服务器myid大小,算上自己给myid投2票,统计票数是否满足条件,服务器为looking状态

--按照启动顺序,每台服务器都比较myid大小,最大的得票,统计票数是否满足条件

--当启动到某台服务器,票数相加满足票数达到了服务器总数一半以上,选举此时myid最大的为leader,服务器转为learding状态,其他转为flowing状态

--再启动服务器虽然myid很大由于存在leader,因此成为follower,转为following状态。

2):服务器运行一段时间

--leader断掉,其他节点转变为looking状态

--由于服务器运行一段时间,因此每台机器对应的zxid会有些许不同

--首先所有服务器都投自己一票(相当于定义自己的zxid和myid信息)

--将自己的投票信息(自己对应的zxid和myid)发送给其他服务器

--其他服务器通过对比zxid,更新下次投票的信息(相当于对比所有zxid寻找对大的节点)

--当投票某服务器为leader,票数到半数以上(2/n + 1)时转变状态为learding

--其他服务器转变成following

选主后进行数据同步:

--发送心跳给其他服务器,确定连接状态

--follower连接leader将最大的zxid发送给leader

--leader接收到zxid,确认最大zxid对应数据需要同步的位置(确定哪台机器数据最全)

--将最大zxid对应的数据同步到其他服务器(将最全数据同步)

--当全部同步后,发送同步成功信息给follower

--follower收到同步成功信息后,可以继续接受client请求

8、Zookeeper节点数据操作流程

写操作

--client向某服务器提交写请求

--服务器将写请求转发个leader

--leader将写请求发送给所有follower

--follower将写成功信息发送给leader

--当leader统计超过半数以上follower写成功则完成写操作

读操作

--client向某服务器提交读请求

--由于最终一致性每台服务器数据相同

--不用通过leader进行协调,将follower上数据发送个client

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值