目录

  • 一、zookeeper核心概念
  • 1、文件系统的数据结构
  • 2、事件监听机制
  • 二、zookeeper实现分布式配置中心流程
  • 三、zookeeper实现分布式锁流程
  • 四、为什么zookeeper集群的数目一般为奇数个?


一、zookeeper核心概念

zookeeper是hadoop的一个正式子项目,是开源的分布式应用程序协调框架,用来解决分布式应用中经常遇到的一些数据管理问题,比如:统一命名服务、状态同步服务、集群管理、分布式应用配置管理、分布式锁等。

简单的说zookeeper有两个核心概念:

  • 类似文件系统的数据结构
  • 事件监听机制

1、文件系统的数据结构

在zookeeper中,将文件系统的目录项称为znode,我们可以添加和删除znode,也可以在znode下面添加、删除子znode,与文件系统不同的是znode可以存储数据。

删除zookeeper下的clickhouse 删除zookeeper节点_分布式锁


zookeeper的znode有六种类型:

  • 持久化节点:节点一旦创建,永久存在,除非手动删除该节点
  • 持久化顺序节点:持久化节点基础上自带顺序
  • 临时节点:zookeeper连接关闭,session会话超时(默认30s)服务器自动删除节点,临时节点不可以有子节点
  • 临时顺序节点:在临时节点基础上自带顺序
  • 容器节点:当没有子节点时,将会被服务器自动删除
  • TTL节点:超过TTL指定时间,将会被服务器自动删除

临时节点的创建与删除流程:

注意:临时节点不能创建子节点

删除zookeeper下的clickhouse 删除zookeeper节点_Server_02

2、事件监听机制

zookeeper的客户端可以监听指定的znode,当监听的znode发生变化(删除、更新、添加子节点,删除子节点)时都会向客户端响应对应的事件。

二、zookeeper实现分布式配置中心流程

利用zookeeper的事件监听机制可以实现分布式配置中心

假设我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置全部放到zookeeper上去,保存在 zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 zookeeper 的通知,然后从 zookeeper 获取新的配置信息应用到系统中

删除zookeeper下的clickhouse 删除zookeeper节点_分布式锁_03

三、zookeeper实现分布式锁流程

在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源时候,juc包的锁就无能无力了,这时候就需要分布式锁了。常见的分布式锁实现方式有使用zookeeper的临时节点,redis的set函数,数据库锁来实现。下面是zookeeper实现分布式锁的流程:

删除zookeeper下的clickhouse 删除zookeeper节点_Server_04


当程序使用zookeeper获取分布式锁的时候,首先判断/exclusive/lock是否存在,如果已经存在则监听等待释放锁(删除/exclusive/lock),否则创建临时节点/exclusive/lock,如果创建成功则表示获取到锁,创建不成功则继续监听等待直到释放锁。

删除zookeeper下的clickhouse 删除zookeeper节点_zookeeper_05

四、为什么zookeeper集群的数目一般为奇数个?

  • Leader选举算法采用了Paxos协议;
  • Paxos核心思想:当多数Server写成功,则任务数据写成功如果有3个Server,则两个写成功即可;如果有4或5个Server,则三个写成功即可。
  • Server数目一般为奇数(3、5、7)如果有3个Server,则最多允许1个Server挂掉;如果有4个Server,则同样最多允许1个Server挂掉由此,我们看出3台服务器和4台服务器的的容灾能力是一样的,所以为了节省服务器资源,一般我们采用奇数个数,作为服务器部署个数。