
(1)解压为zookeepertar -xf -C /home/myuser/zookeeper/
复制zookeeper文件夹3份,分别重名名为zookeeperA,zookeeperB,zookeeperC。 并且创建数据快照以及日志存放文件夹,命名为zooA,zooB,zooC。 (2)编辑对应的zookeeper配置文件,复制zookeeperconf下zoo_samplecfg为zoocfgcd /home/myuser/zookeeperA/conf
cp zoo_samplecfg zoocfg
(3)修改zoocfg# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored
# do not use /tmp for storage, /tmp here is just
# example sakes
dataDir=/home/myuser/zooA/data
# the port at which the clients will connect
clientPort=2181
# ZooKeeper server and its port no # ZooKeeper ensemble should know about every other machine in the ensemble # specify server id by creating 'myid' file in the dataDir # use hostname instead of IP address for convenient maintenance
server1=127001:2888:3888
server2=127001:2988:3988
server3=127001:2088:3088
#
# Be sure to read the maintenance section of the
# administrator guide before turning>tickTime:心跳时间,为了确保连接存在的,以毫秒为单位,最小超时时间为两个心跳时间
initLimit:多少个心跳时间内,允许其他server连接并初始化数据,如果ZooKeeper管理的数据较大,则应相应增大这个值
clientPort:服务的监听端口
dataDir:用于存放内存数据库快照的文件夹,同时用于集群的myid文件也存在这个文件夹里(注意:一个配置文件只能包含一个dataDir字样,即使它被注释掉了。)
dataLogDir:用于单独设置transaction log的目录,transaction log分离可以避免和普通log还有快照的竞争
syncLimit:多少个tickTime内,允许follower同步,如果follower落后太多,则会被丢弃。
(4)创建myid文件
cd /home/myuser/zooA/data
sudo sh -c 'echo "1" >> myid'
其他文件夹类似创建myid文件,zookeeperB为2,zookeeperC为3
(5)启动zookeeper
cd /home/myuser/zookeeperA/bin
sudo sh zkServersh start
查看zookeeper状态[root@weibo bin]# sh zkServersh status
JMX enabled by default
Using config: /home/weibo/zookeeperA/bin//conf/zoocfg
Mode: follower
启动OK,依次启动另外两台zookeeper,启动第一台zookeeper后,你可以观察bin下的zookeeperout可以看到报错,connection
refused,没有关系,zookeeper需要等待其他另个节点的加入,全部启动之后就正常了。
(6)客户端连接zookeeper
[root@weibo bin]# sh zkClish
Connecting to localhost:2181
2013-05-10 15:00:25,363 [myid:] - INFO [main:Environment@100] - Client environment:zookeeperversion=345-1392090, built>configs:保存上传的配置文件信息
clusterstatejson:集群状态json
aliases:别名json
live_node:当solr服务器启动的时候,会注册到这里
overseer:保存shard信息
overseer_elect:节点选举
collections:所有的collection
在准备好相应的配置之后,可以直接通过zkServersh 这个脚本进行服务的相关 *** 作
1 启动ZK服务: sh bin/zkServersh start
2 查看ZK服务状态: sh bin/zkServersh status
3 停止ZK服务: sh bin/zkServersh stop
4 重启ZK服务: sh bin/zkServersh restart
zk客户端命令
ZooKeeper命令行工具类似于Linux的shell环境,不过功能肯定不及shell啦,但是使用它我们可以简单的对ZooKeeper进行访问,数据创建,数据修改等 *** 作 使用 zkClish -server 127001: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
9rmr命令
删除节点命令,此命令与delete命令不同的是delete不可删除有子节点的节点,但是rmr命令可以删除,注意路径为绝对路径。
如rmr /zookeeper/znode
10 delquota命令
删除配额,-n为子节点个数,-b为节点数据长度。
如delquota –n 2,请参见listquota和setquota命令。
11printwatches命令
设置和显示监视状态,on或者off。
如printwatches on
listquota命令
显示配额。
如listquota /zookeeper
absolute path is/zookeeper/quota/zookeeper/zookeeper_limits
Output quota for /zookeepercount=2,bytes=-1
解释:
/zookeeper节点个数限额为2,长度无限额。
setAcl命令
设置节点Acl。
此处重点说一下acl,acl由大部分组成:1为scheme,2为user,3为permission,一般情况下表示为scheme:id:permissions。
其中scheme和id是相关的,下面将scheme和id一起说明。
scheme和id
world : 它下面只有一个id, 叫anyone, world:anyone代表任何人,zookeeper中对所有人有权限的结点就是属于world:anyone的
auth : 它不需要id, 只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authencation, 也支持username/password形式的authentication)
digest : 它对应的id为username:BASE64(SHA1(password)),它需要先通过username:password形式的authentication
ip : 它对应的id为客户机的IP地址,设置的时候可以设置一个ip段,比如ip:19216810/16, 表示匹配前16个bit的IP段
super : 在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa)
permissions
CREATE (c): 创建权限,可以在在当前node下创建child node
DELETE (d): 删除权限,可以删除当前的node
READ (r): 读权限,可以获取当前node的数据,可以list当前node所有的child nodes
WRITE (w): 写权限,可以向当前node写数据
ADMIN (a): 管理权限,可以设置当前node的permission
综上,一个简单使用setAcl命令,则可以为:
setAcl /zookeeper/node1 world:anyone:cdrw
getAcl命令
获取节点Acl。
如getAcl /zookeeper/node1
'world,'anyone
: cdrwa
注:可参见setAcl命令。
sync命令
强制同步。
如sync /zookeeper
由于请求在半数以上的zk server上生效就表示此请求生效,那么就会有一些zk server上的数据是旧的。sync命令就是强制同步所有的更新 *** 作。
redo命令
再次执行某命令。
如redo 10
其中10为命令ID,需与history配合使用。
addauth命令
节点认证。
如addauth digest username:password,可参见setAcl命令 digest处。
使用方法:
一、通过setAcl设置用户名和密码
setAcl pathdigest:username:base64(sha1(password)):crwda
二、认证
addauth digest username:password
delete命令
删除节点。
如delete /zknode1
setquota命令
设置子节点个数和数据长度配额。
如setquota –n 4 /zookeeper/node 设置/zookeeper/node子节点个数最大为4
setquota –b 100 /zookeeper/node 设置/zookeeper/node节点长度最大为100
ZooKeeper 常用四字命令:
ZooKeeper 支持某些特定的四字命令字母与其的交互。它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息。用户在客户端可以通过 telnet 或 nc 向 ZooKeeper 提交相应的命令
1 可以通过命令:echo stat|nc 127001 2181 来查看哪个节点被选择作为follower或者leader
2 使用echo ruok|nc 127001 2181 测试是否启动了该Server,若回复imok表示已经启动。
3 echo dump| nc 127001 2181 ,列出未经处理的会话和临时节点。
4 echo kill | nc 127001 2181 ,关掉server
5 echo conf | nc 127001 2181 ,输出相关服务配置的详细信息。
6 echo cons | nc 127001 2181 ,列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。
7 echo envi |nc 127001 2181 ,输出关于服务环境的详细信息(区别于 conf 命令)。
8 echo reqs | nc 127001 2181 ,列出未经处理的请求。
9 echo wchs | nc 127001 2181 ,列出服务器 watch 的详细信息。
10 echo wchc | nc 127001 2181 ,通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。
11 echo wchp | nc 127001 2181 ,通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。
Zookeeper 的视图结构是一个树形结构,树上的每个节点称之为数据节点(即 ZNode),每个ZNode 上都可以保存数据,同时还可以挂载子节点。并且Zookeeper的根节点为 "/"。
在 Zookeeper 中,每个数据节点都是有生命周期的,其生命周期的长短取决于数据节点的节点类型。在 Zookeeper 中有如下几类节点:
每个数据节点中除了存储了数据内容之外,还存储了数据节点本身的一些状态信息(State)。
在Zookeeper 中,事务是指能够改变 Zookeeper 服务器状态的 *** 作,我们也称之为事务 *** 作或更新 *** 作,一般包括数据节点创建与删除、数据节点内容更新和客户端会话创建与失效等 *** 作。对于每一个事务请求,Zookeeper 都会为其分配一个全局唯一的事务ID,用 ZXID 来表示,通常是一个 64 位的数字。每一个 ZXID 对应一次更新 *** 作,从这些 ZXID 中可以间接地识别出 Zookeeper 处理这些更新 *** 作请求的全局顺序。
ZXID 是一个 64 位的数字,其中低 32 位可以看作是一个简单的单调递增的计数器,针对客户端的每一个事务请求,Leader 服务器在产生一个新的事务 Proposal 的时候,都会对该计数器进行加 1 *** 作;而高 32 位则代表了 Leader 周期 epoch 的编号,每当选举产生一个新的 Leader 服务器,就会从这个 Leader 服务器上取出其本地日志中最大事务 Proposal 的 ZXID,并从该 ZXID 中解析出对应的 epoch 值,然后再对其进行加 1 *** 作,之后就会以此编号作为新的 epoch,并将低 32 位置 0 来开始生成新的 ZXID。
Zookeeper 中为数据节点引入了版本的概念,每个数据节点都具有三种类型的版本信息(在上面的状态信息中已经介绍了三种版本信息代表的意思),对数据节点的任何更新 *** 作都会引起版本号的变化。其中我们以 dataVersion 为例来说明。在一个数据节点被创建完毕之后,节点的dataVersion 值是 0,表示的含义是 ”当前节点自从创建之后,被更新过 0 次“。如果现在对该节点的数据内容进行更新 *** 作,那么随后,dataVersion 的值就会变成 1。即表示的是对数据节点的数据内容的变更次数。
版本的作用是用来实现乐观锁机制中的 “写入校验” 的。例如,当要修改数据节点的数据内容时,带上版本号,如果数据节点的版本号与传入的版本号相等,就进行修改,否则修改失败。
Zookeeper 提供了分布式数据的发布/订阅功能。一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能够让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使它们能够做出相应的处理。在 Zookeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能。Zookeeper 允许客户端向服务端注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。
从上图可以看出 Zookeeper 的 Watcher 机制主要包括客户端线程、客户端WatchMananger 和 Zookeeper 服务器三部分。在具体工作流程上,简单地讲,客户端在向 Zookeeper 服务器注册 Watcher 的同时,会将 Watcher 对象存储在客户端的 WatchMananger 中。当 Zookeeper 服务器端触发 Watcher 事件后,会向客户端发送通知,客户端线程从 WatchManager 中取出对应的 Watcher 对象来执行回调逻辑。
Watcher是一个接口,任何实现了Watcher接口的类就是一个新的Watcher。Watcher内部包含了两个枚举类:KeeperState、EventType
注 :客户端接收到的相关事件通知中只包含状态及类型等信息,不包括节点变化前后的具体内容,变化前的数据需业务自身存储,变化后的数据需调用get等方法重新获取;
上面讲到zookeeper客户端连接的状态和zookeeper对znode节点监听的事件类型,下面我们来讲解如何建立zookeeper的watcher监听。在zookeeper中采用zkgetChildren(path, watch)、zkexists(path, watch)、zkgetData(path, watcher, stat)这样的方式为某个znode注册监听。
下表以node-x节点为例,说明调用的注册方法和可监听事件间的关系:
Zookeeper 中提供了一套完善的 ACL(Access Control List)权限控制机制来保障数据的安全。
ACL 由三部分组成,分别是:权限模式(Scheme)、授权对象(ID)和权限(Permission),通常使用“scheme: id:permission”来标识一个有效的ACL 信息。下面分别介绍:
174、ACL 超级管理员
zookeeper的权限管理模式有一种叫做super,该模式提供一个超管可以方便的访问任何权限的节点
假设这个超管是:super:admin,需要先为超管生成密码的密文
那么打开zookeeper目录下的/bin/zkServersh服务器脚本文件,找到如下一行:
这就是脚本中启动zookeeper的命令,默认只有以上两个配置项,我们需要加一个超管的配置项
那么修改以后这条完整命令变成了
之后启动zookeeper,输入如下命令添加权限
在服务器集群初始化阶段,我们以 3 台机器组成的服务器集群为例,当有一台服务器server1 启动的时候,它是无法进行 Leader 选举的,当第二台机器 server2 也启动时,此时这两台服务器已经能够进行互相通信,每台机器都试图找到一个 Leader,于是便进入了 Leader 选举流程。
在zookeeper运行期间,leader与非leader服务器各司其职,即便当有非leader服务器宕机或新加入,此时也不会影响leader,但是一旦leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮leader选举,其过程和启动时期的Leader选举过程基本一致。
假设正在运行的有server1、server2、server3三台服务器,当前leader是server2,若某一时刻leader挂了,此时便开始Leader选举。选举过程如下:
observer角色特点:
为了使用observer角色,在任何想变成observer角色的配置文件中加入如下配置:
并在所有server的配置文件中,配置成observer模式的server的那行配置追加:observer,例如:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)