zookeeper个人总结

1 zookeeper是什么?

在学习zookeeper之前首先要清楚zookeeper是什么,下面我们就讲讲zookeeper的基本概念与知识(说错的地方欢迎各位大神指出)。

ZooKeeper是一个高性能,分布式的,开放源码的分布式应用程序协调服务,是一个为分布式应用提供一致性服务的软件;它提供了简单原始的功能,分布式应用可以基于原始的功能开发实现更高级的服务,比如分布式同步,配置管理,集群管理,命名空间。说白了 zookeeper就是为管理分布系统而被开发的;

那么什么是分布式应用呢

分布式应用可以在给定时间(同时)在网络中的多个系统上运行,通过协调它们以快速有效的方式完成特定任务。通常来说,对于复杂而耗时的任务,非分布式应用(运行在单个系统中)需要几个小时才能完成,而分布式应用通过使用所有系统涉及的计算能力可以在几分钟内完成。

通过将分布式应用配置为在更多系统上运行,可以进一步减少完成任务的时间。分布式应用正在运行的一组系统称为集群,而在集群中运行的每台机器被称为节点。

分布式应用有两部分, Server(服务器) 和 Client(客户端) 应用程序。服务器应用程序实际上是分布式的,并具有通用接口,以便客户端可以连接到集群中的任何服务器并获得相同的结果。 客户端应用程序是与分布式应用进行交互的工具。

 

在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。系统拥有多种通用的物理和逻辑资源,可以动态的分配任务,分散的物理和逻辑资源通过计算机网络实现信息交换。系统中存在一个以全局的方式管理计算机资源的分布式操作资源。zookeeper就可以作为这个资源。

 

2 zookeeper的内存模型

 

 

①树形结构中的每个节点叫做Znode

②每个Znode都有数据(byte[]类型),也可以有子节点

③节点路径 使用斜线分隔 如:/Zoo/Duck 且没有相对路径

④数据发生变化时,版本号会递增

⑤可以对Znode中的数据进行读写操作

Znode的类型:

Znode被分为持久(persistent)节点,顺序(sequential)节点和临时(ephemeral)节点。

持久节点  - 即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下,除非另有说明,否则所有znode都是持久的。

临时节点 - 客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。因此,只有临时节点不允许有子节点。如果临时节点被删除,则下一个合适的节点将填充其位置。临时节点在leader选举中起着重要作用。

顺序节点 - 顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径 /myapp 的znode创建为顺序节点,则ZooKeeper会将路径更改为 /myapp0000000001 ,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。顺序节点在锁定和同步中起重要作用。

也就是有四类节点:持久,持久顺序,临时,临时顺序;

3 Sessions(会话)

会话对于ZooKeeper的操作非常重要。会话中的请求按FIFO顺序执行。一旦客户端连接到服务器,将建立会话并向客户端分配会话ID 。会话的特点:

①会话代表客户端与服务端的一个zk连接

②底层是通过TCP协议进行连接通信

③zookeeper会在服务端创建一个会话对象来维护这个连接的属性

④当网络出现网络波动现象的时候,会话不一定断开,会话有一定超时时间

⑤会话有以下四个属性:

sessionID:唯一标识一个会话,具备唯一性;

Timeout:会话超时时间,创建客户端zookeeper对象时传入,有效值在服务器规定的最大、小值之间,超出后取两端的值;

Ticktime下次会话超时的时间;

isClosing:标记一个会话是否被关闭;

客户端以特定的时间间隔发送心跳以保持会话有效。如果ZooKeeper集合在超过服务器开启时指定的期间(会话超时)都没有从客户端接收到心跳,则它会判定客户端死机。

会话超时通常以毫秒为单位。当会话由于任何原因结束时,在该会话期间创建的临时节点也会被删除。

会话的状态:

Zookeeper会话在整个运行期间的生命周期中,会在不同的会话状态中之间进行切换,这些状态可以分为CONNECTINGCONNECTEDRECONNECTINGRECONNECTEDCLOSE

 

会话的管理:

服务器端通过sessionTracker类来管理会话,包括会话的创建、管理和清除工作

通过三个数据结构从三个维度来管理会话

sessionsById属性:用于根据sessionID来查找session

sessionsWithTimeout属性:通过sessionID来查找session的失效时间是什么时候

sessionSets属性:通过某个时间查询都有哪些会话在这个时间点会失效

 

 

如何检查会话的状态

Zookeeper常用的分桶策略:

把所有的会话按照时间维度进行分类管理,即同一个时间点失效的会话都在一起管理;把所有的时间按照某个单位进行等分(默认ticktime)此单为成为ExpirationInterval;某次超时时间=((currentTime+sessiontimeout)/ ExpirationInterval +1)× ExpirationInterval;当某个会话由于有操作而导致超时时间变化,则会把会话从上一个桶移动到下一个桶

 

当某次检查时,如果在此次的分桶(即前面的ExpirationInterval )之前还有会话,就说明这些会话都超时了,因为会话如果有业务操作或者心跳检测,会不断的转移会话。

4 zookeeper监视 watcher

 

客户端向zk服务器注册watcher的同时,会将watcher对象存储在客户端的watchManager;Zk服务器触发watcher事件后,会向客户端发送通知,客户端线程从watchManager中起watcher执行;

Watcher事件:

通知状态:org.apache.zookeeper.Watcher.Event.KeeperState

事件类型:org.apache.zookeeper.Watcher.Event.EventType

状态--事件关系表:



NodeDataChanged事件

– 无论节点数据发生变化?是数据版本发生变化都会触发

– 即使被更新数据与新数据一样,数据版本都会发生变化

NodeChildrenChanged

– 新增节点或者删除节点

AuthFailed

– 重点不是客户端会话没有权限而是授权失败

由于watcher知识较多,这篇就写到这里后期会有专项博客描述watcher的知识,望该兴趣的博友关注;



猜你喜欢

转载自blog.csdn.net/qq_40197576/article/details/80249287
今日推荐