zk系列一:zookeeper基础介绍
聊完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发起将数据写到内存的操作,至此写入操作完成;
文字描述太难懂了,于是昨晚画了一个图来展示zk集群内的数据同步过程,如下:

总结:ZAB协议队列和广播以及两阶段提交来实现数据同步。通过队列的FIFO特性以及两阶段提交保证了数据同步的原子性;
通过广播给各个follower集群并且不要求每个follower都同步成功(过半)保证了集群间数据同步的高效性;
leader维护的队列也为最终一致性的策略提供了保证,leader会将所有的写请求都放入队列,follower按顺序消费最终必然会与leader保持数据一致
集群是如何选主的
当leader挂了后,集群中任意节点发现后都会进行选主投票,只要有一个节点触发投票那么集群中每个节点都会被动参与投票,因为集群各节点是互相连通的;zk集群第一次启动谁的ID大谁就是leader,后续集群出了问题重启的话,则谁的数据完整(Zxid大)谁是leader,如果保留的数据一样大则再比较节点自身的myId;
补充
Zxid指的是当前节点的事物id,数值越大表示该节点的数据同步情况越完整;myid指的是在创建zk集群的时候,我们给它配置的值
zk系列一:zookeeper基础介绍的更多相关文章
- 【Zookeeper系列】Zookeeper简单介绍(转)
原文链接:https://www.cnblogs.com/sunddenly/p/4033574.html 一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技 ...
- 大数据系列文章-Hadoop基础介绍(一)
Hadoop项目背景简介 2003-2004年,Google公开了部分GFS个Mapreduce思想的细节,以此为基础Doug Cutting等人用了2年的业余时间,实现了DFS和Mapreduce机 ...
- Git系列教程二 基础介绍
一.存储方式 如果让我们设计一个版本控制系统,最简单的方式就是每做一次更改就生成一个新的文件. 这样的方式太占用空间,所以传统的版本控制系统都是保存一个文件的某个版本的全部内容以及其他版本相对于这个版 ...
- zk系列-zookeeper的使用
zk支持java/c访问,java常用的有apache-zkclient.社区版的i0tec-zkclient.github.adyliu,apache-zkclient是zk自身提供的接口,i0te ...
- Hadoop系列-zookeeper基础
目前是刚刚初学完zookeeper,这篇文章主要是简单的对一些基本的概念进行梳理强化. zookeeper基础概念的理解 有时候计算机领域很多名词都是从一长串英文提取首字母缩写而来,但很不幸zooke ...
- Zookeeper系列一:Zookeeper基础命令操作
有些事不是努力就可以改变的,五十块的人民币设计的再好看,也没有一百块的招人喜欢. 前言 由于公司年底要更换办公地点,所以最近投了一下简历,发现面试官现在很喜欢问dubbo.zookeeper和高并发等 ...
- 【01】emmet系列之基础介绍
[01]emmet系列之基础介绍 [02]emmet系列之HTML语法 [03]emmet系列之CSS语法 [04]emmet系列之编辑器 [05]emmet系列之各种缩写 相关网址 官网:http: ...
- 【Hadoop离线基础总结】zookeeper的介绍以及集群环境搭建、网络编程和RPC的简单了解
ZooKeeper的介绍以及集群环境搭建.网络编程和RPC的简单了解 ZooKeeper介绍 概述 ZooKeeper是一个分布式协调服务的开源框架,主要用来解决分布式集群中应用系统的一致性问题.例如 ...
- 死磕 java同步系列之zookeeper分布式锁
问题 (1)zookeeper如何实现分布式锁? (2)zookeeper分布式锁有哪些优点? (3)zookeeper分布式锁有哪些缺点? 简介 zooKeeper是一个分布式的,开放源码的分布式应 ...
随机推荐
- 【Java】学习路径62-枚举类型
public enum Role { TEACHER,STUDENT,CHEF } 使用: System.out.println(r1);//输出TEACHER System.out.println( ...
- 新建Github仓库并上传本地代码
按照Github的教程 Adding a local repository to GitHub using Git 1. 创建空的Github仓库 创建远程仓库 ,注意不要勾选Add a README ...
- k8s驱逐篇(4)-kube-scheduler抢占调度驱逐
介绍kube-scheduler抢占调度驱逐之前,先简单的介绍下kube-scheduler组件: kube-scheduler简介 kube-scheduler组件是kubernetes中的核心组件 ...
- Python数据科学手册-机器学习: k-means聚类/高斯混合模型
前面学习的无监督学习模型:降维 另一种无监督学习模型:聚类算法. 聚类算法直接冲数据的内在性质中学习最优的划分结果或者确定离散标签类型. 最简单最容易理解的聚类算法可能是 k-means聚类算法了. ...
- C++ 左值引用与一级指针
将**左值引用**用于**一级指针**时,有以下几种用法: ```c++ //方式一:引用一级指针,常规用法 int a = 5; int * pa = &a; int * &rpa ...
- .NET 反向代理-YARP 根据域名转发
前段时间发布过一个关于 YARP 的简单介绍,感兴趣的小伙伴恭请移步看看 .NET 反向代理-YARP - 一事冇诚 - 博客园 (cnblogs.com) 作为反向代理,必不可少的当然是根据域名代理 ...
- Java中的StringBuilder和StringBuffer适用场景
我不知道为什么这个这么老的问题会出现在我的时间线上,看了一下回答,大多是2012,2013年的回答,照说那个年代,有些历史故事还很新鲜,却不知道为什么没有一个答案说到点子上. stringbuffer ...
- Pod 的生命周期
上图展示了一个 Pod 的完整生命周期过程,其中包含 Init Container.Pod Hook.健康检查 三个主要部分,接下来我们就来分别介绍影响 Pod 生命周期的部分: 首先在介绍 Pod ...
- Kubernetes 中部署 NFS-Subdir-External-Provisioner 为 NFS 提供动态分配卷
文章转载自:http://www.mydlq.club/article/109/ 系统环境: 操作系统: CentOS 7.9 Docker 版本: 19.03.13 Kubernetes 版本: 1 ...
- ImGUI 1.87 绘制D3D外部菜单
ImGUI 它是与平台无关的C++轻量级跨平台图形界面库,没有任何第三方依赖,可以将ImGUI的源码直接加到项目中使用,该框架通常会配合特定的D3Dx9等图形开发工具包一起使用,ImGUI常用来实现进 ...