代码改变世界

zookeeper

2020-11-06 12:07  Tony、  阅读(207)  评论(0编辑  收藏  举报

linux安装zookeeper及使用

一、安装条件

  想要安装zookeeper,必须先在linux中安装好jdk。安装步骤见:

二、下载并解压zookeeper压缩包

  下载地址:https://archive.apache.org/dist/zookeeper/

  1. 先进入/usr/local/目录(也可以是其他的目录),将安装安装包上传到改目录下

[root@localhost /]# cd /usr/local

  2. 解压:

[root@localhost local]# tar -zxvf zookeeper-3.4.13.tar.gz

三、编辑配置文件

  1.进入conf目录:

[root@localhost local]# cd zookeeper-3.4.13/conf

  2. 将zoo_sample.cfg这个文件复制为zoo.cfg (必须是这个文件名)

[root@localhost conf]# cp  zoo_sample.cfg  zoo.cfg

  3. 进入zoo.cfg文件进行编辑

[root@localhost conf]# vim zoo.cfg

  4. 按 i 进入编辑模式,修改以下内容:

dataDir=/tmp/zookeeper/data
dataLogDir=/tmp/zookeeper/log

  5. 如果想配置集群的话,请在clientPort下面添加服务器的ip。

server.1=192.168.180.132:2888:3888
server.2=192.168.180.133:2888:3888
server.3=192.168.180.134:2888:3888
server.4=192.168.180.135:2888:3888

  6. 在tmp目录创建目录。

[root@localhost conf]# mkdir /tmp/zookeeper
[root@localhost conf]# mkdir /tmp/zookeeper/data
[root@localhost conf]# mkdir /tmp/zookeeper/log

   7.如果是配置集群,还需要在前面配置过的dataDir路径下新增myid文件

[root@localhost conf]# cd /tmp/zookeeper/data
[root@localhost data]# touch myid
[root@localhost data]# vim myid

在data目录下创建文件,文件名为“myid”, 编辑该“myid”文件,并在对应的IP的机器上输入对应的编号。
如在192.168.180.132上,“myid”文件内容就是1。在192.168.180.133上,内容就是2。

四、配置环境变量

  1 进入/etc/profile文件进行编辑

[root@localhost data] vi  /etc/profile

  2 按 i 进入编辑模式,修改以下内容:

export ZOOKEEPER_INSTALL=/usr/local/zookeeper-3.4.13/
export PATH=$PATH:$ZOOKEEPER_INSTALL/bin

  3 退出vi编辑器,使环境变量设置立即生效

[root@localhost data] source /etc/profile

 

五、启动zookeeper

  1.进入bin目录,并启动zookeep。如果不是在bin目录下执行,启动zookeeper时会报错: bash: ./zkServer.sh:  No such file or directory

注意:  ./zkServer.sh start前面的 .  不可忽略。

[root@localhost local]# cd /usr/local/zookeeper-3.4.13/bin
[root@localhost bin]# ./zkServer.sh start

  2.启动成功效果如下:

ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

  3.zookeeper的服务端启动后,还需要启动zookeeper的客户端:

[root@localhost bin]# ./zkCli.sh

  如果是连接多个不同的主机节点,可以使用如下命令:

./zkCli.sh -server 192.168.180.132:2888

  启动成功效果如下:

复制代码
Connecting to localhost:2181
..........
..........
..........
Welcome to ZooKeeper! 2018-10-25 21:04:54,407 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1029] - Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unknown error) JLine support is enabled 2018-10-25 21:04:54,471 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@879] - Socket connection established to localhost/0:0:0:0:0:0:0:1:2181, initiating session [zk: localhost:2181(CONNECTING) 0] 2018-10-25 21:04:54,501 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1303] - Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid = 0x10000712e6f0000, negotiated timeout = 30000 WATCHER:: WatchedEvent state:SyncConnected type:None path:null
复制代码

 zkCli.sh客户端的命令使用

zkCli.sh的使用

ZooKeeper服务器简历客户端

./zkCli.sh -timeout 0 -r -server ip:port

./zkCli.sh -timeout 5000 -server 192.9.200.242:2181

-r :即使ZooKeeper服务器集群一般以上的服务器当掉,也给客户端体统读服务

 

h  显示所有命令

ls path:查看某个节点下的所有子节点信息

ls / :列出根节点下所有的子节点信息

 

stat path :获取指定节点的状态信息

状态信息分析:

 

czxid 创建该节点的事物ID

ctime 创建该节点的时间

mZxid 更新该节点的事物ID

mtime 更新该节点的时间

pZxid 操作当前节点的直接子节点列表的事物ID(这种操作包含增加子节点,删除子节点)

cversion 当前节点的子节点版本号

dataVersion 当前节点的数据版本号

aclVersion 当前节点的acl权限版本号

ephemeralowner 当前节点的如果是临时节点,该属性是临时节点的事物ID

dataLength 当前节点的d的数据长度

numchildren 当前节点的子节点个数

 

get path 获取当前节点的数据内容

 

ls2 path :是ls 和 stat两个命令的结合

 

create [-s] [-e] path data acl

-s 表示是顺序节点

-e 标识是临时节点

path 节点路径

data 节点数据

acl 节点权限

 

 注:临时节点在客户端结束与服务器的会话后,自动消失

 

quit  :退出客户端

 

set path data [version] :修改当前节点的数据内容  如果指定版本,需要和当前节点的数据版本一致

 

 

delete path [version] 删除指定路径的节点 如果有子节点要先删除子节点

 

rmr path 删除当前路径节点及其所有子节点

 

 

 setquota -n|-b val path 设置节点配额(比如限制节点数据长度,限制节点中子节点个数)

-n 是限制子节点个数 -b是限制节点数据长度

超出配额后,ZooKeeper不会报错,而是在日志信息中记录

tail zookeeper.out

 

 

listquota path 查看路径节点的配额信息

 

delquota [-n|-b] path 删除节点路径的配额信息  

 

connect host:port 和 clost

在当前连接中连接其他的ZooKeeper服务器和关闭服务器

 

history 和 redo cmdno :查看客户端这次会话所执行的所有命令 和 执行指定历史命令

 

 

 

ZooKeeper 配置参数说明

 

1.必须配置项

下面3项是ZooKeeper正常运行所必须配置的。

  • clientPort
    向外提供服务的端口号。换句话说,是给客户端连接的端口。

  • dataDir
    ZooKeeper的数据目录,主要目的是存储内存数据库序列化后的快照路径。如果没有配置事务日志(即dataLogDir配置项)的路径,那么ZooKeeper的事务日志也存放在数据目录中。

  • tickTime
    tick的中文意思是"嘀的一声",tickTime指的是滴答一声的时间长度。在ZooKeeper中,它是所有涉及到时间长度的单元,单位为毫秒,就相当于时钟里的秒单元一样。例如,tickTime=2000;initLimit=5,表示initLimit的时间为"嘀嗒"5次,长度为2000*5=10秒。tickTime隐含了心跳时间(即心跳时间为tickTime),还隐含了客户端和服务器之间保持的会话的最小和最大超时时间(最小2倍tickTime,最大20倍tickTime)。

2.其它配置项

2.1 一般选项
  • dataLogDir
    指定事务日志的存放目录。事务日志对ZooKeeper的影响非常大,强烈建议事务日志目录和数据目录分开,不要将事务日志记录在数据目录(主要用来存放内存数据库快照)下。

  • globalOutstandingLimit
    接收客户端的最大请求队列。默认是1000。为了提高ZooKeeper的吞吐量,即使ZooKeeper已经没有空闲资源来处理新的客户端请求,也还是会接收进来。这个配置项是为了限流,避免内存溢出。

  • preAllocSize
    为事务日志预先开辟磁盘空间。默认是64M,意味着每个事务日志大小就是64M(可以去事务日志目录中看一下,每个事务日志只要被创建出来,就是64M)。如果ZooKeeper产生快照频率较大,可以考虑减小这个参数,因为每次快照后都会切换到新的事务日志,但前面的64M根本就没写完。(见snapCount配置项)

  • snapCount
    ZooKeeper使用事务日志和快照来持久化每个事务(注意是日志先写)。该配置项指定ZooKeeper在将内存数据库序列化为快照之前,需要先写多少次事务日志。也就是说,每写几次事务日志,就快照一次。默认值为100000。为了防止所有的ZooKeeper服务器节点同时生成快照(一般情况下,所有实例的配置文件是完全相同的),当某节点的先写事务数量在(snapCount/2+1,snapCount)范围内时(挑选一个随机值),这个值就是该节点拍快照的时机。

  • maxClientCnxns
    在套接字级别上限制同一客户端的并发连接数。因为同一客户端IP地址相同,可能会调度到同一个ZooKeeper服务器节点上。这个配置项是为了避免DoS攻击。默认值为60,设置为0表示不做任何限制。

  • clientPortAddress
    指定为客户端提供服务的监听地址(ipv4/ipv6)。换句话说,clientPort将只绑定在地址上。如果不设置该选项,将默认监听在所有地址上(0.0.0.0)。

  • minSessionTimeout

  • maxSessionTimeout
    客户端和服务端会话保持的最小、最大超时时间。ZooKeeper的很多数据和状态都和会话绑定。假如客户端和服务端成功建立连接(会话)后,正常情况下,客户端会时不时地向服务端发送心跳,如果这个服务端或者客户端挂了,它们之间的会话要保持多长时间。

  • fsync.warningthresholdms
    事务日志输出时,如果调用fsync方法超过此处指定的超时时间,那么会在日志中输出警告信息。默认是1000ms。

  • autopurge.snapRetainCount
    该配置项指定开启了ZooKeeper的自动清理功能后(见下一个配置项),每次自动清理时要保留的版本数量。默认值为3,最小值也为3。它表示在自动清理时,会保留最近3个快照以及这3个快照对应的事务日志。其它的所有快照和日志都清理。

  • autopurge.purgeInterval
    指定触发自动清理功能的时间间隔,单位为小时,值为大于或等于1的整数,默认值为0,表示不开启自动清理功能。

  • syncEnabled
    指定观察者(observers)是否像follower一样,也记录事务日志和快照,以便在observers重启时能加速恢复。默认值为true,设置为false表示禁用该功能,不记录日志和快照。

 

2.2 集群选项

在配置ZooKeeper集群时可能用到的配置项。

  • electionAlg
    指定leader选举算法。默认值为3,表示使用基于TCP的快速选举。在以前的版本中,还有0/1/2三种算法,它们都是基于UDP的,已经废弃了,以后的版本中会移除这三种算法。

  • initLimit
    followers启动时需要连接leader,并从Leader处获取它所缺失的那部分数据,以便它能和leader的数据保持同步。只有保持了同步,该follower才被标记为ONLINE,然后才能提供服务。这个配置项限定从follower启动到恢复完成的超时时间。一般情况下,ZooKeeper保存的都是协调数据,数据量不会很大,但如果要同步的数据很大,可以考虑增大这个选项的值。注意,这个值依赖于tickTime时间单元,例如tickTime=2000,initLimit=2表示4秒。

  • syncLimit
    follower和leader之间数据延迟的最大时间长度。例如,有个节点的更新操作缓慢,它的数据已经严重落后于leader,ZooKeeper就会将它从ZooKeeper集群中踢出去。ZooKeeper使用时间来度量follower和leader之间数据的延迟,这个选项的值依赖于tickTime,例如tickTime=2000,syncLimit=2表示follower比leader延迟了4秒。

  • leaderServes
    默认值为yes,表示leader也接受客户端的连接,接受来自客户端的读、写请求。leader的主要作用是协调ZooKeeper集群服务器节点间的写操作,如果想要获取更高的写吞吐量,可以将其设置为no,这样leader将不允许客户端的连接,它将专注于协调,但这会损失一点读吞吐量。

  • server.x=[hostname]:port_A:port_B
    指定ZooKeeper集群中的服务器节点。有几个server节点,就给几个这个配置项,所有节点上的这部分配置要一致。

    • X:整数。是ZooKeeper中服务器的一个简单标识。这个数值需要和dataDir下的myid文件内容一致。在启动ZooKeeper集群中的每个实例时,需要读取dataDir中的myid文件,并将该文件中的数值和配置文件中的server.X做匹配,匹配到哪个就表示是哪个ZooKeeper服务器节点。
    • hostname:ZooKeeper服务器节点的地址。
    • port_A(2888):这是第一个端口,用于Follower和Leader之间的数据同步和其它通信(只有leader会监听此端口)。
    • port_B(3888):这是第二个端口,用于Leader选举过程中投票通信。

    如果要配置的ZooKeeper的伪集群(多个ZooKeeper实例运行在同一机器上),每个server.X中的X、port_A和port_B必须不能相同。

    例如,3个服务器节点的伪集群ZooKeeper,数据目录分别为/zk/data1,/zk/data2,/zk/data3。可以这样配置。

server.1=localhost:2881:3881
server.2=localhost:2882:3882
server.3=localhost:2883:3883

 

然后在data1/myid、data2/myid、data3/myid中分别写入1、2、3(需要和X值对应)。

  • group.x=A[:B]
  • weight.y=N
    这两个一起用,用于启用分层仲裁功能。group命令用于将ZooKeeper集群中的服务器节点进行分组。如果没有使用group选项,则ZooKeeper默认将所有服务器节点归入一个默认组中。weight命令用于为每个服务器节点指定权重值,权重越高,投票时能投的票数越多。如果不配置weight命令,则所有节点的默认权重值为1。
    • x:分组id。整数值。
    • A:B:C...:用冒号分隔的服务器节点列表,表示这几个节点属于同一个组。整数值,取自server.X中的X。例如,上面server.x中的示例,group.1=1:2:3表示将这3个节点放进一个id=1的组中。
    • y:取自server.X中的X。
    • N:为该服务器节点指定的权重值。
      例如,9个节点的ZooKeeper集群,分成3组:
server.1=aaaa
server.2=aaaa
server.3=aaaa
server.4=aaaa
server.5=aaaa
server.6=aaaa
server.7=aaaa
server.8=aaaa
server.9=aaaa
 
group.1=1:2:3
group.2=4:5:6
group.3=7:8:9
 
weight.1=1
weight.2=1
weight.3=1
weight.4=1
weight.5=1
weight.6=1
weight.7=1
weight.8=1
weight.9=1

 

  当需要仲裁时,首先过滤掉权重值为0的组(即组中所有节点权重都为0),然后判断,如果组中有大多数节点投票的组达到了大多数组的要求,仲裁就通过。换个理解方式,就是先在组内投票,然后组自身投票。组内投票数达到了该组的大多数,这个组就有一票。如果           投票的组数量达到了总组数的大多数(不考虑权重为0的组),则整个仲裁就通过。

  • cnxTimeout

   在投票选举新的leader时,需要通过选举端口建立连接来发送通知信息。该配置项设置打开这个连接的超时时长。默认值为5。

  • ipReachableTimeout

   3.4.11版本中才引入的配置项。当解析主机名时,为可访问的IP地址设置此超时值,单位毫秒。默认情况下,ZooKeeper将使用主机名的第一个IP地址(不做任何reachable检查)。设置ipReachableTimeout(大于0)后,ZooKeeper将尝试获取第一个可访问的IP地址。             这是通过调用Java API函数InetAddress.isreavailable(long timeout)实现的。其中使用了这个超时值。如果找不到这样的IP地址,主机名的第一个IP地址将被使用。

 

服务端启动流程图

 

 

 

 

 Client主要的类

 

watch机制

 

 

 

 选举leader过程分析

 

 

 

 

 

 

 

参考网址:

 

        https://www.cnblogs.com/expiator/p/9853378.html参考地址:

  https://www.cnblogs.com/chengxuyuanzhilu/p/6698059.html

  https://www.cnblogs.com/f-ck-need-u/p/9236200.html

       https://segmentfault.com/a/1190000022928449