目录

一、简介

二、构成和原理

三、搭建本地集群

四、zookeeper实现分布式锁


一、简介

1.官网的介绍

在部署分布式应用的时,需要花费大量的时间去修复bug和服务之间的竞争,zookeeper的作用是为分布式系统的配置命名同步提供中心化服务以及组服务的。
        简言之,zk就是为分布式应用提供一致性服务的软件!

2.应用场景

  • 数据或应用的发布/订阅
  • 负载均衡
  • 命名服务
  • 集群管理
  • 分布式锁
  • 分布式队列
    ...

二、构成和原理

1.本质:分布式文件管理系统+通知系统

1.1数据结构

zookeeper维护了一个类似于linux系统的文件系统,不同的是每一个节点是一个称之为znode,用唯一路径表示,/代表根目录。每个节点可以最大可以存储1MB的数据。

 1.2节点的类型

  • 持久节点(Persistant Node)
  • 临时节点(Ephemeral Node)

节点创建后类型不能够更改,客户端与zookeeper服务器建立会话连接结束后,临时节点会自动删除,而持久节点会一直存在,两种节点当然也可以手动删除;临时节点不能够拥有子节点。

  • 持久顺序节点(Persistant Node)
  • 临时顺序节点(Ephemeral Node)

当基于某父节点/a创建顺序节点/a/p时,zookeeper会根据/azxid创建一个全图唯一的自增序列编号1,2,3...;节点的命名就会带着标号顺序递增。

1.3节点的参数

cZxid:创建当前的事务ID(也就是Zxid的值)
ctime:当前节点的创建时间
mZxid:最后修改节点的事务ID
mtime:节点最后的修改时间
pZxid:最后添加或删除子节点的事务ID
cversion:当前节点子节点的版本信息(子节点的增加、删除都会影响版本信息)
dataVersion:当前节点的数据版本
aclVersion:当前节点的acl版本。
ephemeralOwner:当前节点是否临时节点,是则显示为有者的 session ID, 否则设置为零
dataLength:当前节点数据字段的长度
numChildren:当前节点子节点的数量

2.运行流程

读:客户端无论读请求的是Leader 还是 Follower ,直接返回结果。

写:客户端写请求leader,leader写入并分发给follower让其写入,收到一半以上的ack时通知客户端写入成功;
        客户端写请求follower,follower先转发个leader,leader写入后再讲写请求分发给follower,收到一半以上的ack时通知客户端写入成功。

上述过程,Zookeeper 读写的数据一致性主要依赖于ZAB协议的消息广播、崩溃恢复、数据同步三个过程,参考以下

Zookeeper之ZAB协议详解_午后的红茶meton的博客-CSDN博客_zookeeper zab协议

3.选举机制

3.1基础概念

选举设计到两个重要的参数,zxidmyid。

zxid:相当于一个时间戳,代表当前节点数据的更新程度,zxid越大代表当前节点的数据更新,所以在选举中有更大的权重去竞争leader,因为根据zk的leader是要主动去发起数据同步的。zxid由64位数字组成=高32位的epoch+低32位递增数列,每个leader都有自己的统治年代,高32位epoch代表当前leader的统治年,低32位则是递增计数位。

myid:zk集群中每个节点的标识id,作为选举的第二权重,当zxid区分不出leader时决定leader。
3.2选举
        选举原则:节点启动后依次进入选举状态(looking),每个节点与目前获得所选票的节比较zxid和myid,zxid大者获得当前所有选票,若zxid相同再比较myid,myid大者获得当前所有选票;弱当前节点获得选票数超过集群节点数的一半,则当选为leader,剩下的节点直接成为follower。

集群总节点数一般设为奇数,目的有两个:

  • 集群过半保持运行的机制导致2N-1和2N容错成本相当,4台和三台服务器要保持正常运行的话同样只能宕机一台,即保证集群正常运行最少需要2N-1个节点即可
  • 集群保持读写一致只能有一个leader,若节点数为偶数,有可能在各自半区选出两个leader

zk的选举分为启动阶段和运行阶段的选举。

  • 启动阶段的leader选举:

        假设zk集群有3个节点先后启动,myid分别为1、2、3,zxid相同;

>节点1进入looking选举状态,无人可比给自己投票,当前节点获得票数=1<节点总数的一半=1.5,故节点1仍保持looking状态继续等待选举;

>节点2进入looking选举状态,和得票节点1比,zxid一样,myid更大,获得节点1和自己的选票,此时当前节点获得票数=2>节点总数的一半=1.5,故节点2当选leader;

>节点3进入looking选举状态,发现leader出现,直接变成follower,选举结束。

  • 运行阶段的选举

运行阶段每个节点的zxid都可能不同,但选举原则与启动阶段一样,都是先比较zxid,再比较myid,当节点获得选票超过节点总数的一半时当选leader,其他节点直接成为follower。

4.监听机制

        zookeeper的监听实际上就是为分布式系统提供了一个服务端消息的push的解决方法。采用观察者模式,客户端与服务端建立长连接,监听某一节点,一旦节点触发了监听事件,服务端就会通知客户端采取相应操作。

4.1监听流程

  1. 创建zkClient,启动两个线程,连接线程和监听线程
  2. 通过连接线程将注册的监听事件发送给zkServer
  3. 在zkServer的注册监听列表中添加/path节点的监听器
  4. 当/path节点触发监听事件时,zkServer就会将这个消息发送给监听线程
  5. 监听线程调用方法,执行相应操作

4.2监听的事件类型

  • 节点创建
  • 节点删除
  • 节点数据修改
  • 子节点的变更

三、搭建本地集群

1.下载安装虚拟机,详细过程参考如下博客,安装ssh远程终端工具,推荐xshell和xftp(官网下载使用免费版即可)

VMware虚拟机与Linux系统安装_nevertoolate!的博客-CSDN博客

2.安装JDK

2.1下载JDK8

Java Downloads | Oracle

2.2将创建目录并将下载好的压缩包导入

/opt/java(个人习惯将安装的软件放在/opt目录下,也可以根据自己习惯放在其他目录)

2.3解压到当前目录

tar -zxvf jdk-8u351-linux-x64.tar.gz

2.4 进入配置文件,配置环境变量

vi /etc/profile
export JAVA_HOME=/opt/java/jdk1.8.0_351
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

2.5运行配置文件并检查java安装情况

source /etc/profile
java -version

3.单机安装zookeeper

3.1下载zookeeper

下载地址:Apache ZooKeeper,下载当前的版本第一个;该版本已经包含运行zk的全部jar包,source release版则需要安装maven导入相关依赖。

3.2将创建目录并将下载好的压缩包导入

/opt/zookeeper

3.3解压到当前目录

tar -zxvf apache-zookeeper-3.6.3-bin

3.4在解压目录下创建data和log目录(个人习惯)

mkdir data
mkdir log

3.5备份配置文件

cp zoo_sameple.cfg zoo.cfg
vi zoo.cfg

3.6更改配置

当前虚拟机zk服务器编号为1,IP为192.168.101.100,2888和3888为集群内部通讯端口号

3.7在dataDir路径下创建文件名为myid,文件内容为服务器编号的文件(此处为1)

touch myid
vi myid

3.8复制机器,集群配置

3.8.1用VMware的快照功能复制两台配置好的zk服务器

此处node1用作server.2,node2用作server.3

3.8.2进入node1和node2更改虚拟机ip地址和zk的myid文件

node1 ip:192.168.101.101 myid:2

node2 ip:192.168.101.102 myid:3

vi /etc/sysconfig/network-scripts/ifcfg-ens33
vi /opt/zookeeper/apache-zookeeper-3.6.3-bin/data/myid

3.9进入zk的bin目录,启动三台zk的服务器

cd /opt/zookeeper/apache-zookeeper-3.6.3-bin/bin/
./zkServer.sh start

 

三台zk服务启动成功,server2被选作leader

3.10启动客户端连接

./zkCli.sh

 出现上图情况说明连接成功!

注意注意注意!!!

如果3.8没配置集群。客户端脸上后会认为集群只有一台机器在运行,少于半数(三台),会报以下错误:

4.zk相关操作

Zookeeper的操作_loser与你的博客-CSDN博客_zookeeper操作

四、zookeeper实现分布式锁

流程:

1.不同线程在/locks节点下创建临时有序节点,并对前一个临时有序节点创建监听事件

2.当前线程判定自己创建的临时节点是否为编号为最小的临时节点;

是,获取锁进行调用;调用结束后结束会话删除当前临时节点,触发watch机制通知下一个应用获取锁;

否,等待被通知获取锁。

zk实现分布式锁的好处:

1.zk数据一致性,可以在不同server上进行获取/释放锁操作,实现高可用

2.采用临时节点,当进程挂掉时锁会自动删除,不会造成单一应用长时间占用的死锁场景

3.锁的重入:在锁的内部维护一个int 变量int state记录重入的次数,释放时候判断state是否为1,是就释放锁,否则state-1。

学习上手Zookeeper,看这篇就够了相关推荐

  1. 如何学习前端?看这篇就够了

    引子 ​ 作为一个前端工作多年的老鸟,见过各种各样的萌新入行前端,正好有些时间,把心里的一些话写一写,实在是不吐不快. ​ 我见过入职之后不明白什么是前端是做什么的"中级前端". ...

  2. 漫画:学习中台,看这篇就够了

    没有中台的时代 在传统IT企业,项目的物理结构是什么样的呢?无论项目内部的如何复杂,都可分为"前台"和"后台"这两部分. 什么是前台? 首先,这里所说的&quo ...

  3. Linux学习大全(看一篇就够了)持续更新...

    一.Linux目录文件 1.基本目录结构 在Linux世界里,一切皆为文件. 2.详细的目录 /bin  经常使用的命令 /sbin  存放的是系统管理员使用的系统管理程序 /home  存放普通用户 ...

  4. 学习 Scss? 看这篇就够了

    作者:小猪努力学前端 https://juejin.cn/post/7055101823442485255 前言 今时不同往日,能叫我们切图仔的只能是我们自己! 在JavasScrip框架满天飞的年代 ...

  5. 一篇完整的 Scss 学习指南,看这篇就够啦

    作者:小猪努力学前端 https://juejin.cn/post/7055101823442485255 前言 今时不同往日,能叫我们切图仔的只能是我们自己! 在JavasScrip框架满天飞的年代 ...

  6. Spring Cloud入门,看这篇就够了!

    点击▲关注 "中生代技术"   给公众号标星置顶 更多精彩 第一时间直达 概述 首先我给大家看一张图,如果大家对这张图有些地方不太理解的话,我希望你们看完我这篇文章会恍然大悟. 什 ...

  7. 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了【ZT帅地】2020-3-7

    https://blog.csdn.net/m0_37907797/article/details/104029002 由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围 ...

  8. caffe-源码学习——只看一篇就够了

    caffe-源码学习--只看一篇就够了 网络模型 说caffe代码难懂,其实关键点在于caffe中有很多基础的数学运算代码,如果能够对掌握这些数学运算,剩下的就是推公式了. 激活函数 sigmoid ...

  9. Python-Excel 零基础学习xlwings,看这篇文章就够了

    零基础学习xlwings,看这篇文章就够了 | 一起大数据-技术文章心得 (17bigdata.com) 1.xlwings是什么 2.xlwings安装更新与卸载 3.xlwings详细使用 4.案 ...

  10. 学习 HTML+CSS 这一篇就够了

    文章目录 学习 HTML+CSS 这一篇就够了 ! HTML 简介 一.网页 1 .什么是网页 2. 什么是 HTML 3.网页的形成 4.网页总结 二.浏览器 1. 常用浏览器 2.浏览器内核 三. ...

最新文章

  1. NSight Compute 用户手册(中)
  2. hadoop系统 hdfs 命令行操作
  3. 极客广州——EOS Asia郭达峰担任SegmentFault思否黑客马拉松技术顾问
  4. 钉钉获取免登授权码 php_php代码如何加域名授权?开源php项目如何保护版权 商业授权?...
  5. java中array,arrayList,iterator;
  6. MySQL高级 - 锁 - InnoDB行锁 - 争用情况查看
  7. 《你必须掌握的Entity Framework 6.x与Core 2.0》书籍出版
  8. java的多态怎么理解_JAVA多态的理解
  9. python将列表写入文件_Python将列表数据写入文件(txt, csv,excel)
  10. 关于Winform下,获取Treeview中CheckBox选中项的“.NET研究”技巧
  11. Tomcat7安装(jdk 1.7环境)
  12. JAVA毕业设计共享汽车管理系统计算机源码+lw文档+系统+调试部署+数据库
  13. android截屏加水印,Android截图以及加水印Demo
  14. 51单片机计算机加原理图,AT89C51单片机的基本结构和工作原理
  15. 20 年来,从微软亚洲研究院走出了中国互联网的半壁江山
  16. 我的世界服务器告示牌不显示,我的世界告示牌没有字_我的世界告示牌不显示字怎么用_攻略...
  17. 计算机二级c好考吗,计算机二级MS Office和C语言哪个比较好考?
  18. 导出RK3288开发板上的根文件系统,并打包img
  19. ios 中字符串怎么换行
  20. 在线文字生成音频工具

热门文章

  1. ble传输是断续的吗
  2. 4字节 经纬度_经纬度表示方法
  3. 欺骗的艺术——第二部分(10)
  4. mysql数据库教程 外键_MySQL数据库外键
  5. 内核崩溃捕获机制之kdump详解
  6. 思科高级配置(三层交换配置路由)
  7. Mybatis之分页插件
  8. 改进的负载线移相器设计与仿真(适用于45度以内移相)
  9. Hadoop Kerberos 集成
  10. 2024 QS世界大学排名:71所中国大陆高校上榜,北京大学排名全球第17位 | 美通社头条...