Zookeeper概念

  • Zookeeper是分布式协调服务,用于管理大型主机,在分布式环境中协调和管理服务是很复杂的过程,Zookeeper通过简单的架构和API解决了这个问题

Zookeeper实现分布式锁

分布式锁三要素:
加锁
解锁
锁超时
  • Zookeeper数据结构类似树结构,由节点Znode组成
  • Znode分为四种类型:
    • 持久节点(PERSISTENT): 默认节点类型,创建节点的客户端与Zookeeper断开连接后,节点依旧存在
    • 持久节点顺序节点(PERSISTENT_SEQUENTIAL): 持久节点顺序节点就是在创建持久节点时,Zookeeper根据创建节点的时间顺序给节点进行编号
    • 临时节点(EPHEMERAL): 创建节点的客户端与Zookeeper断开连接后,临时节点会被删除
    • 临时节点顺序节点(EPHEMERAL_SEQUENTIAL): 临时节点顺序节点就是在创建临时节点时,Zookeeper根据创建节点的时间顺序给节点进行编号
    • 应用Zookeeper的临时顺序节点,实现分布式锁

Zookeeper与Redis分布式锁比较:

分布式锁 Zookeeper Redis
优点 1.有封装好的框架,容易实现
2.有等待锁队列,提升抢锁的效率
Set和Del指令性能高
缺点 添加和删除节点性能低 1.实现复杂,需要考虑原子性,误删,锁超时问题
2.没有等待锁的队列,只能客户端自旋来等锁,效率低

Zookeeper的数据模型

  • 类似数据结构中的树,文件系统中的目录
  • Zookeeper的数据存储基于节点Znode
  • Znode的引用方式是路径引用,每一个Znode节点拥有唯一的路径

Znode中的元素

  • data: Znode存储的数据信息
  • ACL: 记录Znode的访问权限,即哪些进程和IP可以访问本节点
  • stat: Znode的各种元数据(数据的数据)
  • child: 当前节点的子节点引用

    Zookeeper的应用场景是读多写少的应用场景:Znode不用来存储大规模的业务数据,用于存储少量的状态和配置信息(Znode存储数据不能超过1MB)

Zookeeper基本操作

  • 创建节点:create
  • 删除节点:delete
  • 判断节点是否存在:exists
  • 获得一个节点的数据:getData
  • 设置一个节点的数据:setData
  • 获取节点下的所有子节点:getChildren

    exists,getData,getChildren属于读操作,Zookeeper客户端在请求读操作时,可以选择是否设置watch

Zookeeper事件通知

  • Watch可以理解成注册在特定Znode上的触发器
  • 当Znode发生改变的时候,调用create,delete,setData方法,将会触发Znode上注册的对应事件,请求的Watch的客户端会接收到异步通知
  • Zookeeper事件通知的交互过程:
    • 客户端调用getData方法,watch的参数是true,服务端接收到请求,返回节点数据,在对应的Hash表中插入被Watch的Znode路径以及Watcher列表
    • 当被Watch的Znode删除,服务端会查找Hash表,找到该Znode对应的所有Watcher,异步通知客户端,并且删除Hash表中对应的key-value

Zookeeper的一致性

  • Zookeeper Service集群是一主多从结构
  • 在更新数据时,首先更新到主服务器,再同步到从服务器
  • 在读数据时,直接读取任意节点
  • 采用ZAB协议,为了保证主从节点数据的一致性

ZAB协议

  • ZAB(Zookeeper Automic Broadcast): 解决Zookeeper集群崩溃恢复,主从数据同步问题
  • ZAB三种节点状态:
    • Looking:选举状态
    • Following:Following节点(从节点)所处的状态
    • Leading:Leading(主节点)所处的状态
  • 最大ZXID: 节点本地的最新事务编号,包含epoch计数两部分

ZAB集群崩溃恢复

  • 当Zookeeper的主节点服务器宕机后,集群就会进行崩溃恢复,分成三个阶段:

    • Leader election(选举阶段):

      • 集群中的节点处于Looking状态,各自向其它节点发起投票,投票当中包含自己服务器的ID和最新事务ID(ZXID)
      • 节点用自身的ZXID和其它节点收到的ZXID作比较,如果发现其它节点的ZXID比自身大,即数据比自己新,就重新发起投票,投票给目前已知最大ZXID所属节点
      • 每次投票后,服务器都会统计投票数量,判断是否某个节点得到半数以上的投票,这样的节点将会成为准Leader,状态变为Leading,其它节点状态变为Following
    • Discovery(发现阶段):
      • 在从节点发现最新的ZXID和事务日志,目的是为了防止在意外情况,选举产生多个Leader
      • Leader接收所有Follower发送的最新的epoch值,Leader从中选出最大的epoch,基于此值+1,生成新的epoch分发给各个Follower
      • 各个Follower接收到最新的epoch,返回ACK(响应码)给Leader,带上各自最大的ZXID和历史事务日志,Leader选出最大的ZXID,并更新自身历史日志
    • Synchronization(同步阶段):
      • 将Leader收集得到的最新历史事务日志,同步给集群中的所有Follower,只有当半数Follower同步成功,这个准Leader才能成为正式Leader.集群崩溃恢复正式完成

ZAB主从数据同步

  • Broadcast

    Zookeeper常规情况下更新数据的时候,由Leader广播到所有的Follower:

    • 客户端发出写入数据请求给任意的Follower
    • Follower把写入数据请求转发给Leader
    • Leader采取二阶段提交方式:(先保留提交日志,再提交数据)先发送Propose广播给Follower
    • Follower接收到Propose消息,写入日志成功后,返回ACK消息给Leader
    • Leader接收到半数以上的ACK消息,返回成功给客户端,并且广播commit请求给Follower
数据一致性:
强一致性
弱一致性
顺序一致性:Zookeeper,依靠事务ID和版本号,保证数据的更新和读取是有序的

Zookeeper应用场景

  • 分布式锁: 应用Zookeeper的临时顺序节点,实现分布式锁
  • 服务注册与发现: 利用Znode和Watcher,实现分布式服务注册与发现,如Dubbo
  • 共享配置和状态信息: Redis的分布式解决方案Codls,利用Zookeeper存放数据路由表和codls-proxy节点元信息,同时colds-config发起的命令都会通过Zookeeper同步到各个存活的codls-proxy
  • 高可用实现: Kafka,HBase,Hadoop都依靠Zookeeper同步节点信息,实现高可用

基于Docker创建Zookeeper

1.创建docker-compose.yml
zoo:
image: zookeeper
restart: always
hostname: zoo
ports:
- 2181:2181
environment:
- ZOO_MY_ID: 1
- ZOO_SERVER: server.1(id)=zoo(IP):2888:3888
2.执行docker-compose up -d

Zookeeper三种工作模式

  • 单机模式: 存在单点故障
  • 集群模式: 在多台服务器上部署Zookeeper集群
  • 伪集群模式: 在同一台服务器上运行多个Zookeeper实例,仍然有单点故障问题,其中配置的端口号要错开

Zookeeper三种端口号

  • 2181: 客户端连接Zookeeper集群使用的监听端口号
  • 3888: 选举Leader使用
  • 2888: 集群内机器通讯使用(Leader和Follower之间数据同步使用的端口号,Leader监听此端口)

Zookeeper详细使用解析!分布式架构中的协调服务框架最佳选型实践的更多相关文章

  1. Zookeeper在分布式架构中的应用

    Zookeeper 是一个高性能.高可靠的分布式协调系统,是 Google Chubby 的一个开源实现.Zookeeper 能够为分布式应用提供一致性服务,提供的功能包括:配置维护.域名服务.分布式 ...

  2. 分布式架构中shiro

    分布式架构中shiro 前言:前段时间在搭建公司游戏框架安全验证的时候,就想到之前web最火的shiro框架,虽然后面实践发现在netty中不太适用,最后自己模仿shiro写了一个缩减版的,但是中间花 ...

  3. 分布式架构中一致性解决方案——Zookeeper集群搭建

    当我们的项目在不知不觉中做大了之后,各种问题就出来了,真jb头疼,比如性能,业务系统的并行计算的一致性协调问题,比如分布式架构的事务问题, 我们需要多台机器共同commit事务,经典的案例当然是银行转 ...

  4. Zookeeper系列二:分布式架构详解、分布式技术详解、分布式事务

    一.分布式架构详解 1.分布式发展历程 1.1 单点集中式 特点:App.DB.FileServer都部署在一台机器上.并且访问请求量较少 1.2  应用服务和数据服务拆分  特点:App.DB.Fi ...

  5. shiro权限控制(二):分布式架构中shiro的实现

    前言:前段时间在搭建公司游戏框架安全验证的时候,就想到之前web最火的shiro框架,虽然后面实践发现在netty中不太适用,最后自己模仿shiro写了一个缩减版的,但是中间花费两天时间弄出来的shi ...

  6. [转]Todd.log - a place to keep my thoughts on programming 分布式架构中的幂等性

    Todd.log - a place to keep my thoughts on programming 理解HTTP幂等性 基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式. ...

  7. 分布式 PostgreSQL 集群(Citus),分布式表中的分布列选择最佳实践

    确定应用程序类型 在 Citus 集群上运行高效查询要求数据在机器之间正确分布.这因应用程序类型及其查询模式而异. 大致上有两种应用程序在 Citus 上运行良好.数据建模的第一步是确定哪些应用程序类 ...

  8. 分布式架构探索 - 2. WebService RPC框架之Apache CXF

    Apache CXF是一个开源的WebService RPC框架. 例子: 1. 新建一个maven web项目, 添加pom 如下: <?xml version="1.0" ...

  9. 复杂分布式架构下的计算治理之路:计算中间件 Linkis

    前言 在当前的复杂分布式架构环境下,服务治理已经大行其道.但目光往下一层,从上层 APP.Service,到底层计算引擎这一层面,却还是各个引擎各自为政,Client-Server 模式紧耦合满天飞的 ...

随机推荐

  1. 【LeetCode】52. N-Queens II(位运算)

    [题意] 输出N皇后问题的解法个数. [题解] 解法一:传统dfs回溯,模拟Q放置的位置即可,应该不难,虽然能通过,但是时间复杂度很高. 解法二:位运算大法好! 首先要明白这道题里两个核心的位运算 1 ...

  2. TEB 、TIB、PEB--Vista 32

    TEB struct TEB typedef struct _TEB { NT_TIB NtTib; PVOID EnvironmentPointer; CLIENT_ID ClientId; PVO ...

  3. 因为这几个TypeScript代码的坏习惯,同事被罚了500块

    作者:Daniel Bartholomae 翻译:疯狂的技术宅 原文链接:https://startup-cto.net/10-bad-typescript-habits-to-break-this- ...

  4. pycharm pymysql连接mysql 报错 pymysql.err.InterfaceError: (0, '')

    pycharm  pymysql连接mysql  执行MySQL操作遇到以下报错信息: conn.query(q) File "C:\Software\Python37\lib\site-p ...

  5. Mariadb3—多表查询

    1.内关联 select 字段名 from 表名1 inner join 表名2 on 表名1.字段名=表名2.字段名 where 条件 2.左关联 select 字段名 from 表名1 left ...

  6. redhat7.6 更换 centos7 YUM

    使用yum 遇到如下错误. This system is not registered to Red Hat Subscription Management. You can use subscrip ...

  7. JDBC_11_PreparedStatement(增删改操作)

    PreparedStatement(增删改操作) * 代码: ``` import javax.swing.plaf.nimbus.State; import java.sql.*; public c ...

  8. 另类的曲线方式定时Start up/Shut down VM 的解决方案

    一,引言 最近看到一位小兄弟在为了做 Azure 云虚拟机的自动关机开启 在群里求助,最后也不知道结果咋样了. 至于他提到的利用 Automation Account 我是没有接触过,并且也没有看资料 ...

  9. Git使用指导

    Git使用指导 目录结构: 一.版本控制 二.Git的历史 三.Git环境配置 四.GIt项目构建 五.Git基本理论 六.GIt文件操作 七.使用码云/GitHub 八.IDEA中继承Git 九.G ...

  10. 033- while循环语句

    语法 初始化语句; while(boolean表达式) { 循环体语句; 控制条件语句; } 执行过程: 只要boolean表达式里面的结果是true,就会执行while大括号里面的语句,直到bool ...