无锡万度网站建设,有没有网站做胡兼职,360免费wifi创建失败,企业it外包服务部署一个zookeeper集群#xff0c;要多简单就能有多简单#xff08;下载压缩包#xff0c;解压#xff0c;修改配置文件zoo.cfg,执行启动脚本#xff09;#xff0c;但是想要真的把这套东西玩好了#xff0c;还是需要费些功夫研究一番的。就跟自己搭建一个lnmp的站点要多简单就能有多简单下载压缩包解压修改配置文件zoo.cfg,执行启动脚本但是想要真的把这套东西玩好了还是需要费些功夫研究一番的。就跟自己搭建一个lnmp的站点仅仅搭建网上有各种教程和专门的一键安装包但是部署后根据实际场景需求和系统负载进行配置优化时我们就需要了解一些与lnmp相关的知识了。 目前我们业务应用是通过配置中心集中管理应用各种配置的管理中心应用到了zookeeper集群推送配置信息研究下zookeeper的leader选举数据更新同步的知识还是有收获的。 zookeeper集群主要用来解决分布式集群中应用系统的一致性问题应用场景目前接触到的主要就是两种同步锁和配置管理。zookeeper集群的部署环境操作系统版本lsb_release -aDescription: CentOS release 6.3 (Final)Linux zookeeper01.nh 2.6.32-279.el6.x86_64 x86_64 x86_64 x86_64 GNU/Linuxzookeeper版本zookeeper-3.4.5配置文件 目录/data/webapps/zookeeper/conf 配置详情less zoo.cfg# The number of milliseconds of each ticktickTime2000 #CS通信心跳数服务器之间或客户端与服务器之间间隔多久发送一个心跳#tickTime以毫秒为单位。# The number of ticks that the initial # synchronization phase can takeinitLimit10#initLimitLeader与Follower初始通信时限#集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数tickTime的数量。# The number of ticks that can pass between # sending a request and getting an acknowledgementsyncLimit5#syncLimitLeader与Follower同步通信时限#集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数tickTime的数量。# 3.4.0 版本后引入了数据自动清理功能autopurge.purgeInterval1 (zookeeper自动清理间隔单位小时)autopurge.snapRetainCount10 保留快照文件个数# the directory where the snapshot is stored.dataDir/data/appdatas/zookeeperZookeeper保存数据的目录默认情况下Zookeeper将写数据的日志文件也保存在这个目录里。#commitLog数据存储dataLogDir/data/applogs/zookeeperZookeeper保存日志文件的目录。# the port at which the clients will connectclientPort2181#客户端连接 Zookeeper 服务器的端口Zookeeper 会监听这个端口接受客户端的访问请求。# znode#zookeeper 集群信息服务器编号服务器地址Leader与Follower通信端口选举端口#选举端口表示选举新leader时服务器间相互通信的端口当leader挂掉时其余服务器会相互通信选择出新的leaderserver.1myid文件dataDir目录中101.1.2.132:2888:3888 #servers making up the ZooKeeper ensemble. When the server starts up, it determines which server it is by looking for the file myid in the data directory. That file contains the server number, in ASCII, and it should match x in server.x in the left hand side of this setting.server.2101.1.2.137:2888:3888 server.3101.1.2.162:2888:3888server.4101.1.2.167:2888:3888 server.5101.1.2.158:2888:3888详细配置说明参看https://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html#sc_advancedConfiguration保证zookeeper持续提供服务daemontools http://cr.yp.to/daemontools.html安装方法http://cr.yp.to/daemontools/install.html mkdir -p /package chmod 1755 /package cd /package wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz tar -zxvf daemontools-0.76.tar.gz cd admin/daemontools-0.76 package/install创建目录/service/zookeeper# 创建文件 run #!/bin/bash
. /etc/profile
exec 21
exec /data/webapps/zookeeper/bin/zkServer.sh start-foreground启动supervise zookeeper supervise就会在后台监控zookeeper的进程如果zookeeper进程被意外关闭supervise进程会立即执行run文件中的命令重启启动zookeeper。zookeeper监控taokeeper, ZooKeeper-Monitor, a monitor for zookeeper in java官方地址https://github.com/alibaba/taokeeperhttp://jm-blog.aliapp.com/?p1450taokeeper相关截图zabbix相关模版截图zabbix agent相关检测配置UserParameterzk_version, echo stat | nc 127.0.0.1 2181 |grep version | awk -F : {print $2}UserParameterzk_received, echo stat | nc 127.0.0.1 2181 |grep Received | awk -F : {print $2}UserParameterzk_sent, echo stat | nc 127.0.0.1 2181 |grep Sent | awk -F : {print $2}UserParameterzk_mode, echo stat | nc 127.0.0.1 2181 |grep Mode | awk -F : {print $2}UserParameterzk_nodecount, echo stat | nc 127.0.0.1 2181 |grep Node count| awk -F : {print $2}UserParameterzk_clientscount, echo cons | nc 127.0.0.1 2181 |grep -v 127.0.0.1 |wc -lUserParameterzk_status, echo ruok | nc 127.0.0.1 2181 UserParameterzk_aclient, echo cons | nc 127.0.0.1 2181 |grep -v 127.0.0.1 |awk -F: {print $1}|awk -F/ {print $2}|head -n1zookeeper工作原理 ZooKeeper是一开源分布式应用程序协调服务包含一个简单的原语集分布式应用程序可以基于它实现同步服务配置维护和命名服务等功能可提供一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。 zookeeper的基本概念角色Zookeeper中的角色主要有以下三类如下表所示LeaderLearner(Follower,Observer),client系统模型如图所示设计目的1.最终一致性client不论连接到哪个Server展示给它都是同一个视图。2 .可靠性具有简单、健壮、良好的性能如果消息m被到一台服务器接受那么它将被所有的服务器接受。3 .实时性Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息或者服务器失效的信息。但由于网络延时等原因Zookeeper不能保证两个客户端能同时得到刚更新的数据如果需要最新数据应该在读数据之前调用sync()接口。4 .等待无关wait-free慢的或者失效的client不得干预快速的client的请求使得每个client都能有效的等待。5.原子性更新只能成功或者失败没有中间状态。6 .顺序性包括全局有序和偏序两种全局有序是指如果在一台服务器上消息a在消息b前发布则在所有Server上消息a都将在消息b前被发布偏序是指如果一个消息b在消息a后被同一个发送者发布a必将排在b前面。数据模型Zookeeper 会维护一个具有层次关系的数据结构它非常类似于一个标准的文件系统。Zookeeper 数据结构有如下这些特点每个子目录项如 NameService 都被称作为 znode这个 znode 是被它所在的路径唯一标识如 Server1 这个 znode 的标识为 /NameService/Server1znode 可以有子节点目录并且每个 znode 可以存储数据注意 EPHEMERAL 类型的目录节点不能有子节点目录znode 是有版本的每个 znode 中存储的数据可以有多个版本也就是一个访问路径中可以存储多份数据znode 可以是临时节点一旦创建这个 znode 的客户端与服务器失去联系这个 znode 也将自动删除Zookeeper 的客户端和服务器通信采用长连接方式每个客户端和服务器通过心跳来保持连接这个连接状态称为 session如果 znode 是临时节点这个 session 失效znode 也就删除了znode 的目录名可以自动编号如 App1 已经存在再创建的话将会自动命名为 App2znode 可以被监控包括这个目录节点中存储的数据的修改子节点目录的变化等一旦变化可以通知设置监控的客户端工作原理Zookeeper的核心是原子广播这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式它们分别是恢复模式选主和广播模式同步。当服务启动或者在领导者崩溃后Zab就进入了恢复模式当领导者被选举出来且大多数Server完成了和leader的状态同步以后恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。为了保证事务的顺序一致性zookeeper采用了递增的事务id号zxid来标识事务。所有的提议proposal都在被提出的时候加上了zxid。实现中zxid是一个64位的数字它高32位是epoch用来标识leader关系是否改变每次一个leader被选出来它都会有一个新的epoch标识当前属于那个leader的统治时期。低32位用于递增计数。每个Server在工作过程中有三种状态LOOKING当前Server不知道leader是谁正在搜寻LEADING当前Server即为选举出来的leaderFOLLOWINGleader已经选举出来当前Server与之同步Leader选举流程当leader崩溃或者leader失去大多数的follower这时候zk进入恢复模式恢复模式需要重新选举出一个新的leader让所有的Server都恢复到一个正确的状态。Zk的选举算法有两种一种是基于basic paxos实现的另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。先介绍basic paxos流程1 .选举线程由当前Server发起选举的线程担任其主要功能是对投票结果进行统计并选出推荐的Server2 .选举线程首先向所有Server发起一次询问(包括自己)3 .选举线程收到回复后验证是否是自己发起的询问(验证zxid是否一致)然后获取对方的id(myid)并存储到当前询问对象列表中最后获取对方提议的leader相关信息( id,zxid)并将这些信息存储到当次选举的投票记录表中4. 收到所有Server回复以后就计算出zxid最大的那个Server并将这个Server相关信息设置成下一次要投票的Server5. 线程将当前zxid最大的Server设置为当前Server要推荐的Leader如果此时获胜的Server获得n/2 1的Server票数 设置当前推荐的leader为获胜的Server将根据获胜的Server相关信息设置自己的状态否则继续这个过程直到leader被选举出来。通过流程分析我们可以得出要使Leader获得多数Server的支持则Server总数必须是奇数2n1且存活的Server的数目不得少于n1.每个Server启动后都会重复以上流程。在恢复模式下如果是刚从崩溃状态恢复的或者刚启动的server还会从磁盘快照中恢复数据和会话信息zk会记录事务日志并定期进行快照方便在恢复时进行状态恢复。选主的具体流程图如下所示fast paxos流程是在选举过程中某Server首先向所有Server提议自己要成为leader当其它Server收到提议以后解决epoch和zxid的冲突并接受对方的提议然后向对方发送接受提议完成的消息重复这个流程最后一定能选举出Leader。其流程图如下所示zookeeper数据同步过程选完leader以后zk就进入状态同步过程。1. leader等待server连接2 .Follower连接leader将最大的zxid发送给leader3 .Leader根据follower的zxid确定同步点4 .完成同步后通知follower 已经成为uptodate状态5 .Follower收到uptodate消息后又可以重新接受client的请求进行服务了。流程图如下所示工作流程Leader工作流程Leader主要有三个功能1 .恢复数据2 .维持与Learner的心跳接收Learner请求并判断Learner的请求消息类型3 .Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息根据不同的消息类型进行不同的处理。PING消息是指Learner的心跳信息REQUEST消息是Follower发送的提议信息包括写请求及同步请求ACK消息是Follower的对提议的回复超过半数的Follower通过则commit该提议REVALIDATE消息是用来延长SESSION有效时间。Leader的工作流程简图如下所示在实际实现中流程要比下图复杂得多启动了三个线程来实现功能。2.3.2 Follower工作流程Follower主要有四个功能1. 向Leader发送请求PING消息、REQUEST消息、ACK消息、REVALIDATE消息2 .接收Leader消息并进行处理3 .接收Client的请求如果为写请求发送给Leader进行投票4 .返回Client结果。Follower的消息循环处理如下几种来自Leader的消息1 .PING消息心跳消息2 .PROPOSAL消息Leader发起的提案要求Follower投票3 .COMMIT消息服务器端最新一次提案的信息4 .UPTODATE消息表明同步完成5 .REVALIDATE消息根据Leader的REVALIDATE结果关闭待revalidate的session还是允许其接受消息6 .SYNC消息返回SYNC结果到客户端这个消息最初由客户端发起用来强制得到最新的更新。Follower的工作流程简图如下所示在实际实现中Follower是通过5个线程来实现功能的。observer流程和Follower的唯一不同的地方就是observer不会参加leader发起的投票。学习参考http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/https://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html#sc_advancedConfigurationhttp://en.wikipedia.org/wiki/Paxos_(computer_science)#Basic_Paxos http://weihaoyang.com/archives/55 https://github.com/dsdoc/dsdoc/blob/master/paxosmadesimple/index.rst 转载于:https://blog.51cto.com/liuqunying/1407455