zookeeper是什么
ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。ZooKeeper性能上的特点决定了它能够用在大型的、分布式的系统当中。从可靠性方面来说,它并不会因为一个节点的错误而崩溃。除此之外,它严格的序列访问控制意味着复杂的控制原语可以应用在客户端上。ZooKeeper在一致性、可用性、容错性的保证,也是ZooKeeper的成功之处,它获得的一切成功都与它采用的协议——Zab协议是密不可分的。
Zookeeper安装
tar -xvfz zookeeper-3.4.5.tar.gz -C /opt/cdh-5.3.6/cd /opt/cdh-5.3.6/zookeeper-3.4.5/confvi /etc/profileexport ZOOKEEPER_HOME=/opt/modules/jdk1.7.0_67export PATH=$PATH:ZOOKEEPER_HOME/binsource /etc/profile
zookeeper角色
领导者:领导者负责投票的发起和决议,更新系统状态学习者:1 跟随者:follower用于接收客户端请求并向客户端返回结果,在选择过程中参与投票2 观察者:observer可以接收客户端连接,不参与投票,将请求发送给领导者,同步领导者状态,目的是为了扩展系统,提高读取速度3 客户端:请求发起方
zookeeper典型应用场景
从设计模式来看,zookeeper是基于观察者模式设计的分布式服务管理框架,负责存储和管理大家关心的数据,接收观察者的注册,一旦数据发生状态变化,zookeeper负责通知已经在zookeeper上注册的观察者做出反应,从而实现类似master/slave的管理模式。
应用场景
统一命名服务 配置管理 集群管理 共享锁、同步锁
配置文件
# The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial # synchronization phase can takeinitLimit=10# The number of ticks that can pass between # sending a request and getting an acknowledgementsyncLimit=5# the directory where the snapshot is stored.# do not use /tmp for storage, /tmp here is just # example sakes.dataDir=/opt/modules/data/zookeeper# the port at which the clients will connectclientPort=2181## Be sure to read the maintenance section of the # administrator guide before turning on autopurge.## http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance## The number of snapshots to retain in dataDir#autopurge.snapRetainCount=3# Purge task interval in hours# Set to "0" to disable auto purge feature#autopurge.purgeInterval=1
initLimit:配置zookeeper接收客户端(这里所说的客户端不是用户连接zookeeper服务器的客户端,而是指zookeeper服务器集群中连接到Leader的Follower服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过10个心跳时间长度后zookeeper服务器还没有收到客户端的返回消息,那么表明这个客户端连接失败。总的时间长度就是10*2000=20秒。
syncLimit:配置Leader与Follower之间发送消息,请求和应答时间长度最长不能超过多少个ticketTime的时间长度,总的时间长度就是5*2000=4秒。
tickTime: zookeeper服务器之间或者是客户端与服务器之间维持心跳的时间间隔,也就是每隔2000毫秒发送一次心跳。
zookeeper配置
mkdir -p /opt/modules/data/zookeeper#修改zookeeper中conf目录下的zoo_sample.cfg为zoo.cfgvi zoo.cfgdataDir=/opt/modules/data/zookeeperinitLimit=10 #默认值syncLimit=5 #默认值
防火墙端口开启
在防火墙中打开要用到的端口2181 2888 3888
vi /etc/sysconfig/iptables-A INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT-A INPUT -m state --state NEW -m tcp -p tcp --dport 2888 -j ACCEPT-A INPUT -m state --state NEW -m tcp -p tcp --dport 3888 -j ACCEPT#重启服务service iptables restart#查看状态service iptables status# 查看zookeeper服务输出信息,服务信息输出文件在.../bin/zookeeper.outtail -500f zookeeper.out
分布式集群
server.A=B:C: D 其中A是一个数字,表示这是第几号服务器。B是这台服务器的IP地址。C表示这台服务器与集群中的Leader服务器交换信息的端口。D表示的是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于B都是一样,所以不同的zookeeper实例通信端口号不能一样,所以要给他们分配不同的端口号。
修改三个zookeeper节点中的zoo.cfg文件,添加server.0、server.1、server.2
2888端口号是zookeeper服务之间通信的端口。
3888端口是zookeeper与其他应用程序通信的端口。
在zookeeper目录下,创建data目录。在3个zookeeper节点中data目录下分别创建myid文件,并分别添加内容0、1、2
./bin/zkServer.sh startJMX enabled by defaultUsing config: /opt/cdh-5.3.6/zookeeper-3.4.5/bin/../conf/zoo.cfgStarting zookeeper ... STARTED#查看状态zkServer.sh statusJMX enabled by defaultUsing config: /opt/cdh-5.3.6/zookeeper-3.4.5/bin/../conf/zoo.cfgMode: standalone#启动zookeeper shell ./bin/zkCli.sh
zookeeper命令使用
- 创建节点
create [-s] [-e] path data acl#其中,-s或-e分别指定节点特性,顺序或临时节点,若不指定,则表示持久节点;acl用来进行权限控制。#创建顺序节点[zk: localhost:2181(CONNECTED) 3] create -s /zk-test 123Created /zk-test0000000000[zk: localhost:2181(CONNECTED) 4] create -s /zk-test 123Created /zk-test0000000001[zk: localhost:2181(CONNECTED) 5] create -s /zk-test 123Created /zk-test0000000002#可以看到创建的zk-test节点后面添加了一串数字以示区别。#创建临时节点create -e /zk-temp 123#临时节点在客户端会话结束后,就会自动删除,下面使用quit命令退出客户端#创建永久节点[zk: localhost:2181(CONNECTED) 17] create /zk-permanent 123 Created /zk-permanent[zk: localhost:2181(CONNECTED) 18] create /zk-permanent/second 123 Created /zk-permanent/fdfd可以看到永久节点不同于顺序节点,不会自动在后面添加一串数字。
读取节点
与读取相关的命令有ls 命令和get 命令,ls命令可以列出Zookeeper指定节点下的所有子节点,只能查看指定节点下的第一级的所有子节点;get命令可以获取Zookeeper指定节点的数据内容和属性信息。其用法分别如下
ls path [watch] get path [watch] ls2 path [watch] 若获取根节点下面的所有子节点,使用ls / 命令即可[zk: localhost:2181(CONNECTED) 8] ls /[zk-test0000000000, zk-test0000000001, zk-permanent, zookeeper, zk-test0000000002]
若想获取根节点数据内容和属性信息,使用get / 命令即可
[zk: localhost:2181(CONNECTED) 12] get /cZxid = 0x0ctime = Wed Dec 31 19:00:00 EST 1969mZxid = 0x0mtime = Wed Dec 31 19:00:00 EST 1969pZxid = 0x8cversion = 4dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 0numChildren = 6#或者[zk: localhost:2181(CONNECTED) 13] ls2 /[zk-test0000000000, zk-test0000000001, zk-permanent, zk-permanent3, zookeeper, zk-test0000000002]cZxid = 0x0ctime = Wed Dec 31 19:00:00 EST 1969mZxid = 0x0mtime = Wed Dec 31 19:00:00 EST 1969pZxid = 0x8cversion = 4dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 0numChildren = 6
更新节点
使用set命令,可以更新指定节点的数据内容,用法如下set path data [version]其中,data就是要更新的新内容,version表示数据版本,如将/zk-permanent节点的数据更新为456,可以使用如下命令:[zk: localhost:2181(CONNECTED) 0] set /zk-permanent 43534cZxid = 0x5ctime = Fri Jun 22 09:14:26 EDT 2018mZxid = 0xbmtime = Fri Jun 22 09:21:28 EDT 2018pZxid = 0x5cversion = 0dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 5numChildren = 0#现在dataVersion已经变为1了,表示进行了更新。
删除节点
使用delete命令可以删除Zookeeper上的指定节点,用法如下delete path [version]其中version也是表示数据版本,使用delete /zk-permanent 命令即可删除/zk-permanent节点[zk: localhost:2181(CONNECTED) 5] ls /[zk-test0000000000, zk-test0000000001, zk-permanent3, zookeeper, zk-test0000000002]#可以看到,已经成功删除/zk-permanent节点。值得注意的是,若删除节点存在子节点,那么无法删除该节点,必须先删除子节点,再删除父节点。