标签:lap 需要 日志 www 自动 服务 rowspan 导致 特点
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控存储的数据的状态变化。分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。
ZooKeeper的数据模型是一个树形节点,服务启动后,所有通过把数据加载到内存中,来提高服务器吞吐并减少延迟。
前面说到,ZooKeeper的作用就是用来维护和监控数据模型(目录节点树)中的数据的状态,所以操作就像操作目录一样:添加删除目录节点,添加删除子目录,设置权限,设置数据,监控目录的变化等。
create [-s] [-e] PATH DATA acl # 路径和数据,数据可以为空 -s是顺序节点(会自动在名称后面加序列号) -e是临时节点,不加则是永久节点
$ create /zktest/test1 test1
1 delete PATH [version] # 删除指定路径的节点,且节点必须为空,如果要删除含有子节点的节点则不行 2 rmr PATH # 递归删除
setquota -n|-b val path # -n 是限制子节点个数 -b是限制节点数据长度 val是额度 path 是节点 delquota [-n|-b] PATH # 删除配额设置 listquota PATH # 显示节点配额信息
set PATH DATA [version] # 路径和数据,可以设置版本号也可以不设置
# -*- coding: utf-8 -*- import sys, time import kazoo from kazoo.client import KazooClient from kazoo.client import DataWatch from kazoo.client import ChildrenWatch class ZkWatcher(object): def __init__(self, node, hosts="127.0.0.1:2181", timeout=15.0): self._hosts = hosts self._timeout = timeout self._node = node self._zk = KazooClient(hosts=self._hosts, timeout=timeout or self._timeout) self._node_children_list = [] def connect(self, timeout=15.0): if self._zk is None: self._zk = KazooClient(hosts=self._hosts, timeout=timeout or self._timeout) self._zk.start() def close(self): if self._zk: self._zk.stop() self._zk.close() self._zk = None def watcher_start(self): self.connect() self._node_children_list = self._zk.get_children(self._node) try: ChildrenWatch(self._zk, self._node, func=self._node_children_change) DataWatch(self._zk, path=self._node, func=self._node_data_change) while True: time.sleep(60) except Exception as e: print(e.args) def _node_children_change(self, children): len_now = len(self._node_children_list) if len(children) > len_now: print("add:", set(children) - set(self._node_children_list)) else: print("remove: ", set(self._node_children_list) - set(children)) self._node_children_list = children def _node_data_change(self, data, stat): print("更新长度{},内容:{}".format(stat.data_length, data.decode("utf-8"))) print("版本号:", stat.version) print("cversion:", stat.cversion) print("子节点数:", stat.numChildren) def register(self): """ register a node for this worker """ if not self._zk.exists(self._node): self._zk.create(self._node, bytes("%s" % time.time()), ephemeral=False, sequence=True) if __name__ == "__main__": zw = ZkWatcher("/zktest", hosts="192.168.0.189:2181") zw.watcher_start()
ZK中的时间和版本号:
cZxid | 创建节点时的事务ID | |
ctime |
|
|
mZxid |
|
|
mtime |
|
|
pZxid |
|
|
cversion |
|
|
dataversion |
|
|
aclversion |
|
|
dataLength |
|
|
numChildren |
|
ZooKeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,ZooKeeper 就将负责通知已经在 ZooKeeper 上注册的那些观察者做出相应的反应,从而实现集群中类似 Master/Slave 管理模式。
主要用于通用性配置,比如:机器列表,某些参数的开关。拥有以下特点:
用于分布式去中心化集群管理:如有多台 Server 组成一个服务集群,那么必须要一个“总管”知道当前集群中每台机器的服务状态,一旦有机器不能提供服务,集群中其它集群必须知道,从而做出调整重新分配服务策略。同样当增加集群的服务能力时,就会增加一台或多台 Server,同样也必须让“总管”知道,调整分配。有两个作用:
Leaders 的选举基于自己的ZAB算法,即原子消息广播协议。ZAB协议包括两种基本模式,崩溃恢复和消息广播,大致过程:
在广播事务之前Leader服务器会先给这个事务分配一个全局单调递增的唯一ID,也就是事务ID(ZXID),每一个事务必须按照ZXID的先后顺序进行处理。而且Leader服务器会为每一个Follower分配一个单独的队列,然后将需要广播的事务放到队列中。每个Follower服务器再接收到这个事务之后,都会将其以事务日志的形式写入到本地磁盘中,成功写入后反馈给Leader一个ACK,当Leader收到半数ACK响应之后,就会广播一个Commit消息给所有Follower,通知它们进行提交,同时Leader也会完成自身的提交。
其目的就是保证尽快选举出一个新的Leader并通知给其他Follower,同时保证整个集群中的数据状态是一致的
2 节点数据管理:树型文件存储系统以及通过客户端与ZK建立一个TCP的长连接来维持会话,通过这个连接可以检测心跳与服务器保存会话,也可以发送请求并接受服务器响应,也可以接受WATCH事件。
标签:lap 需要 日志 www 自动 服务 rowspan 导致 特点
原文地址:https://www.cnblogs.com/spaceapp/p/10322458.html