zoukankan      html  css  js  c++  java
  • zookeeper工作原理、安装配置、工具命令简介

    1、Zookeeper简介

    Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等等。

    2、zookeeper基本概念

    2.1 角色

    Zookeeper中的角色主要有以下三类,如下表所示:

    系统模型如图所示:

    2.2设计目的

    1. 最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。

    2. 可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受。

    3. 实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。

    4. 等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。

    5. 原子性:更新只能成功或者失败,没有中间状态。

    6. 顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。

    3. zookeeper工作原理

    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即为选举出来的leader。

    FOLLOWING:leader已经选举出来,当前Server与之同步。

    3.1 选主流程

    当 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。其流程图如下所示:

    3.2同步流程

    选完leader以后,zk就进入状态同步过程。

    1. leader等待server连接;

    2. Follower连接leader,将最大的zxid发送给leader;

    3. Leader根据follower的zxid确定同步点;

    4. 完成同步后通知follower 已经成为uptodate状态;

    5. Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。

    流程图如下所示:

    3.3 工作流程
    3.3.1 Leader工作流程

    Leader主要有三个功能:

    1. 恢复数据;

    2. 维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型;

    3. Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。

    PING 消息是指Learner的心跳信息;REQUEST消息是Follower发送的提议信息,包括写请求及同步请求;ACK消息是Follower的对提议 的回复,超过半数的Follower通过,则commit该提议;REVALIDATE消息是用来延长SESSION有效时间。

    Leader的工作流程简图如下所示:

    3.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的工作流程简图如下所示:

    4、zookeeper安装配置

    ZooKeeper的安装模式分为三种,分别为:单机模式(stand-alone)、集群模式和集群伪分布模式。

    4.1 单机模式

    下载zookeeper的安装包之后,解压到合适目录。进入zookeeper目录下的conf子目录,创建zoo.cfg:

    tickTime=2000 
    dataDir=/Users/apple/zookeeper/data 
    dataLogDir=/Users/apple/zookeeper/logs 
    clientPort=4180

    参数说明:
    tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。zookeeper中使用的基本时间单位,毫秒值。

    dataDir:数据目录,可以是任意目录。

    dataLogDir:log目录,同样可以是任意目录。如果没有设置该参数,将使用和dataDir相同的设置。

    clientPort:监听client连接的端口号

    4.2 伪集群模式

    所谓伪集群,是指在单台机器中启动多个zookeeper进程,并组成一个集群。以启动3个zookeeper进程为例。

    将zookeeper的目录拷贝2份:

    zookeeper0/conf/zoo.cfg文件为:

    tickTime=2000 
    initLimit=5 
    syncLimit=2 
    dataDir=/Users/apple/zookeeper0/data 
    dataLogDir=/Users/apple/zookeeper0/logs 
    clientPort=4180 
    server.0=127.0.0.1:8880:7770 
    server.1=127.0.0.1:8881:7771 
    server.2=127.0.0.1:8882:7772

    新增了几个参数, 其含义如下:

    1 initLimit: zookeeper集群中的包含多台server,其中一台为leader,集群中其余的server为follower。initLimit参数配置初始化连接时,follower和leader之间的最长心跳时间。此时该参数设置为5,说明时间限制为5倍tickTime,即5*2000=10000ms=10s。

    2 syncLimit:该参数配置leader和follower之间发送消息,请求和应答的最大时间长度。此时该参数设置为2,说明时间限制为2倍tickTime,即4000ms。

    3 server.X=A:B:C 其中X是一个数字,表示这是第几号server。A是该server所在的IP地址。B配置该server和集群中的leader交换消息所使用的端口。C配置选举leader时所使用的端口。由于配置的是伪集群模式,所以各个server的B,C参数必须不同。
    参照zookeeper0/conf/zoo.cfg, 配置zookeeper1/conf/zoo.cfg, 和zookeeper2/conf/zoo.cfg文件. 只需更改dataDir, dataLogDir, clientPort参数即可。

    在之前设置的dataDir中新建myid文件,写入一个数字,该数字表示这是第几号server。该数字必须和zoo.cfg文件中的server.X中的X一一对应。

    /Users/apple/zookeeper0/data/myid文件中写入0,/Users/apple/zookeeper1/data/myid文件中写入1,/Users/apple/zookeeper2/data/myid文件中写入2。

    分别进入/Users/apple/zookeeper0/bin,/Users/apple/zookeeper1/bin,/Users/apple/zookeeper2/bin三个目录,启动server。

    4.3 集群模式

    集群模式的配置和伪集群基本一致。

    由于集群模式下,各server部署在不同的机器上,因此各server的conf/zoo.cfg文件可以完全一样。

    下面是一个示例:

    tickTime=2000 
    initLimit=5 
    syncLimit=2 
    dataDir=/home/zookeeper/data 
    dataLogDir=/home/zookeeper/logs 
    clientPort=4180 
    server.43=10.1.39.43:2888:3888 
    server.47=10.1.39.47:2888:3888 
    server.48=10.1.39.48:2888:3888

    示例中部署了3台zookeeper server,分别部署在10.1.39.43,10.1.39.47,10.1.39.48上。需要注意的是,各server的dataDir目录下的myid文件中的数字必须不同,10.1.39.43 server的myid为43,10.1.39.47 server的myid为47,10.1.39.48 server的myid为48。

    5、zookeeper常用命令

    ZooKeeper服务命令:

    1. 启动ZK服务: ./zkServer.sh start

    2. 查看ZK服务状态: ./zkServer.sh status

    3. 停止ZK服务: ./zkServer.sh stop

    4. 重启ZK服务: ./zkServer.sh restart

    zk客户端命令:

    ZooKeeper 命令行工具类似于Linux的shell环境,使用它可以对ZooKeeper进行访问,数据创建,数据修改等操作。使用 zkCli.sh -server 127.0.0.1:2181 连接到 ZooKeeper 服务,连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息。

    命令行工具的一些简单操作如下:

    1. 显示根目录下、文件:ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容

    2. 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据

    3. 创建文件,并设置初始内容:create /zk“test”创建一个新的 znode节点“ zk ”以及与它关联的字符串

    4. 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串

    5. 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置

    6. 删除文件: delete /zk 将刚才创建的 znode 删除

    7. 退出客户端: quit

    8. 帮助命令: help

    ZooKeeper 常用四字命令:

    ZooKeeper 支持某些特定的四字命令字母与其的交互。它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息。用户在客户端可以通过 telnet 或 nc 向 ZooKeeper 提交相应的命令

    1. 可以通过命令:echo stat|nc 127.0.0.1 2181 来查看哪个节点被选择作为follower或者leader

    2. 使用echo ruok|nc 127.0.0.1 2181,测试是否启动了该Server,若回复imok表示已经启动。

    3. echo dump| nc 127.0.0.1 2181,列出未经处理的会话和临时节点。

    4. echo kill | nc 127.0.0.1 2181,关掉server

    5. echo conf | nc 127.0.0.1 2181,输出相关服务配置的详细信息。

    6. echo cons | nc 127.0.0.1 2181,列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。

    7. echo envi |nc 127.0.0.1 2181,输出关于服务环境的详细信息(区别于 conf 命令)。

    8. echo reqs | nc 127.0.0.1 2181,列出未经处理的请求。

    9. echo wchs | nc 127.0.0.1 2181,列出服务器 watch 的详细信息。

    10. echo wchc | nc 127.0.0.1 2181,通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。

    11. echo wchp | nc 127.0.0.1 2181,通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。

    本文转自:http://www.cnblogs.com/kunpengit/p/4045334.html

    参考:http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 数的统计
    Java实现 蓝桥杯VIP 算法训练 和为T
    Java实现 蓝桥杯VIP 算法训练 友好数
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 暗恋
    Java实现 蓝桥杯VIP 算法训练 暗恋
    测试鼠标是否在窗口内,以及测试鼠标是否在窗口停留
    RichEdit 各个版本介绍
  • 原文地址:https://www.cnblogs.com/dreammyle/p/5760077.html
Copyright © 2011-2022 走看看