zookeeper简介

一 zookeeper介绍

ZooKeeper是一个开源的分布式应用程序协调系统。简称ZK,ZK是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于它实现数据的发布/订阅、负载均衡、名称服务、分布式协调/通知、集群管理、Master选举、分布式锁盒分布式队列等等功能。它运行在JAVA环境之中,并具有JAVA和C的绑定。

二 zookeeper集群角色

  • Leader:领导者,通过集群选举产生的主节点,负责集群的读与写工作
  • Follower:追随者,有资格参与集群选举,但未能被成功选举为Leader的备用选举节点,负责集群的读服务
  • Observer:观察者,没有资格参与集群选举,负责集群的读服务,同步Leader状态
注意:当Leader故障之后ZooKeeper集群会通过Follower选举新的Leader,如果老的Leader故障修复之后,会再次接管集群中的Leader脚本,新的Leader则退回Follower角色。一般集群当中无需设置Observer节点,Follower节点即可。
 

三 ZAB协议

ZooKeeper(ZooKeeper Atomic Broadcast,ZooKeeper原子广播协议)是通过ZAB协议来完成了Client各个节点选举的信息,ZAB协议是整个ZooKeeper的核心,支持崩溃保护机制,用于在Leader崩溃时重新选举出新的Leader,而且还要确保数据的完整性和一至性,此协议不仅能够保证ZooKeeper集群本身的选举,还能管理使用ZooKeeper协调服务的分布式程序的选举工作。

3.1 ZAB状态

  • Looking:集群刚启动,开始选举Leader,或者Leader崩溃之后再次选举新的Leader时,正在选举,被称为Looking状态。
  • Following:Following就是Follower状态,这个时候集群中已经存在Leader,这些机器属于Follover节点称之为Following状态。
  • Leading:Leader就被称为Leading状态。

3.2 ZAB阶段

  • 选举:election
  • 发现:discovery
  • 同步:sync
  • 广播:Broadcast
 

四 zookeeper使用场景

  • 数据订阅与发布
  • Nameserver
  • 分布式通知
  • 分布式锁
  • 注册中心
  • 分布式队列

五 ZooKeeper配置详解

官方文档:http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_configuration

tickTime=2000 #ZooKeeper服务器之间或客户单与服务器之间维持心跳的时间间隔,单位是毫秒,默认为2000。
initLimit=10 #zookeeper接受客户端(这里所说的客户端不是用户连接zookeeper服务器的客户端,而是zookeeper服务器集群中连接到leader的follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过10个心跳的时间(也就是tickTime)长度后 zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20秒。
syncLimit=5 #标识ZooKeeper的leader和follower之间同步消息,请求和应答时间长度,最长不超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。
dataDir=/tmp/data #存储内存数据库快照的位置;ZooKeeper保存Client的数据都是在内存中的,如果ZooKeeper节点故障或者服务停止,那么ZooKeeper就会将数据快照到该目录当中。
clientPort=2181 #ZooKeeper客户端连接ZooKeeper服务器的端口,监听端口
maxClientCnxns=60 #ZooKeeper可接受客户端连接的最大数量,默认为60
dataLogDir=/tmp/logs #如果没提供的话使用的则是dataDir。zookeeper的持久化都存储在这两个目录里。dataLogDir里是放到的顺序日志(WAL)。而dataDir里放的是内存数据结构的snapshot,便于快速恢复。为了达到性能最大化,一般建议把dataDir和dataLogDir分到不同的磁盘上,这样就可以充分利用磁盘顺序写的特性
autopurge.snapRetainCount=3 #ZooKeeper要保留dataDir中快照的数量
autopurge.purgeInterval=1 #ZooKeeper清楚任务间隔(以小时为单位),设置为0表示禁用自动清除功能
quorumListenOnAllIPs=true #该参数设置为true,Zookeeper服务器将监听所有可用IP地址的连接。他会影响ZAB协议和快速Leader选举协议。默认是false。
globalOutstandingLimit=1000 #最大请求堆积数。默认是1000。Zookeeper运行过程中,尽管Server没有空闲来处理更多的客户端请求了,但是还是允许客户端将请求提交到服务器上来,以提高吞吐性能。当然,为了防止Server内存溢出,这个请求堆积数还是需要限制下的。 
preAllocSize=64M  #预先开辟磁盘空间,用于后续写入事务日志。默认是64M,每个事务日志大小就是64M。如果ZK的快照频率较大的话,建议适当减小这个参数。
snapCount=100000  #每进行snapCount次事务日志输出后,触发一次快照, 此时,Zookeeper会生成一个snapshot.*文件,同时创建一个新的事务日志文件log.*。默认是100,000.
traceFile=false  #用于记录所有请求的log,一般调试过程中可以使用,但是生产环境不建议使用,会严重影响性能。
maxClientCnxns=10 #最大并发客户端数,用于防止DOS的,默认值是10,设置为0是不加限制。
clientPortAddress / maxSessionTimeout  #对于多网卡的机器,可以为每个IP指定不同的监听端口。默认情况是所有IP都监听 clientPort 指定的端口。
minSessionTimeout #Session超时时间限制,如果客户端设置的超时时间不在这个范围,那么会被强制设置为最大或最小时间。默认的Session超时时间是在2 *  tickTime ~ 20 * tickTime 这个范围 
fsync.warningthresholdms #事务日志输出时,如果调用fsync方法超过指定的超时时间,那么会在日志中输出警告信息。默认是1000ms。
syncEnabled  #Observer写入日志和生成快照,这样可以减少Observer的恢复时间。默认为true。
initLimit  #Observer和Follower启动时,从Leader同步最新数据时,Leader允许initLimit * tickTime的时间内完成。如果同步的数据量很大,可以相应的把这个值设置的大一些。
leaderServes  #默 认情况下,Leader是会接受客户端连接,并提供正常的读写服务。但是,如果你想让Leader专注于集群中机器的协调,那么可以将这个参数设置为 no,这样一来,会大大提高写操作的性能。一般机器数比较多的情况下可以设置为no,让Leader不接受客户端的连接。默认为yes
server.x=[hostname]:nnnnn[:nnnnn]  #“x”是一个数字,与每个服务器的myid文件中的id是一样的。hostname是服务器的hostname,右边配置两个端口,第一个端口用于Follower和Leader之间的数据同步和其它通信,第二个端口用于Leader选举过程中投票通信。  
syncLimit  #表示Follower和Observer与Leader交互时的最大等待时间,只不过是在与leader同步完毕之后,进入正常请求转发或ping等消息交互时的超时时间。
group.x=nnnnn[:nnnnn] #“x”是一个数字,与每个服务器的myid文件中的id是一样的。对机器分组,后面的参数是myid文件中的ID
weight.x=nnnnn #“x”是一个数字,与每个服务器的myid文件中的id是一样的。机器的权重设置,后面的参数是权重值
cnxTimeout  #选举过程中打开一次连接的超时时间,默认是5s
standaloneEnabled #当设置为false时,服务器在复制模式下启动
forceSync #该参数确定了是否需要在事务日志提交的时候调用 FileChannel .force来保证数据完全同步到磁盘。对应的java系统属性:zookeeper.forceSync
jute.maxbuffer #该参数只能设置为java系统属性。没有zookeeper前缀。它指定了Znode可以存储最大的数据量的大小。默认是1M。如果要改变该配置,就必须在所有服务器和客户端中设置。
skipACL #跳过ACL检查,这样可以是Zookeeper的吞吐量增加。只是会使所有用户都有访问权限。对应的java系统属性:zookeeper.skipACL
 
 
 
 
 
 
 
 
 

posted @ 2021-11-24 13:52  小吉猫  阅读(329)  评论(0编辑  收藏  举报