说说zookeeper【肆】_应用场景


上篇文章:说说zookeeper【叁】_工作机制


在系列第一篇文章中,我们已经整理了zookeeper在分布式应用中的使用场景:


可基于zookeeper实现数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、master选举、分布式锁和分布式队列等功能。


下面我们依次详细介绍一下具体实现。



数据发布/订阅


即所谓配置中心,就是发布者将数据发布到zookeeper的一个或一系列节点上,供订阅者进行数据订阅,达到获取数据的目的,实现配置信息的集中式管理和数据的动态更新。

通常有两种实现模式:推模式模式

推模式是服务端主动将数据更新发送给素有订阅的客户端,拉模式是客户单主动发起请求来获取最新数据,通常采用定时轮询拉取的方式。

zookeeper采用推拉相结合方式:客户端向服务器注册关注的节点,一旦该节点数据变更,那么服务端就会向客户端发送watcher时间通知,客户端收到通知后,主动到服务端获取最新的数据。


负载均衡


动态DNS,在zookeeper上创建一个节点进行域名配置,每个应用可以将自己的域名配置上去,并创建一个属于自己的数据节点作为域名配置的根节点。


命名服务


在分布式系统中,被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等,较为常见的就是一些分布式服务框架(RPC、RMI)中的服务地址列表。通过使用命名服务,客户端应用能够根据指定名字来获取资源的实体、服务地址和提供者的信息等。

zookeeper通过API接口可创建顺序节点,并且在API返回值中会返回这个节点的完整名字。利用这个特性,我们可以借助zookeeper生成全局唯一ID。


分布式协调/通知


zookeeper中特有的watcher注册与异步通知机制,能够很好地实现分布式环境下不同机器,甚至是不同系统之间的协调与通知,从而实现对数据变更的实时处理。基于zookeeper实现分布式协调与通知功能,通常的做法是不同的客户端都对zookeeper上同一个数据节点进行watcher注册,监听数据节点的变化(包括数据节点本身及其子节点),如果数据节点发生变化,那么所有订阅的客户端都能够接收到响应的watcher通知,并作出相应的处理。

具体功能实现包括心跳检测、工作进度汇报、系统调度等。


集群管理


包括集群监控和集群控制两大块,前者侧重对集群运行时状态的收集,后者则是对集群进行操作与控制。可以利用zookeeper一下两大特性实现:

1.客户端如果对zookeeper的一个数据节点注册watcher监听,那么当数据节点的内容或其子节点列表发生变更时,zookeeper服务器就会向订阅的客户端发送变更通知;

2.对在zookeeper上创建的临时节点,一旦客户端与服务器之间的会话失效,那么该临时节点也就被自动清除。


分布式日志收集


使用zookeeper来进行日志系统收集器的注册,典型做法是在zookeeper上创建一个节点作为收集器的根节点(如logs/collector),每个收集器机器在启动时,都会在收集器节点下创建自己的节点(logs/collector/machine1永久节点)。同时在节点下维护一个状态节点(logs/collector/machine1/status),用于记录状态。


master选举


客户端集群每天定时向zookeeper上创建一个临时节点,在此过程中只有一个客户端能够成功创建,那么这个客户端就是master。同时其他客户端则注册一个watcher在这个节点上,用于监控当前master机器是否存活, 以便 重新发起master选举。


分布式锁


分布式锁是控制分布式系统之间同步访问共享资源的一种方式,分为互斥锁和共享锁两种实现形式。

互斥锁
通过互斥保证一致性。实现方式是 客户端集群向zookeeper上创建一个临时节点,在此过程中只有一个客户端能够成功创建,当客户端处理完逻辑或宕机时,zookeeper会自动删除这个节点,其他客户端可继续竞争创建此节点。

共享锁
一般场景为读写锁的读写操作分离。实现方式是客户端创建一个节点,类似"hostname-请求类型-序号",然后获取所有已经创建的节点。

读锁:如果比自己序号小的节点都是读操作,则直接运行;如果不是,则在比自己小的最后一个写请求节点加上watcher事件;

写锁:如果自己不是最小序号节点,就在 自己小的最后一个节点加上watcher事件;


分布式队列


FIFO
参照分布式锁-共享锁的写锁实现。

Barrier
在一个节点设置屏障大小,注册watcher事件在节点上,关注节点下子节点数,如果达到 屏障大小则触发。



你可能感兴趣的:(开源框架,zookeeper,分布式应用,负载均衡,异步,集群)