Zookeeper简介、应用和实践

Zookeeper 协议

简介:分布式协调服务,提供诸如统一命名、配置管理等基础服务
越来越多的分布式应用面临数据一致性问题,Zookeeper的设计目标是将那些复杂且容易出错的分布式一致服务封装起来,构建一个高效可靠的原语集,并以一系列简单可用的接口提供给用户使用

设计目标:

  • 简单的数据模型
  • 可构建集群
  • 顺序访问
  • 高性能

基础概念:

  • 集群
  • 会话
  • Znode
  • 版本
  • Watcher
  • ACL create read write delete admin

Zookeeper简单应用场景

  • redis 服务发现和治理
    在redis实际应用中,一般会有一个主节点redis,几个从属节点redis。
    主节点处理用户写请求,从节点向主节点同步数据,处理用户读的请求。

当主节点故障的时候,从节点会通过raft算法选举出新的主节点处理用户写请求。

问题产生:如何在主服务器变更后,更新项目redis读写配置?

原始做法: 修改项目代码里面的redis地址和端口,然后上传代码,再重新部署

Zookeeper解决方法:通过zookeeper监控主从服务器变动,在项目里面引入zookeeper客户端,当主服务器变更的时候,zookeeper客户端会收到通知,在通知回调里,我们可以收到新的主节点地址和端口,根据他写一段redis重启代码,这样就避免了服务器重启

Zookeeper 使用和API

创建 create(final String path, byte data, List<ACL> acl, CraeteMode createMode)
读取 getChildren(path, watcher, watch, cb, ctx, stat) getData(path, watcher, stat, watch, cb, ctx)
更新 setData(path, data, version)
删除 delete (path ,version)
判断节点是否存在 exists(path, watcher)

ZAB协议

ZAB协议是为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复的原子广播协议
ZAB不像Paxos算法那样是一种通用的分布式一直算法,他是一种特别为Zookeeper设计的崩溃可恢复的原子广播算法

  • 主备模式,单一主进程处理事务
  • 全局的变更时序,也就是说如果一个状态更新已经发生了,那么所有其依赖的状态变更都应该被提前处理了
  • 支持崩溃恢复

Zookeeper两种基本模式,崩溃恢复和消息广播,还有一种数据恢复模式
Leader服务器收到事务,转化成Proposal,Follow服务器收到事务,转发给Leader

消息广播

类似二阶段提交
区别在于移除了中断逻辑,所有的Follower要么正常反馈Leader提出的事务Proposal,要么抛弃Leader服务器。所以这意味着

  • Leader收到过半的Ack就可以Commit了,不需要等所有的回复
  • 无法处理Leader奔溃退出带来的数据不一致

基于TCP协议,可以做到FIFO
Leader会为每个Proposal分配一个ZXID

Leader为每一个Follower保存一个队列,发送Proposal,然后Follow保存事务日志到磁盘,然后回复ACK,Leader收到过半ACK后广播Commit,然后Follow提交Commit

崩溃恢复

ZAB保证如果一个事务的Proposal在一台机器上被处理成功,那么应该在所有的机器上都处理成功,两种特征

  • ZAB协议需要确保已经在Leader服务器上确认的事务最终被所有的服务器都提交
  • ZAB协议需要确保丢弃那些只在Leader服务器上被提出的事务

谁是Leader:让所有机器中拥有最高的Proposal ZXID的Follower做Leader
步骤分成三步:发现、同步、广播

  • 步骤 F.1.1 Follower F 将自己最后接受的事务Proposal的epoch值CEPOCH(Fp)发送给准Leader L
  • 步骤 L.1.1 当接受到来自过半Follower发送的CEPOCH值后,准Leader发送NEWEPOCH(e’)给过半的Follower
  • 步骤 F.1.2 赋值并且发送ACK(当前Follower的事务集合)
  • Leader选出一个覆盖最全面的Proposal组合

同步阶段

  • 将最全面的Proposal组合同步给所有的Follower
    广播阶段

e为主进程序列号也是主进程周期

Zookeeper 应用场景

数据发布、订阅

  • 实现配置信息的集中式管理和数据的动态更新
  • 应用:数据库、机器列表、选项开关
    负载均衡 DDNS
  • 本地host
  • 全自动的dns,消费者和服务者、注册中心、检测中心
    命名服务
  • 全局唯一ID,mysq auto increment 单机有效,UUID太长、含义不明
  • 用创建顺序节点的方式实现
    分布式协调通知
  • 任务调度
    Master选举
    分布式锁
    分布式队列

在我们系统中的应用

数据库等信息的配置
服务地址的配置
分布式锁

    原文作者:孙阔
    原文地址: https://www.jianshu.com/p/7fef8592245c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞