zookeeper简介及安装

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zookeeper简介及安装相关的知识,希望对你有一定的参考价值。

1. Zookeeper简介

  • 1.1 概念
    zookeeper是一个维护配置信息、命名、提供分布式同步的集中式服务(也就是说主要用于分布式应用程序中)。它是一个分布式的协调服务。集群中节点个数最少是3个(必须为奇数个),同时集群是一致性的。
  • 1.2 作用
    zookeeper目的是将各种服务的复杂的核心功能封装,形成一个个简单的接口(对外提供服务),同时统一协调这些服务。
    功能:命名服务、配置管理、集群管理、分布式锁、队列管理
    优点:客户端发起事务请求,请求的结果在整个Zookeeper集群中所有机器上的应用情况是一致的,同时zookeeper能够保证客户端请求的顺序,每个请求zookeeper都会分配一个全局的且唯一的递增编号,此编号反映了事务操作的先后顺序。zookeeper将全量数据保存在内存中,并直接服务于所有的非事务请求,其中以读的操作场景性能非常优秀。
  • 1.3 应用场景
    主要用于Hadoop、Storm、消息中间件、RPC服务框架、分布式数据库同步系统,不适合存储大量的数据,存储key-value值
    1.4 etcd内部解剖
    使用的是zab协议,与raft协议很相似
    C/S架构,它由两种语言写的C+JAVA。
    zookeeper很像一个文件系统,zookeeper中的的每个znode都是一个路径,同时很多znodes共享一个name space,name space 更像一个独立的文件系统。znode都有一个父节点(最高为/,说白了类似于文件系统),同时如果这个znode有子节点那么这个znode是不能被删除的。但是它又不同于文件系统,每个znode都可以是目录并且它存储的数据是有限的。znode用于存储协调数据(状态信息、配置信息、位置信息等等),这些数据通常来以kilobyte为单位,所以很小,zookeeper会有内置的1M健康检查,防止一个大的数据存储进来。
    数据模型:
    技术分享图片

架构模型:
技术分享图片

zookeeper集群中,会自动复制到集群中的每个节点,是数据保持一致。同时数据保留在内存中,所以有很低的延迟和高吞吐量,zookeeper的数据库的大小受宿主机的内存大小的限制,从而会限制znode的数量。
客户端连接zookeeper服务,必须知道zookeeper服务的列表(ip list),客户端只会连接一个zookeeper服务,当该服务挂了,就会找zookeeper服务列表里的其他地址并连接。
读请求---发送到客户端连接的zookeeper服务,而写请求会发送到所有的zookeeper服务,然后在这个写请求在完成集群中协商一致性后才会有回应客户端的行为。这里就体现了读和写的区别了,这种情况导致读取请求的吞吐量与服务器的数量成比例,写入请求的吞吐量随着服务器的数量增加而减少。
在zookeeper中顺序是非常重要的,响应的执行的顺序是强制的。它用的是一个唯一的zxid(ZooKeeper Transaction Id)来标记每一个请求,

2. Zookeeper安装

系统要求
技术分享图片
软件要求:
zookeeper运行于Java环境下,需要JDK1.6及以上。3个节点是最小的(奇数个),但是生产环境中最好使用5个,同时最好不要将这5台放到同一个交换机下,防止交换机宕机导致集群全部失效,以集群的形式运行,硬件要求2cpu/2G/80硬盘即可满足需求。
这里以集群形式讲解(以三个节点为例)
下载地址:
jdk: http://java.sun.com/javase/downloads/index.jsp
zookeeper: https://www.apache.org/dyn/closer.cgi/zookeeper/
当然可以选择就近的镜像站下载zookeeper:http://mirror.bit.edu.cn/apache/zookeeper/
wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz
tar xf zookeeper-3.4.12.tar.gz -C /data/
cd /data/
ln -s zookeeper-3.4.12 zookeeper
至此安装完毕。

  • 2.1.1简单配置文件讲解:
    zookeeper有一个最小配置zoo_sample.cfg,这个一般就是最小配置。如下:

    [[email protected] conf]# grep -v ^# zoo_sample.cfg 
    tickTime=2000    #以ms为单位,心跳和超时时间。
    initLimit=10
    syncLimit=5
    dataDir=/tmp/zookeeper  #zookeeper存储数据库快照地方及事务日志,生产中日志最好别再此处。
    clientPort=2181    #客户端连接的端口
  • 2.1.2 高级参数:
    以下参数是可选的,当然以下的有些参数可以在java系统属性中设置,一般是zookeeper.keyword这种形式。
    dataLogDir #将zookeeper的事物日志直接写到这个目录下而不是dataDir,生产中有条件最好是可以将日志和快照分别存储,日志放到不繁忙的设备上(性能好的专有的设备)

globalOutstandingLimit (Java system property: zookeeper.globalOutstandingLimit.)
默认是1000的限制,它的作用主要是防止高并发场景zookeeper处理不了过多的客户端连接,从而导致超出系统内存,进一步导致zookeeper异常。
preAllocSize (Java system property: zookeeper.preAllocSize)
默认block 大小为64M,如果快照频繁,那么需要调整该值,降低一些。
snapCount (Java system property: zookeeper.snapCount)
我们知道zookeeper使用的是snapshot和事务日志来进行记录事务的。在一次快照前,snapCount决定了多少次事务记录到事务日志中。
maxClientCnxns
最大连接数量,说白了就是防止Ddos×××用,默认是60,如果设置为0表示不限制。
minSessionTimeout
默认是 tickTime的2倍
maxSessionTimeout
默认是 tickTime的20倍
fsync.warningthresholdms (Java system property: zookeeper.fsync.warningthresholdms)
如果事务日志在写入日志时调用fsync函数,如果超过此值会在日志中显示警告的信息。默认是1000ms,这个值最好设置为系统的时间。
autopurge.purgeInterval
自动清理日志和快照的功能,默认是不开启的,适用于3.4版本,指定清理频率,单位是小时,默认是0,表示不清理。
autopurge.snapRetainCount
适用于3.4版本,当前面的开启后,那么zookeeper会保留多少文件来进行清除多余的快照和日志。默认是3,最小也是3
syncEnabled (Java system property: zookeeper.observer.syncEnabled)
默认开启,为了降低观察者从故障中恢复的时间。

  • 2.1.3 集群的参数:
    electionAlg
    它的值:0、1、2、3,其中0表示,默认是3,官网表示0、1、2将会在未来的版本取消。这个参数涉及的是选举基于哪个版本。
    initLimit
    跟ticktime有关,当集群中数据量变大时,最好调高该值(因为从的数量多了,leader同步数据时,时间会加长)
    leaderServes (Java system property: zookeeper.leaderServes)
    想让Leader专注于集群中机器的协调,那么可以将这个参数设置为no,默认情况下是leader可以接受client的连接,如果设置为no,这样的leader会只负责集群中机器的调度,这样会大大提高集群的读写能力,它不会接受client的连接。生产环境中不建议设置为no
    server.x=[hostname]:nnnnn[:nnnnn], etc
    这里的x是一个数字,与myid文件中的id是一致的。右边可以配置两个端口,第一个端口用于F和L之间的数据同步和其它通信,第二个端口用于Leader选举过程中投票通信。
    syncLimit
    同步时间,tickTime,允许F和L同步数据的时间,如果F过于落后,集群会将失败。
    group.x=nnnnn[:nnnnn]
    对机器分组
    weight.x=nnnnn
    权重设置
    cnxTimeout
    默认是5s,leader选举的超时时间。
    4lw.commands.whitelist
    命令的白名单,没有在的会禁止。4lw.commands.whitelist=stat, ruok, conf, isro
    ipReachableTimeout (Java system property: zookeeper.ipReachableTimeout)
    ms为单位,ip到达的超时时间,
    tcpKeepAlive (Java system property: zookeeper.tcpKeepAlive)
    说白了就是集群中成员之间tcp的 keepalived。这个值是在操作系统层面的,首先设置操作系统,然后在设置这里为true。但是NAT网络和防火墙可能会终止这里tpc连接。默认是false
  • 2.1.4 集群间的认证和授权参数
    zookeeper.DigestAuthenticationProvider.superDigest
    (Java system property only: zookeeper.DigestAuthenticationProvider.superDigest)
    默认是关闭的。
    这个是权限控制及认证控制。
  • 2.1.5 生产测试的配置及启动:
    zoo.cfg配置文件如下:
    [[email protected] conf]# cat zoo.cfg 
    tickTime=2000
    initLimit=5
    syncLimit=2
    dataDir=/data/zookeeper/data
    clientPort=2181
    server.1=node1:2888:3888
    server.2=node2:2888:3888
    server.3=node3:2888:3888

注意:server.myid=host:port1:port2中,myid必须是唯一的,取值范围为1-255
配置全局变量jdk及zookeeper:

[[email protected] data]# tail -n 4 /etc/profile
export JAVA_HOME=/data/jdk
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export ZOOKEEPER_HOME=/data/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
source /etc/profile

启动:zkServer.sh start
查看状态:zkServer.sh status
技术分享图片
写入数据并读取:
任意个节点:
执行zkCli.sh 我们看到连接的是本地的2181端口
技术分享图片
在其他节点也能查到该值。也就是说集群没有问题。
递归删除子节点
技术分享图片
参考文章:
https://zookeeper.apache.org/
https://cwiki.apache.org/confluence/display/ZOOKEEPER/ProjectDescription
https://zookeeper.apache.org/doc/current/zookeeperAdmin.html

以上是关于zookeeper简介及安装的主要内容,如果未能解决你的问题,请参考以下文章

hue/ oozie/ sqoop/ kafka/ zookeeper/ flume 简介及cdh安装简介

zookeeper 常用命令及znode简介

zookeeper命令使用及监控

Zookeeper的安装配置及基本开发

window7环境下ZooKeeper的安装及运行

cloudera简介及安装