- 卷积神经网络学习笔记——ZFNet(Tensorflow实现)
- 24年3月使用VS22编译TelegramDesktop
- STM32中RFID模块(MFRC522)简单应用
- java反序列化-CC1
ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.
最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能.
可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受.
实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息.
但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口.
等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待.
原子性:更新只能成功或者失败,没有中间状态.
顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面.
Zookeeper会维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统,如图所示:
Zookeeper这种数据结构有如下这些特点:
1)每个子目录项如NameService都被称作为znode,这个znode是被它所在的路径唯一标识,如Server1这个znode的标识为/NameService/Server1.
2)znode可以有子节点目录,并且每个znode可以存储数据,注意EPHEMERAL(临时的)类型的目录节点不能有子节点目录.
3)znode是有版本的(version),每个znode中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据,version号自动增加.
4)znode的类型:
5)znode可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是Zookeeper的核心特性,Zookeeper的很多功能都是基于这个特性实现的.
6)ZXID:每次对Zookeeper的状态的改变都会产生一个zxid(ZooKeeper Transaction Id),zxid是全局有序的,如果zxid1小于zxid2,则zxid1在zxid2之前发生.
Client和Zookeeper集群建立连接,整个session状态变化如图所示:
如果Client因为Timeout和Zookeeper Server失去连接,client处在CONNECTING状态,会自动尝试再去连接Server,如果在session有效期内再次成功连接到某个Server,则回到CONNECTED状态.
注意:如果因为网络状态不好,client和Server失去联系,client会停留在当前状态,会尝试主动再次连接Zookeeper Server。client不能宣称自己的session expired,session expired是由Zookeeper Server来决定的,client可以选择自己主动关闭session.
Zookeeper watch是一种监听通知机制。Zookeeper所有的读操作getData(), getChildren()和 exists()都可以设置监视(watch),监视事件可以理解为一次性的触发器 。
官方定义如下:
a watch event is one-time trigger, sent to the client that set the watch, whichoccurs when the data for which the watch was set changes.
Watch的三个关键点:
当设置监视的数据发生改变时,该监视事件会被发送到客户端.
例如,如果客户端调用了getData(/znode1, true) 并且稍后 /znode1 节点上的数据发生了改变或者被删除了,客户端将会获取到 /znode1 发生变化的监视事件; 。
而如果 /znode1 再一次发生了变化,除非客户端再次对/znode1 设置监视,否则客户端不会收到事件通知.
Zookeeper客户端和服务端是通过 socket 进行通信的,由于网络存在故障,所以监视事件很有可能不会成功地到达客户端,监视事件是异步发送至监视者的.
Zookeeper 本身提供了顺序保证(ordering guarantee):即客户端只有首先看到了监视事件后,才会感知到它所设置监视的znode发生了变化(a client will never see a change for which it has set a watch until it first sees the watch event).
网络延迟或者其他因素可能导致不同的客户端在不同的时刻感知某一监视事件,但是不同的客户端所看到的一切具有一致的顺序.
这意味着znode节点本身具有不同的改变方式。你也可以想象 Zookeeper 维护了两条监视链表:数据监视和子节点监视(data watches and child watches) getData() 和exists()设置数据监视,getChildren()设置子节点监视.
或者你也可以想象 Zookeeper 设置的不同监视返回不同的数据,getData() 和 exists() 返回znode节点的相关信息,而getChildren() 返回子节点列表.
因此,setData() 会触发设置在某一节点上所设置的数据监视(假定数据设置成功),而一次成功的create() 操作则会出发当前节点上所设置的数据监视以及父节点的子节点监视.
一次成功的 delete操作将会触发当前节点的数据监视和子节点监视事件,同时也会触发该节点父节点的child watch.
Zookeeper 中的监视是轻量级的,因此容易设置、维护和分发。当客户端与 Zookeeper 服务器失去联系时,客户端并不会收到监视事件的通知,只有当客户端重新连接后,若在必要的情况下,以前注册的监视会重新被注册并触发,对于开发人员来说这通常是透明的.
只有一种情况会导致监视事件的丢失,即:通过exists()设置了某个znode节点的监视,但是如果某个客户端在此znode节点被创建和删除的时间间隔内与zookeeper服务器失去了联系,该客户端即使稍后重新连接 zookeeper服务器后也得不到事件通知.
Zookeeper是一个高效的、可扩展的服务,read和write操作都被设计为快速的,read比write操作更快.
顺序一致性(Sequential Consistency):从一个客户端来的更新请求会被顺序执行.
原子性(Atomicity):更新要么成功要么失败,没有部分成功的情况.
唯一的系统镜像(Single System Image):无论客户端连接到哪个Server,看到系统镜像是一致的.
可靠性(Reliability):更新一旦有效,持续有效,直到被覆盖.
时间线(Timeliness):保证在一定的时间内各个客户端看到的系统信息是一致的.
在zookeeper的集群中,各个节点共有下面3种角色和4种状态:
Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议(ZooKeeper Atomic Broadcast protocol)。Zab协议有两种模式,它们分别是恢复模式(Recovery选主)和广播模式(Broadcast同步).
当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态.
为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid.
实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数.
每个Server在工作过程中有4种状态:
LOOKING:当前Server不知道leader是谁,正在搜寻.
LEADING:当前Server即为选举出来的leader.
FOLLOWING:leader已经选举出来,当前Server与之同步.
OBSERVING:observer的行为在大多数情况下与follower完全一致,但是他们不参加选举和投票,而仅仅接受(observing)选举和投票的结果.
当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态.
Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的.
系统默认的选举算法为fast paxos。先介绍basic paxos流程:
1 选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server; 。
2 选举线程首先向所有Server发起一次询问(包括自己); 。
3 选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中; 。
4 收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server; 。
5 线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1的Server票数,设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来.
通过流程分析我们可以得出:要使Leader获得多数Server的支持,则Server总数必须是奇数2n+1,且存活的Server的数目不得少于n+1. 。
每个Server启动后都会重复以上流程。在恢复模式下,如果是刚从崩溃状态恢复的或者刚启动的server还会从磁盘快照中恢复数据和会话信息,zk会记录事务日志并定期进行快照,方便在恢复时进行状态恢复.
fast paxos流程是在选举过程中,某Server首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch和zxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出Leader.
Leader主要有三个功能:
说明:
PING消息是指follower的心跳信息;REQUEST消息是follower发送的提议信息,包括写请求及同步请求; ACK消息是follower的对提议的回复,超过半数的follower通过,则commit该提议; REVALIDATE消息是用来延长SESSION有效时间.
Follower主要有四个功能:
Follower的消息循环处理如下几种来自Leader的消息:
Zookeeper Server接收到一次request,如果是follower,会转发给leader,Leader执行请求并通过Transaction的形式广播这次执行.
Zookeeper集群如何决定一个Transaction是否被commit执行?通过“两段提交协议”(a two-phase commit):
Zab协议保证:
“两段提交协议”最大的问题是如果Leader发送了PROPOSAL消息后crash或暂时失去连接,会导致整个集群处在一种不确定的状态(follower不知道该放弃这次提交还是执行提交).
Zookeeper这时会选出新的leader,请求处理也会移到新的leader上,不同的leader由不同的epoch标识。切换Leader时,需要解决下面两个问题:
Leader在COMMIT投递到任何一台follower之前crash,只有它自己commit了。新Leader必须保证这个事务也必须commit.
Leader产生某个proposal,但是在crash之前,没有follower看到这个proposal。该server恢复时,必须丢弃这个proposal.
Zookeeper会尽量保证不会同时有2个活动的Leader,因为2个不同的Leader会导致集群处在一种不一致的状态,所以Zab协议同时保证:
这里的quorum是一半以上的Server数目,确切的说是有投票权力的Server(不包括Observer).
Zookeeper的基本原理,数据模型,Session,Watch机制,一致性保证,Leader Election,Leader和Follower的工作流程和Zab协议.
主机名 | 操作系统版本 | IP地址 | 安装软件 |
---|---|---|---|
zookeeper-230 | CentOS 7.7 | 192.168.15.230 | JDK1.8、zookeeper-3.6.2 |
zookeeper-231 | CentOS 7.7 | 192.168.15.231 | JDK1.8、zookeeper-3.6.2 |
zookeeper-232 | CentOS 7.7 | 192.168.15.232 | JDK1.8、zookeeper-3.6.2 |
实验虚拟机配置1c2g25G
[root@zookeeper-230 ~]# uname -a
Linux zookeeper-230 3.10.0-1062.18.1.el7.x86_64 #1 SMP Tue Mar 17 23:49:17 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@zookeeper-230 ~]# rpm -q centos-release
centos-release-7-7.1908.0.el7.centos.x86_64
应用路径:/usr/local/zookeeper3.6
配置路径:/usr/local/zookeeper3.6/conf
默认日志路径:/usr/local/zookeeper3.6/logs
自建快照日志路径:/usr/local/zookeeper3.6/zkdata
自建事务日志路径:/usr/local/zookeeper3.6/zklogs
官网下载最新jdk到本地,本地上传jdk安装包到服务器 。
官网链接:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html 。
或者(此非官网地址,慎用!!!此仅作测试使用) 。
http://mirrors.linuxeye.com/jdk/jdk-8u261-linux-x64.tar.gz 。
wget http://mirrors.linuxeye.com/jdk/jdk-8u261-linux-x64.tar.gz
解压
tar -zxvf jdk-8u261-linux-x64.tar.gz -C /usr/local/
添加环境变量,编辑文件/etc/profile,加入下面配置保存退出
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_261
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
保存退出,然后加载环境变量
source /etc/profile
验证安装是否成功
java -version
官网地址:https://zookeeper.apache.org/releases.html 。
【注意】官网下包注意包的性质,此处为 。
下载最新安装包 。
下载zookeeper应用源码包
wget https://downloads.apache.org/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz
解压
tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz && mv apache-zookeeper-3.6.2-bin /usr/local/zookeeper3.6
创建快照日志存放目录
mkdir -p /usr/local/zookeeper3.6/zkdata
创建事务日志存放目录
mkdir -p /usr/local/zookeeper3.6/zklogs
【注意】:如果不配置zklogs,那么事务日志就会写在配置默认的dataDir目录中。这样久而久之会严重影响zk的性能。因为在zk吞吐量很高的时候,产生的事务日志和快照日志非常多.
添加zookeeper启动命令环境变量 。
编辑文件 /etc/profile ,在文件末尾添加语句
vim /etc/profile
export PATH=$PATH:/usr/local/zookeeper3.6/bin
保存退出,然后加载环境变量
source /etc/profile
zk的配置文件位置为zk文件夹下的conf目录下,具体可通过命令行进入conf目录后执行:cp ./zoo_sample.cfg ./zoo.cfg即可,写入以下配置 。
[root@zookeeper-230 conf]# cd /usr/local/zookeeper3.6/conf && cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper3.6/zkdata #快照日志存储目录
datalogDir=/usr/local/zookeeper3.6/zklogs #事务日志存储目录
clientPort=2181
server.3=192.168.15.230:2888:3888
server.2=192.168.15.231:2888:3888
server.1=192.168.15.232:2888:3888
tickTime: 服务器与客户端之间交互的基本时间单元(ms),被用来作为心跳时间,同时zk最小的会话超时时间是此时间的两倍 。 initLimit: 此配置表示允许follower连接并同步到leader的初始化时间,它以tickTime的倍数来表示。当超过设置倍数的tickTime时间,则连接失败。 syncLimit: Leader服务器与follower服务器之间信息同步允许的最大时间间隔,如果超过此间隔,默认follower服务器与leader服务器之间断开链接。 dataDir: 保存zk内存数据库快照路径 ,除非指定,对数据库的事务日志更新也存储在此文件夹。 dataLogDir: 保存zk日志路径,当此配置不存在时默认路径与dataDir一致 。 clientPort: 客户端访问zk时经过服务器端时的端口号,通俗说是用来监听客户端连接的端口。 maxClientCnxns : 限制连接到zk服务器客户端的数量 server.id=hostip:port:port : 表示了不同的zk服务器的自身标识,作为集群的一部分,每一台服务器应该知道其他服务器的信息。用户可以从“server.id=hostip:port:port” 中读取到相关信息.
在服务器的zkdata(dataDir参数所指定的目录)下创建一个文件名为myid的文件,这个文件的内容只有一行,指定的是自身的id值。 比如,服务器“1”应该在myid文件中写入“1”。这个id必须在集群环境中服务器标识中是唯一的,且大小在1~255之间。 这一样配置中,zoo1代表第一台服务器的IP地址。 第一个端口号2888(port)是从follower连接到leader机器的端口,第二个端口3888是用来进行leader选举时所用的端口 。
[root@zookeeper-230 ~]# echo "1" > /usr/local/zookeeper3.6/zkdata/myid
[root@zookeeper-231 ~]# echo "2" > /usr/local/zookeeper3.6/zkdata/myid
[root@zookeeper-232 ~]# echo "3" > /usr/local/zookeeper3.6/zkdata/myid
【注意】通过配置zoo.cfg文件,zk可以运行在三种模式下,分别是:单机模式、集群模式和伪集群模式.
各主机执行语句启动zk服务
zkServer.sh start
查看zk服务状态
zkServer.sh status
或用jps命令查看QuorumPeerMain进程是否存在, jps是jdk提供的一个查看当前Java进程的小工具
jps
zkServer.sh start 启动
zkServer.sh stop 停止
zkServer.sh status 状态
zkServer.sh restart 重启
创建节点: create [-s] [-e] path data acl
[-s]是否有序 , [-e]是否临时, path 节点路径 ,data 数据内容,acl 数据权限。
查看节点目录信息: ls path [watch]
path节点路径 , watch 为监听事件。
获取节点信息: get path [watch]
path节点路径 , watch 为监听事件。
修改节点信息: set path [version]
path节点路径,version 版本号,修改节点数据后递增,相当于我们数据库的版本号,作为乐观锁功能。
删除节点信息: delete path [version]
path节点路径 ,version ,修改节点数据后递增,相当于我们数据库的版本号,作为乐观锁功能。
查看节点当前状态: stat path [watch]
path节点路径 ,watch 为监听事件
注:[] 括号里选项内容可选择
watch :为当前节点的一个监听事件,当节点被修改、删除、查看时都会触发对应分类的事件
在下载安装apache-zookeeper-3.6.2.tar.gz时,已经在conf文件夹下拷贝并重命名了一份zoo.cfg文件,结果在启动 bin 目录下的zkServer.sh文件时报错,错误信息如下?
找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain
也即是下载的是未编译的 tar 包。 注:zookeeper 从 3.5 版本以后,命名就发生了改变,如果是apache-zookeeper-3.6.2.tar.gz这般命名的,都是未编译的,而 apache-zookeeper-3.6.2-bin.tar.gz 这般命名的,才是已编译的包.
重新下载 apache-zookeeper-3.6.2-bin.tar.gz包,然后解压使用.
在下载了已编译的 apache-zookeeper-3.6.2-bin.tar.gz 包并解压,且在conf文件夹下拷贝并重命名了一份 zoo.cfg文件后,在启动 bin 目录下的zkServer.sh文件时报错,错误信息如下?
No snapshot found, but there are log entries. Something is broken!
这个错是在启动zk服务恢复数据报错的,因为已经安装有 其他3.* 版本,且两个版本的dirData地址都没有修改dataDir=/tmp/zookeeper,是同一个地址,所以数据也是 其他3.* 版本的数据,现在启动 3.6.2 恢复这个数据就报错了 。
将3.6.2版本conf文件夹下的 zoo.cfg 文件中的 dataDir 地址修改一下即可.
最后此篇关于Zookeeper安装部署的文章就讲到这里了,如果你想了解更多关于Zookeeper安装部署的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我听说最好不要从您系统的 Perl 版本所在的 CPAN 安装模块。我知道如何使用命令行安装模块,我只是想知道是否有办法将 CPAN 与系统核心 Perl 分开。 我应该: 下载源代码并专门为这些模块
我听说最好不要从系统的 Perl 版本所在的 CPAN 安装模块。我知道如何使用命令行安装模块,我只是想知道是否有办法将 CPAN 与系统的核心 Perl 分开。 我应该: 下载源代码并专门为这些模块
单独安装 electron 与通过 electron-builder 安装有什么区别?我正在使用 React 构建一个 Electron 应用程序,并且已经找到了一些教程。它们安装 Electron
两者安装有什么区别?我按照安装页面上的说明在全局范围内安装了 webpack,然后我转到了入门指南,据说在那里可以在本地安装 webpack-cli。 CLI = Command Line Inter
我在 OS X Yosemite 上用 PHP 安装了默认的 Apache 服务器,安装了 pear,用 brew 安装了 Solr (brew install solr),现在我正在尝试使用 PEC
我解压并编译了 Ruby 2.1 并安装了几个支持工具。 但是当我安装了 libssl-dev 时,OpenSSL 不会安装。 我在支持 openssl 时遇到这个错误: make: *** No r
我在 android studio 2.3.1 和 gradle 3.2 中设计了 2 到 3 个应用程序。当我从它运行应用程序到任何设备或模拟器时,一切都工作正常。但是当我从构建文件夹中获取该 ap
我注意到我正在读一本书提到通过 apt-get 安装 numpy 和 opencv apt-get install python-numpy python-opencv 但我可以通过以下方式在 pip
我正在尝试在 Windows 8.1 上安装 ansicon。我提取了文件并达到了我需要调用 ansicon -i 的级别。当我在 cmd 中输入此内容并运行 python 脚本时效果很好,但是当我通
我有 linux MINT 17.3 Kernel 4.4.0-81 所有更新可用。 (由于不同的原因,我无法迁移到更新版本的 ubuntu/mint) 我已经通过 PPA 安装了 FFMPEG(不是
尝试在本地运行我的应用程序时出现错误: 我只在 chrome 浏览器中收到此错误。我尝试过不同的东西,但我不确定为什么它是 Chrome 特定的。 最佳答案 我怀疑这不是 Firebase 问题,而是
这是我第一次开发 AngularJS 应用程序并使用脚手架工具 Yeoman ( http://yeoman.io/ )。我想对我的一些图标使用 fontawesome ( http://fortaw
我知道您通常“应该”$ pip install 如果包没有 brew ,但如果有一个你想安装的 python 包,你可以使用 $ pip install或 $ brew install为了?例如,通过
我正在尝试通过 RVM 安装 Ruby 1.9.3。然而,当谈到安装 RubyGems 时,我得到了这个: curl: (22) The requested URL returned error: 4
我是真正提出问题的新手,但你去吧。 我一直在尝试按照安装指南添加 dnsname: https://github.com/containers/dnsname https://github.com/c
Studio更新至0.4.0 建筑产量为“需要1.8版Gradle”;将设置设置为1.8 bin目录; 建立 “要求1.9级”;将设置设置为1.9 bin; 建立 “要求1.8级” 啊。不知道该怎么做
我刚刚注意到 kernel.org 因维护而停机。是否有使用不同镜子的不同公式?或者我可以向 Homebrew 软件添加不同的来源(如 bundler ?)? 谢谢你的帮助! 最佳答案 快速解决方法:
当我运行时: peardev install phpunit/PHPUnit 我得到以下信息: No releases available for package "pear.phpunit.de/P
服务器操作系统为Fedora 24. 64bit。 我想安装 Git 2.6.6。 所以下载源码并安装。 此服务器离线。所以我不使用“yum”。 ./configure --prefix=/usr/l
我正在尝试在我自己的服务器(操作系统:Linux Ubuntu Server 12.04)上安装 OpenEdX,但我遇到了同样的错误。谁能帮帮我? TASK: [ insights | insta
我是一名优秀的程序员,十分优秀!