ZooKeeper架构
-
client:客户端。从server获取信息,周期性发送数据给server,表示自己还活着。client连接时,server回传ack信息。如果client没有收到reponse,自动重定向到另一个server。
-
server:ZooKeeper集群中的一员,向client提供所有service,回传ack信息给client,表示自己还活着。
-
ensemble:ZooKeeper服务器组,最小节点数是3台主机。
-
leader:leader节点(服务器节点)。如果连接的节点失败,自动恢复,zk服务启动时,完成leader选举。
-
follower:follower节点(服务器节点)。听从leader节点的调度。
-
session:会话。Session中的请求以FIFO执行,一旦client连接到server,session就建立了。sessionid分配client。client以固定间隔向server发送心跳,表示session是valid的,zk集群如果在超时时候,没有收到心跳,判定为client挂了,与此同时,临时节点被删除。
-
watches:观察者模式。client能够通过watch机制在数据发生变化时接收通知。client可以在read 节点时设置观察者。watch机制会发送通知给注册的客户端。观察模式只触发一次。session过期,watch机制就被删除。
ZooKeeper节点:znode
下图描绘了用于内存表示的ZooKeeper文件系统的树结构。ZooKeeper节点称为znode。每个znode都由一个名称标识,并由一系列路径(/)分隔。
-
在图中,有一个以“/”分隔的根znode。在root下,有两个逻辑命名空间config和workers。
-
config 名称空间用于统一管理配置,workers 名称空间用于命名。
-
在 config 名称空间下,每一个znode最多存储1M的数据,此结构的主要目的是存储同步数据并描述znode的元数据。此结构称为ZooKeeper Data Model。
每一个znode在ZooKeeper数据模型中都包含一个 stat 结构。stat 给 znode 提供元数据(metadata)。stat 由 Version number,Action control list (ACL),Timestamp,Data length组成。
-
Version number(版本号):每个znode都有一个版本号,每次与znode关联的数据发生更改时,其对应的版本号就会增加。当多个zookeeper客户端尝试在同一个znode上执行操作时,使用版本号很重要。
-
ACL(动作控制列表): ACL是用于访问znode的认证机制。它管理所有znode的读写操作。
-
Timestamp(时间戳):表示从znode创建和修改起经过的时间。
-
Data length(数据长度): 存储在znode中的数据总量。最多可以在znode中存储1M的数据。
Znodes的类型
znodes 被分为 持久节点(Persistence znode),临时节点(Ephemeral znode),序列节点(Sequential znode)
-
Persistence znode:默认节点,即使客户端关闭,znode也能存活
-
Ephemeral znode:在client活动时有效,断开自动删除。临时节点不能有子节点。
-
Sequential znode:可以是持久节点也可以是临时节点。当新的znode被创建为序列znode时,ZooKeeper通过将10位序列号附加到原始名称后来设置znode的路径。序列znode在锁定和同步中起着重要作用。
ZooKeeper工作流程
-
zk集群启动后,client连接到其中的一个节点,这个节点可以leader,也可以follower。连通后,node分配一个id给client,发送ack信息给client。如果客户端没有收到ack,连接到另一个节点。client周期性发送心跳信息给节点保证连接不会丢失。
-
如果client读取数据,发送请求给node,node读取自己的数据库,返回节点数据给client.
-
如果client存储数据,将路径和数据发送给server,server转发给leader。leader再补发请求给所有follower。只有大多数(超过半数:2n + 1)节点成功响应,则写操作成功。
如果client存储数据,将路径和数据发送给server,server转发给leader。leader再补发请求给所有follower。只有大多数(超过半数)节点成功响应,则写操作成功。
leader推选过程
-
所有节点在同一目录下创建临时序列节点。
-
节点下会生成/xxx/xx000000001等节点。
-
序号最小的节点就是leader,其余就是follower。
-
每个节点观察小于自己节点的主机。(注册观察者)
-
如果leader挂了,对应主机的znode(节点数据)被删除。
-
观察者收到通知。推选出节点序号次小的作为leader节点。