Zookeeper简介

news/2024/5/21 17:59:03/文章来源:https://blog.csdn.net/weixin_46514551/article/details/126922018

文章目录

    • Zookeeper简介
      • zookeeper能做什么
      • zookeeper的数据模型
      • zookeeper工作机制
      • zookeeper集群的选举机制
        • 1、第一次启动选举机制
        • 2、非第一次启动选举机制
      • 搭建zookeeper的集群

Zookeeper简介

zookeeper能做什么

master节点选举:主节点挂了以后,从节点就会接手工作并且保证整个节点时唯一的,从而保证集群的高可用。

统一配置文件管理:即只需要部署一台node,则可以把相同的配置文件同步更新到其他所有服务器。(配置中心)

发布与订阅:类似消息队列MQ,服务提供者把数据注册在zookeeper server上,服务消费者订阅这个服务,从zookeeper server上获取该服务数据。

分布式锁:解决分布式环境中不同进程之间抢占资源的问题,类似多线程中的锁。一个进程占用,其他进程服务使用该资源。

集群管理:分布式环境中,实时掌握每个节点的状态是必须的。可根据节点实时状态做出一些调整。

zookeeper可以实现实时监控节点状态变化。可将节点信息写入zookeeper的一个node,监控这个节点的变化。

统一命名服务:在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。

服务器动态上下线

客户端能够实施监听服务的所在服务的上下线的变化。

软负载均衡:

在zookeeper中记录每个服务器的访问次数,让访问数量少的服务器去处理最新的客户端请求。

zookeeper中的数据是存储在内存中的,因此它的效率十分

zookeeper的数据模型

zookeeper本质上是一个分布式的小文件存储系统;

zookeeper表现为一个分层的文件系统目录树结构(不同于文件系统的是,节点可以有自己的数据,而文件系统中的目录节点只有子节点),每个节点可以存少量的数据(1M左右)。

每个节点称做一个ZNode。每个ZNode都可以通过其路径唯一标识。

img

zookeeper中的每个节点存储的数据要被原子性的操作。也就是读操作将获取与节点相关的所有数据,写操作也将替换掉节点的所有数据。

在zookeeper创建顺序节点,节点路径后加编号,这个计数对于此节点的父节点来说是唯一的。

zookeeper中的节点有两种,分别为临时节点和永久节点,节点的类型在创建时即被确定,并且不能改变。

​ 临时节点:在客户端用create -e创建,该节点的生命周期依赖于创建它们的会话。一旦会话(Session)结束,临时节点将被自动删除,当然可以也可以手动删除。虽然每个临时的Znode都会绑定到一个客户端会话,但他们对所有的客户端还是可见的。另外,ZooKeeper的临时节点不允许拥有子节点。

​ 永久节点:在客户端用create 创建,该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,他们才能被删除。

结合分布式锁浅聊数据结构:

image-20220831190221099

假设有三个服务s1、s2、s3,都要使用/java这个节点,就要利用分布式锁,三个服务进行抢占,谁先在/java下创建子节点,就代表谁抢到了,也就锁住了资源,那么其他就需要等待s2结束,在此期间,s1和s3会一直监听/java,当s2这个服务挂掉或关闭,会把/java下的子节点删除,代表锁被释放,就会触发监听,通知其他服务可以进行抢占。

也有一种情况就是,三个服务都要创建/java这个节点,谁先创建了,谁就是抢占了,结束时,会把/java这个节点删除,表示锁被释放。

zookeeper工作机制

Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。也就是说 Zookeeper =文件系统+通知机制。

zookeeper集群的选举机制

1、第一次启动选举机制

image-20220831194501902

(1)服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING。

(2)服务器2启动,再发起一次选举。服务器1和2分别投自己一票并交换选票信息;此时服务器1发现服务器2的myid比自己目前投票选举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1、2状态保持LOOKING。

(3)服务器3启动,发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader。服务器1、2更改状态为FOLLOWING,服务器3更改状态为LEADING。

(4)服务器4启动,发起一次选举。此时服务器1、2、3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING。

(5)服务器5启动与服务器4一样。

2、非第一次启动选举机制

img

当ZooKeeper集群中的一台服务器出现以下两种情况之一时,就会开始进入Leader选举:

服务器初始化启动。

服务器运行期间无法和Leader保持连接。

而当一台机器进入Leader选举流程时,当前集群也可能会处于以下两种状态:

集群中本来就己经存在一个Leader。对于已经存在Leader的情况,机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器来说,仅仅需要和Leader机器建立连接,并进行状态同步即可。

集群中确实不存在Leader。假设ZooKeeper由5台服务器组成,SID分别为1、2、3、4、5,ZXID分别为8、8、8、7、,并且此时sID为3的服务器是。一时刻,3和5服务器出现故障,因此开始进行Leader选举。

选举Leader规则:

事务id大的胜出
事务id相同,服务器id大的胜出

搭建zookeeper的集群

1、解压安装包

tar zxvf apache-zookeeper-3.5.7-bin.tar.gz
mv apache-zookeeper-3.5.7-bin /usr/local/zookeeper

2、配置配置文件

cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
tickTime=2000#通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒initLimit=10
#Leader和Follower初始连接时能容忍的最多心跳数(tickTime的数量),这里表示为10*2s
syncLimit=5
#Leader和Follower之间同步通信的超时时间,这里表示如果超过5*2s,Leader认为Follwer死掉,并从服务器列表中删除Follwer
dataDir=/usr / local/ zookeeper-3.5.7/data
#修改,指定保存Zookeeper中的数据的目录,目录需要单独创建
dataLogDir=/usr/local/zookeeper-3.5.7/logs
#添加,指定存放日志的目录,目录需要单独创建clientPort=2181#客户端连接端口
#添加集群信息.
server.1=192.168.10.11:3188:3288
server.2-192.168.10.12:3188:3288
server.3=192.168.10.13:3188:3288

image-20220831201825587

mkdir /usr/local/zookeeper/data
mkdir /usr/local/zookeeper/logs

echo 1 > /usr/local/zookeeper/data/myid

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

image-20220901005624286

image-20220901005656806

image-20220901005710073

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

image-20220901005733052

image-20220901005748551

-1663501388800)]

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

[外链图片转存中…(img-QKhA2N00-1663501388800)]

[外链图片转存中…(img-bJ3u4OsT-1663501388800)]

image-20220901005805747

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_9803.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 ANFIS 的非线性回归(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 👨‍🎓博主课外兴趣:中西方哲学,送予读者: 👨‍&a…

字符串函数以及内存函数的模拟实现(超详细,全面理解字符串函数!!!)

目录 一、strlen 1.参数指向的字符串必须要以 \0 结束。 2.注意strlen函数的返回值为size_t,是无符号的 3.模拟实现strlen 二、strcpy 1.源字符串中的 \0 拷贝到目标空间 2.源字符串必须以 \0 结束 3.目标空间必须足够大,以确保能存放源字符串 4…

@Conditional

条件装配:满足Conditional指定的条件,则进行组件注入 @Configuration//告诉springboot这是一个配置类 public class MyConfig {@Bean("tom")public Stu stu01(){return new Stu("汤姆");}@ConditionalOnBean(name="tom")//当容器中有tom组件时…

windows工具:推荐一款可以截长图(滚动截图)的工具FSCapture

windows工具:推荐一款可以截长图(滚动截图)的工具前言一、FSCapture是什么?二、使用方法1.下载地址和安装2.使用方法前言 有的时候你画的框架图太大,已经超过了一屏,想要导出图片,用普通窗口截…

汇编常用寄存器以及寻址方式

寄存器概览 常用寄存器 AX accumulator 累加寄存器 BX base 基址寄存器 CX count 计数寄存器 DX data 数据寄存器 SP stack pointer 堆栈寄存器 BP base pointer 基址指针寄存器 SI source index 源变址寄存器 DI destination index 目的变址寄存器 IP instruction pointer 指…

ch4 报错修正 Sophus使用

ch4 报错& 修正 (1) # 添加Eigen头文件 include_directories( "/usr/include/eigen3" )(2) #include "sophus/so3.hpp" #include "sophus/se3.hpp"(3) 大量报错但都…

定制qga(作业截图)

文章目录一、qga介绍二、证明qga命令可以正常使用三、创建qga安装包四、总步骤一、qga介绍 qemu guest agent简称qga, 是运行在虚拟机内部的一个守护程序(qemu-guest-agent.service), 他可以管理应用程序,执行宿主机发…

声呐直线阵正交混频实验(HEU信息与信号处理创新实践项目一)

写在前面 这个实验原要求是要实现 969696 通道的正交混频变换(后来老师说只要不是单通道都行),因此必须使用 FIRFIRFIR IP核(手搓FIR一两个通道还行,96通道就太费劲了),所以实验成功的关键就是…

BNU002期-学术沙龙-写好综述

文章目录综述的介绍什么是综述为什么要读综述为什么要写综述怎样写综述综述案例中的问题对于综述写作问题的分类如何避免综述写作问题讨论综述问题框架环节并完善做个升华:谈谈科研和读综述的乐趣本文引用资料的链接补充综述的介绍 本文围绕 什么是综述 我创设这…

微服务基础---认识微服务

1.1认识微服务 1.1.1微服务架构演变 单体架构 将业务的所有功能都集中在一个项目中进行开发,打成一个包部署. 优点:架构简单、部署成本低缺点:耦合度高 分布式架构 根据业务功能对系统进行拆分,每个业务模块作为独立项目开发&am…

软件流程和管理(八):Ethics

目录 1. Ethics 1.1 道德(Ethics)是什么? 1.2 关于计算机伦理的错误假设 1.3 为什么你要关心建立道德技能和知识 1.4 信息技术的道德责任 1.5 澳大利亚计算机协会的道德准则 1.6 组织中的道德是很重要的 1.7 道德:实用指…

zephyr线程生命周期

ephyr中线程是使用CPU的最小单位,线程从创建后由zephyr内核进行调度,根据运行和等待资源的状况在几个状态中切换,直到线程终止退出生命周期。 线程状态 线程在其生命周期中有下面6种状态: New 创建:线程被创建起来但…

实验2:Open vSwitch虚拟交换机实践

(一)基本要求1.ovs-vsctl基础操作实践:创建OVS交换机,以ovs-xxxxxxxxx命名,其中xxxxxxxxx为本人学号。在创建的交换机上增加端口p0和p1,设置p0的端口号为100,p1的端口号为101,类型均为internal;为了避免网络接口上的地址和本机已有网络地址冲突,需要创建虚拟网络空间…

Redis实现消息队列(双端队列的模式,发布订阅模式)

文章目录 1 采用双端队列的模式1.1 入队出队操作1.2 生产者编写1.3 消费者编写1.4 测试2 采用发布订阅模式2.1 编写生产者2.2 编写消费者2.3 测试​ 本部分,我们使用 redis实现消息队列的功能,采用 redis实现消息队列主要有两种方式:采用 redis自带双端队列实现;采用 r…

【牛客刷题-算法】NC7 买卖股票的最好时机(一)

个人主页:清风莫追 系列专栏:牛客刷题——数据结构与算法 推荐一款面试、刷题神器牛客网:👉点击开始刷题学习👈 文章目录1.题目描述2.算法设计思路3.代码实现4.运行结果结束语:1.题目描述 描述 假设你有一…

Android移动应用开发之ImageView、ProgressBar和Notification的一些简单使用

文章目录主要文件目录MainActivity:NotificationActivitya.pngic_baseline_account_box_24.xmlactivity_main运行主要文件目录 MainActivity: 这里主要用于按钮响应处理和通知处理 package zufe.scq.hunter;import androidx.appcompat.app.AppCompatActivity; import android…

Letcode动态规划专题-困难

10. 正则表达式匹配 42. 接雨水 1.传统方式-按照行的方式计算 整个思路就是,求第 i 层的水,遍历每个位置,如果当前的高度小于 i,并且两边有高度大于等于 i 的,说明这个地方一定有水,水就可以加 11。 如…

pytest测试框架2【控制用例的执行顺序】

1.pytest加载所有的测试用例都是乱序的,如果想指定用例的顺序,可以使用pytest-ordering插件,指定用例的执行顺序只需要在测试用例的方法前面加上装饰器@pytest.mark.run(order=[num])设置order的对应的num值,它就可以按照num的大小顺序来执行 应用场景:有时运行测试用例需…

03(C++二级)

1.函数不可嵌套定义,但可以嵌套调用。 2.静态数据成员必须在类外初始化,使用类名调用。 初始化格式: <数据类型><类名>::<静态数据成员名> = <值> 3.C++不能重载的: :: . * ->* ?: 4.

普通人做网赚在网上依旧是个好机会

有一个朋友和我说&#xff0c;现在网上不怎么好赚钱了&#xff0c;我想去干实体赚钱&#xff0c;听他说这个话&#xff0c;我笑了&#xff0c;实体行业才没有你们所看到的那么简单的&#xff01;作为普通人互联网上搞钱&#xff0c;未来几年依旧会是机会的&#xff01;以前我只…