学习上手Zookeeper,看这篇就够了
目录
一、简介
二、构成和原理
三、搭建本地集群
四、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会根据/a的zxid创建一个全图唯一的自增序列编号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基础概念
选举设计到两个重要的参数,zxid和myid。
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监听流程
- 创建zkClient,启动两个线程,连接线程和监听线程
- 通过连接线程将注册的监听事件发送给zkServer
- 在zkServer的注册监听列表中添加/path节点的监听器
- 当/path节点触发监听事件时,zkServer就会将这个消息发送给监听线程
- 监听线程调用方法,执行相应操作
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,看这篇就够了相关推荐
- 如何学习前端?看这篇就够了
引子 作为一个前端工作多年的老鸟,见过各种各样的萌新入行前端,正好有些时间,把心里的一些话写一写,实在是不吐不快. 我见过入职之后不明白什么是前端是做什么的"中级前端". ...
- 漫画:学习中台,看这篇就够了
没有中台的时代 在传统IT企业,项目的物理结构是什么样的呢?无论项目内部的如何复杂,都可分为"前台"和"后台"这两部分. 什么是前台? 首先,这里所说的&quo ...
- Linux学习大全(看一篇就够了)持续更新...
一.Linux目录文件 1.基本目录结构 在Linux世界里,一切皆为文件. 2.详细的目录 /bin 经常使用的命令 /sbin 存放的是系统管理员使用的系统管理程序 /home 存放普通用户 ...
- 学习 Scss? 看这篇就够了
作者:小猪努力学前端 https://juejin.cn/post/7055101823442485255 前言 今时不同往日,能叫我们切图仔的只能是我们自己! 在JavasScrip框架满天飞的年代 ...
- 一篇完整的 Scss 学习指南,看这篇就够啦
作者:小猪努力学前端 https://juejin.cn/post/7055101823442485255 前言 今时不同往日,能叫我们切图仔的只能是我们自己! 在JavasScrip框架满天飞的年代 ...
- Spring Cloud入门,看这篇就够了!
点击▲关注 "中生代技术" 给公众号标星置顶 更多精彩 第一时间直达 概述 首先我给大家看一张图,如果大家对这张图有些地方不太理解的话,我希望你们看完我这篇文章会恍然大悟. 什 ...
- 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了【ZT帅地】2020-3-7
https://blog.csdn.net/m0_37907797/article/details/104029002 由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围 ...
- caffe-源码学习——只看一篇就够了
caffe-源码学习--只看一篇就够了 网络模型 说caffe代码难懂,其实关键点在于caffe中有很多基础的数学运算代码,如果能够对掌握这些数学运算,剩下的就是推公式了. 激活函数 sigmoid ...
- Python-Excel 零基础学习xlwings,看这篇文章就够了
零基础学习xlwings,看这篇文章就够了 | 一起大数据-技术文章心得 (17bigdata.com) 1.xlwings是什么 2.xlwings安装更新与卸载 3.xlwings详细使用 4.案 ...
- 学习 HTML+CSS 这一篇就够了
文章目录 学习 HTML+CSS 这一篇就够了 ! HTML 简介 一.网页 1 .什么是网页 2. 什么是 HTML 3.网页的形成 4.网页总结 二.浏览器 1. 常用浏览器 2.浏览器内核 三. ...
最新文章
- NSight Compute 用户手册(中)
- hadoop系统 hdfs 命令行操作
- 极客广州——EOS Asia郭达峰担任SegmentFault思否黑客马拉松技术顾问
- 钉钉获取免登授权码 php_php代码如何加域名授权?开源php项目如何保护版权 商业授权?...
- java中array,arrayList,iterator;
- MySQL高级 - 锁 - InnoDB行锁 - 争用情况查看
- 《你必须掌握的Entity Framework 6.x与Core 2.0》书籍出版
- java的多态怎么理解_JAVA多态的理解
- python将列表写入文件_Python将列表数据写入文件(txt, csv,excel)
- 关于Winform下,获取Treeview中CheckBox选中项的“.NET研究”技巧
- Tomcat7安装(jdk 1.7环境)
- JAVA毕业设计共享汽车管理系统计算机源码+lw文档+系统+调试部署+数据库
- android截屏加水印,Android截图以及加水印Demo
- 51单片机计算机加原理图,AT89C51单片机的基本结构和工作原理
- 20 年来,从微软亚洲研究院走出了中国互联网的半壁江山
- 我的世界服务器告示牌不显示,我的世界告示牌没有字_我的世界告示牌不显示字怎么用_攻略...
- 计算机二级c好考吗,计算机二级MS Office和C语言哪个比较好考?
- 导出RK3288开发板上的根文件系统,并打包img
- ios 中字符串怎么换行
- 在线文字生成音频工具