学习进阶之Zookeeper学习

如何理解zookeeper?

1、背景

在一个系统中,多个服务可能都会请求一个资源,多个服务同时请求时可能存在脏数据的问题,为了避免这种问题我们需要对多个服务进行上锁,可以通过调度算法来规范服务之间的请求次序。这样其中一个服务请求时,其它服务就等待。在单个系统中可以直接这样实现,但是对于分布式系统不一样。

2、产生

在分布式系统中通过网络连接多个服务,多个服务同时去请求一个资源,那么就需要特定的角色来管理服务的请求次序,就像单个系统中的调度算法一样,而这样的角色就是zookeeper。

3、使用流程

在分布式系统中多个服务向zookeeper中注册,注册之后进行通过zookeeper统一管理,zookeeper来对服务的请求进行加锁,这样一个服务请求资源时,对这部分资源进行加锁,其它服务不能请求,当服务处理完资源释放锁之后其它服务才能进行。这就是zookeeper在分布式系统中实现的分布式锁的思想,这是一种分布式协调技术,协调各个服务的关系以及请求。
所以zookeeper主要实现的是:分布式一致性问题以及分布式锁的实现

4、介绍

zookeeper介绍:

  • 理解节点:zookeeper中的节点可以理解为B-Tree模型,每个节点存储的是自己的数据以及节点的信息,
  • 节点分为:临时节点、永久节点
  • 临时节点的生命周期依赖于会话、临时节点不允许有子节点
  • 永久节点不依赖于会话,在执行删除操作时才会删除永久节点
  • 节点在创建时都会维护一个stat的数据结构,里面存储了节点的状态信息

学习进阶之Zookeeper学习_第1张图片

5、详解

  • 对于每个节点都要进行一个监听,在zookeeper中有watch监听器,watch监听每个节点的变化,节点的增删改都会出发watch,watch被触发就会向客户端发送一条通知信息。
  • watch中提供了有序的一致性保证。
  • watch机制:zookeeper服务器、客户端线程、watchmanager

当客户端向zookeeper服务中注册同时会向watchmanager中存储一个watch对象
,zookeeper服务器触发了watch,向客户端发送通知,客户端从watchmanager中取出watch对象进行回调,告诉zookeeper服务器收到了通知。

6、分布式锁实现

目的:解决分布式系统中的单点故障问题

场景:分布式系统中采用主从模式,一个主节点连接多个从节点,主节点服务分发任务,从节点服务处理任务,若主节点发生故障,则系统瘫痪。

  1. 传统的解决方式:通过增加一个备用主节点,备用主节点和主节点发送ping消息和ack确认信息,判断主节点是否挂掉。
    但是会出现一个问题就是ack确认信息因为网路故障没发送成功,导致备用主节点以为主节点已经挂掉(其实没挂掉)。
  2. 通过zookeeper解决:设置两个主节点001和002,都向zookeeper中注册,zookeeper的注册机制(paxos算法会推举一个master)会推举一个节点为主节点,例如为001为主节点,002为备用节点。
    若主节点挂掉,zookeeper中通过监听节点信息来发现主节点挂掉了,那么会再进行推举的方式,002被推举为主节点
    若主节点恢复,那么监听到001恢复,则继续执行推举的方式,推举一个主节点出来,另一个为备用节点。

7、总结

  • zookeeper通过将服务注册到节点中,通过watch来监控节点的状态,间接的监控了服务的状态,就能够及时的知道服务的状态,然后进行判断处理。避免了网络波动引发的服务之间监控出问题。
  • 如可以通过创建临时节点来建立心跳检测机制。如果分布式系统的某个服务节点宕机了,则其持有的会话会超时,此时该临时节点会被删除,相应的监听事件就会被触发。
  • 分布式系统的每个服务节点还可以将自己的节点状态写入临时节点,从而完成状态报告或节点工作进度汇报。
  • 通过数据的订阅和发布功能,Zookeeper还能对分布式系统进行模块的解耦和任务的调度。
  • 通过监听机制,还能对分布式系统的服务节点进行动态上下线,从而实现服务的动态扩容。

你可能感兴趣的:(进阶学习-zk,dubbo,kafka,k8s,docker,分布式,zookeeper,java)