龙空技术网

盘点ZooKeeper应用场景

米菠萝萝 423

前言:

而今姐妹们对“mysqlzookeeper”大概比较关切,兄弟们都需要了解一些“mysqlzookeeper”的相关内容。那么小编同时在网上汇集了一些有关“mysqlzookeeper””的相关内容,希望看官们能喜欢,看官们快快来了解一下吧!

1、数据发布/订阅

ZooKeeper使用Watcher机制实现分布式数据的发布/订阅功能。实现方式如下:

数据存储:将数据存储到某个ZNode节点上。数据获取:应用在启动时,从ZNode节点读取数据,并在该节点注册一个数据变更Watcher。数据变更:当数据变更时,更新ZNode节点数据。ZooKeeper会将数据变更通知发送到各客户端,各客户端重新读取变更后的数据。

ZNode节点存储数据具备以下特点:

数据量较小;数据内容在系统运行时动态更新;集群中各机器共享,配置一致。

ZooKeeper可以作为配置中心,存储机器列表信息、数据库配置信息等;也可以作为微服务架构中的服务注册中心,存储各微服务提供的服务信息,如作为Dubbo框架的配套服务注册中心。

2、负载均衡

ZooKeeper本身不提供负载均衡策略,需要自己根据负载均衡算法去实现。基于ZooKeeper实现的负载均衡中,只是利用ZooKeeper节点的树形结构、Watcher机制,把ZooKeeper当做服务的注册和变更通知中心,解决了依赖单一硬件负载均衡或者LVS、Nginx软件负载均衡方案带来的单点故障问题。

常用的负载均衡算法:

轮询算法随机算法原地址哈希算法:对IP地址进行哈希计算后取模,根据结果选择其中一台服务器处理。保证某个IP客户端发出的请求始终被后台的某台服务器处理加权轮询算法加权随机算法最小连接数算法

使用ZooKeeper实现负载均衡的思路:

实现负载均衡的关键在于找到网络集群中,最适合处理该请求的机器,并将该请求分配给该机器。因此,探测和发现后台服务器的运行状态变得尤为关键。ZooKeeper利用ZNode临时节点保存每台机器的连接数,我们可以选择当前连接数最少的那台作为处理当前请求的机器。

3、分布式命名服务

ZooKeeper利用ZNode节点的树状分层结构和子节点的次序维护能力为分布式系统中的资源命名。典型场景有

分布式API目录:Dubbo分布式框架利用ZooKeeper分布式的JNDI(Java命名和目录接口)能力,维护全局的服务接口API地址列表。分布式ID生成器:在分布式场景下,为每一个数据资源提供唯一的ID标识能力,满足高并发、高负载的需求。分布式节点命名:分布式系统中,由于业务膨胀或流量洪峰到来时,可能会动态加入大量节点到集群中,一旦流量洪峰过去,就需要下线大量的节点,或者由于机器或网络原因,一些节点主动离开集群。可以利用ZooKeeper为节点进行命名,动态管理分布式集群中的节点。4、分布式协调/通知

ZooKeeper利用Watch监听,实现分布式协调通知。允许客户端对某个ZNode节点注册一个Watcher监听,当ZooKeeper中的指定事件触发了这个Watcher,ZooKeeper会向订阅的客户端发送一个变更通知,然后客户端根据Watcher通知状态和事件类型做出业务上的改变。

如:MySQL数据复制总线,用于在不同的MySQL数据库实例之间进行数据复制和数据变化通知。

5、集群管理

ZooKeeper利用Watcher监听和临时节点断开连接后被自动删除的特性,完成集群管理,包括是否有机器加入或退出、master选举。

在判断机器加入或退出时,约定所有机器在ZooKeeper的父目录下创建临时节点,并在父目录节点上注册Watcher监听,监听父目录节点的子节点变化。一旦有机器宕机,该机器与ZooKeeper的连接断开,其所创建的临时目录节点被删除,ZooKeeper就会通知其他所有机器:有个节点被删除了。对于新机器的加入,过程是类似的,新机器在ZooKeeper父目录下创建临时节点,ZooKeeper通知其他所有机器:有新机器加入了。

在master选举时,可以约定所有机器连上ZooKeeper后,创建临时有序节点,每次选取编号最小的机器作为master即可。

6、Master选举

ZooKeeper利用其强一致性,能够很好地保证在分布式高并发情况下节点的创建一定能够保证全局唯一性,即ZooKeeper将会保证客户端无法重复创建一个已经存在的数据节点。

首先创建一个/master_election/yyyy-MM-dd节点,客户端集群每天会定时往该节点下创建临时节点,如/master_election/yyyy-MM-dd/bindling,这个过程中,只有一个客户端能够创建成功,此时其变成Master,其他节点都会在/master_election/yyyy-MM-dd节点上注册一个子节点变更的Watcher,用于监控当前的Master机器是否存活,一旦发现当前Master挂了,其余客户端将会重新进行Master选举。

7、分布式锁

分布式锁用于控制分布式系统之间同步访问共享资源的一种方式,可以保证不同系统访问一个或一组资源时的一致性,主要分为排他锁和共享锁。

排它锁:又称写锁或独占锁。获取锁:在需要获取排它锁时,所有客户端通过调用接口,在/exclusive_lock节点下创建临时子节点/exclusive_lock/lock,ZooKeeper保证只有一个客户端能够创建成功,没有成功的客户端需要注册/exclusive_lock节点监听。释放锁:当获取锁的客户端宕机或者正常完成业务逻辑都会导致临时节点的删除,此时,所有在/exclusive_lock节点上注册监听的客户端都会收到通知,可以重新发起分布式锁获取。共享锁:又称为读锁。若事务T1对数据对象O1加上共享锁,那么当前事务只能对O1进行读取操作,其他事务也只能对O1加共享锁,直到该数据对象上的所有共享锁都被释放。获取锁:在需要获取共享锁时,所有客户端都会到/share_lock下面创建一个临时顺序节点,如果是读请求,那么就创建例如/share_lock/host1-R-00000001的节点,若果是写请求,那么就创建例如/share_lock/host2-W-00000002的节点。判断读写顺序:不同事务可以同时对一个数据对象进行读写操作,而更新操作必须在当前没有任何事务进行读写的情况下进行,通过ZooKeeper来确定分布式读写顺序:创建完节点后,获取/share_lock节点下所有子节点,并对该节点变更注册监听;确定自己的节点序号在所有子节点中的顺序;对于读请求:若没有比自己序号小的子节点或所有比自己序号小的子节点都是读请求,那么表明自己已经成功获取到共享锁,同事开始执行读取逻辑,若有写请求,则需要等待。对于写请求,若自己不是序号最小的子节点,那么需要等待。接收到Watcher通知后,重复步骤1释放锁:当获取锁的客户端宕机或者正常完成业务逻辑都会导致临时节点的删除,此时,所有在/share_lock节点上注册监听的客户端都会收到通知,可以重新发起分布式锁获取。羊群效应:如果集群规模扩大,在某个节点移除自己的共享锁后,ZooKeeper发送了子节点变更Watcher通知给所有机器,然而这只会对一台机器产生影响,对其他机器没有任何左右,大量的Watcher通知和子节点列表获取两个操作会重复运行,这样会造成性能影响和网络开销,更为严重的是,若同一时间有多个节点对应的客户端完成事务或事务中断引起节点消失,ZooKeeper会在短时间内想其他所有客户端发送大量的时间通知,即羊群效应。ZooKeeper实现分布式锁的原理ZooKeeper的每一个节点,都是一个天然的顺序发号器:在每一个节点下面创建临时顺序节点,新的子节点后面,会加一个次序编号,这个次序编号是上一个生成的次序编号加一ZooKeeper节点的递增有序性,可以确保锁的公平:每个要获得锁的线程,在持久父节点下创建临时顺序节点,zk保证这些临时顺序节点是按照次序一次递增的,规定编号最小的那个节点,表示获得了锁,每个线程在尝试占用锁之前,首先判断自己的编号是否当前最小,若是,则获得锁。ZooKeeper的节点监听机制,可以保障占有锁的传递有序而高效:ZooKeeper的节点监听机制,可以避免羊群效应8、分布式队列

ZooKeeper利用其ZNode临时节点的特性实现同步队列:在约定节点目录下创建临时节点,监听节点数目是否达到我们要求的数目;

ZooKeeper利用其ZNode永久顺序节点的特性,可以实现先进先出队列(FIFO队列),在约定的节点目录下创建永久顺序节点,节点中存储的数据即为消息内容,创建成功,表示完成入队操作。消息消费时,从序列号最小的开始删除节点,表示完成出队操作。FIFO队列创建的是持久化节点,不必担心消息丢失问题。

标签: #mysqlzookeeper