zookeeper 管理命令
Zookeeper
1) 简介
Zk使用的是一个类似文件系统的数结构来管理。每个节点在zk中为znode,有一个唯一的标识路径。Znode中可以再包含znode或者存放数据;znode中的数据可以由多个版本,因为这些数据在同一个目录下,所以在查询的时候必须带上版本号。
(1) 临时节点:EPHEMERAL,zk中的节点分为临时节点与永久性节点。临时节点的生命周期依赖于其创建的会话。当创建这个znode的客户端与服务器失去联系,这个znode的session即失效,znode中的数据将被删除。临时节点是不能有子节点的。永久性节点只有在客户端显示的删除才会从zk中去除。
(2) 监控。如果znode中的数据或者子节点的目录发生变化,可以通知设置监控的客户端。即watches.客户端在节点上设置watch,当节点状态发生改变会触发watch所对应的操作。当watch被触发,zk向客户端发送一条通知。
(3) 数据访问。每个节点存储的数据都是原子性的操作。读取返回节点中的所有数据,写入将会替换节点中的所有数据。
(4) 顺序节点。创建znode时,用户可以请求在zk的路径后面加一个递增的计数。这个计数对于父节点来说是唯一的。
(5) 持久顺序节点:PERSISTENT_SEQUENTIAL,与持久节点不同的是,父节点会记录下每个子节点的创建顺序,可以利用这个属性,zk给节点后面添加一个后缀,作为新的节点名称。有范围的限制,其值为整型的最大值。
(6) 临时顺序节点:EPHEMRAL_SEQUENTIAL,利用临时顺序节点可以实现共享锁。
每个znode由3部分组成:
Stats:状态描述,权限、版本等
Childen:该节点下的子节点
Data:相关的数据信息
问题:
- zk中有没有访问控制,授权的设置?
有,zk中的ACL
- 什么时候需要创建临时节点?
比如zookeeper发布服务时,服务启动时将自己的信息注册为顺序节点,当服务断掉之后,临时节点也会被删除。
- 顺序节点的作用?
可以有助于生成序列号
- 为什么kafka要使用zookeeper,zk主要应用于什么场景?
Kafka使用zk将消息生成、存储、消费等过程结合在一起。借助zk,能够将所有组件在无状态的情况下组合在一起,实现生产者与消费者的负载均衡。
- 注册broker,注册topic,获知每个topic的partition
- 负载均衡consumer,存储offset
管理kafka中各种状态信息。
其中zk使用的场景包括:
1、 需要进行统一的命名服务,zk使用的是树形结构,可以避免产生一样的名称
2、 配置管理,在多服务器的情况下,将公共的配置信息放在zk中,利用watch,一旦配置信息发生了改变,每个服务器都将得到信息。
3、 集群管理。获取每台服务器的状态,新增或者宕机都必须马上通知其他的机器,实现主从的集群配置。
4、 共享锁。在跨进程或者跨
2) zkCli命令
利用bin下的zkCli来对zk进行管理。
ZkCli.sh -server 127.0.0.1:2181完成服务器连接,切记,server前面只有一个横线
(1) 查看按当前zk中包含的内容
ls
[cluster, controller, controller_epoch, brokers, zookeeper, admin, isr_change_notification, consumers, config]
看到这里不禁问,这些分别代表什么,一个个的进行阐述
Cluster
Controller
管理leader election及各种failover,管理partition及副本状态,如果当前的controller失败,会从其它正常的broker中选择一个出来,那么这个与leader之间的区别呢?leader是否可能是controller?
所有的partition都会有一个leader,这个由controller决定,这个controller只是broker中的一个。而有多少个partition就会有多少个leader。
Config
其下的节点为:changes,clients,topics,从名称中可以看出是客户及topics的信息
Admin
估摸是与授权有关系。
(2) 创建节点
Create /zk/node1 在zk目录下创建一个node1的节点
在其下设置其关联的字符串:set /zk/node1 “node1”
(3) 获取节点信息
get /zk/node1
得到的结果如下:
node1 cZxid = 0x20000038e ctime = Tue May 09 20:30:02 CST 2017 mZxid = 0x200000393 mtime = Wed May 10 08:37:00 CST 2017 pZxid = 0x20000038e cversion = 0 dataVersion = 2 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 5 numChildren = 0 |
(4) 删除节点
Delete /zk/node1
问题:1.如何正确退出zkCli.sh的命令台
3) Zk的四字字母命令
(1) Conf 输出相关服务配置的详细信息
echo conf |nc 127.0.0.1 2181
得到的结果为:
clientPort=2181 dataDir=/home/zookeeper/data/version-2 dataLogDir=/home/zookeeper/log/version-2 tickTime=2000 maxClientCnxns=60 minSessionTimeout=4000 maxSessionTimeout=40000 serverId=2 initLimit=10 syncLimit=5 electionAlg=3 electionPort=3888 quorumPort=2888 peerType=0 |
可以看到主要是一些设置的信息
重要的配置信息:
tickTime:CS通信的心跳间隔时间。是在服务器之间或者服务器与客户端之间维持的心跳时间间隔。该值设置的过小,会导致会话容易超时。
minSessionTimeout:客户端与服务器之间保持连接的最小超时时间。
maxSessionTimeout:最大的超时时间,所以客户端在设置会话的超时时间时,其值必须处于最大超时与最小超时之间,否则会被强制设置为最大或者最小值。
initLimit:备份节点与主节点之间初次连接时能够容忍的最多心跳数,该值*tickTime为能够容忍的时间。
syncLimit:同步时,备份节点与主节点之间能够容忍的最多心跳数。
electionAlg:选举算法。3对应FastLeaderElection算法,该值为默认值
electionPort:进行选举采用的端口,其中3888,在选举阶段监听其它服务器的连接。
quorumPort:其中Quorum为分布式系统中用来保证数据冗余和最终一致性的投票算法。2888为服务器之间通信的端口。如果该服务器为领导者,用来监听追随者。
peerType:是否为观察者,主要有两种:观察者或者参与者。0代表参与者
问题:
- initLimit: 是完成的时间还是建立连接能够容忍的时间?
是指leader允许follower在此时间内完成同步的工作。
- syncLimit: 即同步必须在此时间内完成or主节点可以比备份节点异步的时间间隔?
在通信的过程中,检测follower的存活状态,如果在该时间内没有收到follower的响应则认为follower已经失效了。
- 观察者与参与者时间的区别
因为写入操作必须是达到投票的半数,才能够生效,所以,如果随着节点不断增加,相应的写入成本会增加。基于此,观察者加入,观察者也可以处理读取与写入,会将这些请求给领导者,但是它与观察者之间有一点区别,不参与投票,只监听结果,所以增加观察者不会影响zk服务的。
- 2181与2888,3888之间的区别
其中2181是监听zk客户端的连接。
- Nc是什么命令
它其实是netcat的简写,一个简单、可靠的网络工具,这里的具体可以去查看相关资料
(2) Cons 得到连接信息的情况
/127.0.0.1:60098[1](queued=0,recved=213973,sent=213994,sid=0x25abaf5919b0000,lop=PING,est=1493971756904,to=6000,lcxid=0x2e2,lzxid=0x200000399,lresp=1494398623479,llat=0,minlat=0,avglat=0,maxlat=501) /127.0.0.1:44204[0](queued=0,recved=1,sent=0) |
可以看到包括的信息有:
Ip,端口,接收包数、发送包数、连接的session id,最后的操作方式等信息
(3) 查看是否已经启动了某服务
echo ruok|nc 127.0.0.1 2181
Imok
返回的lmok表示已经启动了本地的zk服务
相对的,使用
(4) Stat
状态信息及连接信息,比如是否为leader,
相应的有个mntr能够得到更多的监控zk的健康状态等各种信息,包括追随者数目等
(5) Wchs
有watch path的连接数及watch的路径数
(6) Wchc
则更为细致的指出watch的有关path
4) ZkServer.sh
Status得到zk服务的状态:./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/software/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: leader
包括使用的配置文件,当前的mode
问题:
- 如何实现一套zookeeper管理多个Kafka集群?
(1)首先在zk中创建节点
(2)可以选择在kafka的配置文件中的zookeeper添加节点的路径
(3)如果是不同的集群可以创建不同的节点,然后不同的broker连接到不同的节点路径下
- 如何正确关闭zk集群
直接到bin文件夹中启动 zkServer.sh stop
- 如何正确关闭kafka
直接到bin文件夹中启动 kafka-server-stop.sh