首页 > 其他分享 >再聊聊zookeeper

再聊聊zookeeper

时间:2022-10-25 13:23:54浏览次数:42  
标签:zk zookeeper leader 集群 聊聊 path 数据 节点

聊完kafka必不可少的需要再聊一聊zk了,下面开始

一、ZK是什么

ZooKeeper是分布式应用程序的高性能协调服务。它可以实现分布式的选主、统一配置管理,命名,分布式节点同步,分布式锁等分布式常用功能;它以path节点的形式保存数据,每个节点都可以存储数据,因为ZK只是分布式的协调者而不推荐做数据库,所以需要减少没必要的写操作,确保对外提供的服务高效、快速,因此其节点的最大容量限制为1M;

1、ZK的节点类型

  • 持久节点 即客户端创建后不会随着客户端的下线而消失,会一直存在;
  • 临时节点 即随着客户端的下线而被删除;这里需要说下的是,zk会给每个客户端创建一个session,且该session是会同步到集群其他节点的;

2、ZK的几个特征

  • 顺序一致性 ===> 即客户端的更新将按发送顺序执行
  • 原子性 ===> 即更新要么成功要么失败,没有中间状态
  • 统一视图 ===> 无论连接到哪个服务器,客户端都将看到相同的服务视图,即集群内各节点对外展示的视图统一不会有偏差
  • 可靠性 ===> 节点更新以后在下次操作它之前,该节点的数据不会发生变更
  • 及时性 ===> 集群对外提供的客户视图保证在特定时间范围内是最新的,可以理解成最终一致性,某个节点发生编号后会在特定时间内同步到集群其他节点,这也呼应了统一视图的特征

3、常用命令

  • create [-s] [-e] path data
    -s 可选,表示创建的是序列节点,会给节点编号,可以在分布式集群环境下保证向同一个节点写入数据的安全性(不被覆盖)
    -e 可选,表示创建的是临时节点
    path 必填,表示期望创建的节点路径
    data 必填,表示期望存储的数据,需要注意的是如果不用存数据该参数也不可缺省,可用""代替
  • get path
    获取path路径下的子节点信息
  • set path data
    设置path下存储的值
  • delete path
    删除path
  • sync path
    获取path下集群一致性达成后的最终数据,即如果请求的是非leader节点需同步向leader请求数据

二、ZK的集群

zk是主从复制集群,一个leader多个follower,只有leader能写,其余节点只提供读功能,但是客户端是可以连接集群中任意节点的,当连接的是leader则直接写,当连接的是follower则会被转发到leader进行写操作;zk集群分为两种状态,一种为leader存活的可用状态,另一种为leader挂了的不可用状态(无主);当集群处于不可用状态即leader下线时,分为两种情况,一种是剩余存活节点的个数满足过半选举条件,此时会进行选主操作,过半通过即产生新的leader集群恢复成可用状态;另一种是剩余存活节点数不满足过半选举条件,如leader挂了后集群只剩两台机子了,这样会出现脑裂问题,会导致选主失败整个集群仍会处于不可用状态。需要注意的是第二种选主失败集群不可用的情况下,只是集群对外不可用,对应存活实例的进程仍然存在,直到有新的服务上线满足选主条件,从而使集群快速恢复到可用状态;下面通过图示直观展现:

集群间数据同步问题

zk集群由leader负责数据的增改操作,那么leader的数据同步到集群各节点是如何做到数据一致性的呢?zk采用的是最终一致性策略,通过ZAB协议实现,下面介绍ZAB协议

  • ZAB(原子广播协议)
    ZAB是zk特有的一致性协议,并非分布式通用的一致性协议,其基于Paxos演变而来;leader会为每个follower分配一个FIFO的队列,当leader接收到写请求时,会为写入节点分配Zxid,同时将其放入队列;follower按序从队列中取出对应信息向自身的磁盘写日志成功后向leader回一个ack;当leader收到ack的个数大于集群一半时即认为消息确认成功,执行commit操作;并向各follower发起将数据写到内存的操作,至此写入操作完成;

总结:ZAB协议队列和广播以及两阶段提交来实现数据同步。通过队列的FIFO特性以及两阶段提交保证了数据同步的原子性,通过广播给各个follower集群并且不要求每个follower都同步成功(过半)保证了集群间数据同步的高效性;

集群是如何选主的

当leader挂了后,集群中任意节点发现后都会进行选主投票,只要有一个节点触发投票那么集群中每个节点都会被动参与投票,因为集群各节点是互相连通的;zk集群第一次启动谁的ID大谁就是leader,后续集群出了问题重启的话,则谁的数据完整(Zxid大)谁是leader,如果保留的数据一样大则再比较节点自身的myId;

补充
Zxid指的是当前节点的事物id,数值越大表示该节点的数据同步情况越完整;myid指的是在创建zk集群的时候,我们给它配置的值

标签:zk,zookeeper,leader,集群,聊聊,path,数据,节点
From: https://www.cnblogs.com/darling2047/p/16812670.html

相关文章

  • Zookeeper的服务器的log4j升级为log4j2的升级方案(忽略配置化兼容问题)
    参考在线markdown编辑器:​​http://marxi.co/​​Zookeeper的服务器的log4j升级为log4j2的升级方案(忽略配置化兼容问题)目前希望可以升级将Zookeeper中log4j的版本升级到log......
  • ZooKeeper原理架构
    一、ZooKeeper简介1.1、zookeeper由来   Zookeeper最早起源于雅虎研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统......
  • zookeeper 集群搭建
    zookeeper集群搭建vi~/.bashrcexportZOOKEEPER_HOME=/data/zookeeper-3.4.14exportPATH=$ZOOKEEPER_HOME/binsource~/.bashrcroot@node148:/data/zookeeper-3.4.14/con......
  • zookeeper 部署
    2.1.1 部署步骤解压zookeeper部署包,并启动zookeeper服务。#解压tar-zxvfzookeeper-3.5.5-bin.tar.gz#启动cdapache-zookeeper-3.5.5-bin/bin./zkServer.shs......
  • HMZK5【Zookeeper集群】
    1ZK集群Leader选举Leader选举:Serverid:服务器ID比如有三台服务器,编号分别是1,2,3。编号越大在选择算法中的权重越大。Zxid:数据ID服务器中存放的最大数据ID.......
  • 14.Linux下安装ZooKeeper
    1.解压解压安装包并将解压后的目录移动到/usr/local/zookeeper目录下。tar-zxvfzookeeper-3.4.10.tar.gzmvzookeeper-3.4.10/usr/local/zookeepercd/usr/local/zookee......
  • 聊聊kafka
    两个月因为忙于工作毫无输出了,最近想给团队小伙伴分享下kafka的相关知识,于是就想着利用博客来做个提前的准备工作了;接下来会对kafka做一个简单的介绍,包括利用akf原则来解析......
  • 聊聊 MyBatis 缓存
    聊聊MyBatis缓存首发公众号-悟空聊架构:图解|聊聊MyBatis缓存你好,我是悟空。本文主要内容如下:一、MyBatis缓存中的常用概念MyBatis缓存:它用来优化SQL数据......
  • 分库分表真的适合你的系统吗?聊聊分库分表和NewSQL如何选择
    曾几何时,“并发高就分库,数据大就分表”已经成了处理MySQL数据增长问题的圣经。面试官喜欢问,博主喜欢写,候选人也喜欢背,似乎已经形成了一个闭环。但你有没有思考过,分库分表......
  • HMZK4【Zookeeper分布式锁】
    1分布式锁1.1概念1.2原理2案例:模拟12306售票2.1Curator实现分布式锁API在Curator中有五种锁方案:InterProcessSemaphoreMutex:分布式排它锁(非可重入锁)InterPr......