ZooKeeper(八)伸缩性

2023-11-15

一、ZooKeeper中Observer

1.1 ZooKeeper角色

经过前面的介绍,我想大家都已经知道了在ZooKeeper集群当中有两种角色Leader和Follower。Leader可以接受client 请求,也接收其他Server转发的写请求,负责更新系统状态。 Follower也可以接收client请求,如果是写请求将转发给Leader来更新系统状态,读请求则由Follower的内存数据库直接响应。 ZooKeeper集群如图1.1所示。

图 1.1 ZooKeeper集群服务

但在ZooKeeper的3.3.3版本以后,ZooKeeper中又添加了一种新角色Observer。Observer的作用同Follower类似,唯一区别就是它不参与选主过程。那么,我们就可以根据该特性将ZK集群中的Server分为两种:

(1) 投票Server:Leader、Follower

(2) 非投票Server:Observer

1.2 为什么引入Observer

(1) ZooKeeper可伸缩性

那么,ZooKeeper为什么要引入Observer这个角色呢?其实在ZooKeeper中引入Observer,主要是为了使 ZooKeeper具有更好的可伸缩性。那么,何为可伸缩性?关于伸缩性,对于不同的人意味着不同的事情。 而在这里是说,如果我们的工作负载可以通过给系统分配更多的资源来分担,那么这个系统就是可伸缩的;一个不可伸缩的系统却无法通过增加资源来提升性能,甚 至会在工作负载增加时,性能会急剧下降。

在Observer出现以前,ZooKeeper的伸缩性由Follower来实现,我们可以通过添加Follower节点的数量来保证 ZooKeeper服务的读性能。但是随着Follower节点数量的增加,ZooKeeper服务的写性能受到了影响。为什么会出现这种情况?在此,我 们需要首先了解一下这个"ZK服务"是如何工作的。

(2) ZK服务过程

ZooKeeper服务中的每个Server可服务于多个Client,并且Client可连接到ZK服务中的任一台Server来提交请求。若是读请求,则由每台Server的本地副本数据库直接响应。若是改变Server状态的写请求,需要通过一致性协议来处理,这个协议就是我们前面介绍的Zab协议。

简单来说,Zab协议规定:来自Client的所有写请求,都要转发给ZK服务中唯一的ServerLeader, 由Leader根据该请求发起一个Proposal。然后,其他的Server对该Proposal进行Vote。之后,Leader对Vote进行收 集,当Vote数量过半时Leader会向所有的Server发送一个通知消息。最后,当Client所连接的Server收到该消息时,会把该操作更新 到内存中并对Client的写请求做出回应。该工作流程如下图1.2所示。

图1.2 ZK 写请求工作流程图

从图中我们可以看出, ZooKeeper 服务器在上述协议中实际扮演了两个职能。它们一方面从客户端接受连接与操作请求,另一方面对操作结果进行投票。这两个职能在 ZooKeeper集群扩展的时候彼此制约。例如,当我们希望增加 ZK服务中Client数量的时候,那么我们就需要增加Server的数量,来支持这么多的客户端。然而,从Zab协议对写请求的处理过程中我们可以发 现,增加服务器的数量,则增加了对协议中投票过程的压力。因为Leader节点必须等待集群中过半Server响应投票,于是节点的增加使得部分计算机运 行较慢,从而拖慢整个投票过程的可能性也随之提高,写操作也会随之下降。这正是我们在实际操作中看到的问题——随着 ZooKeeper 集群变大,写操作的吞吐量会下降。

(3) ZooKeeper扩展

所以,我们不得不,在增加Client数量的期望和我们希望保持较好吞吐性能的期望间进行权衡。要打破这一耦合关系,我们引入了不参与投票的服务 器,称为 Observer。 Observer可以接受客户端的连接,并将写请求转发给Leader节点。但是,Leader节点不会要求 Observer参加投票。相反,Observer不参与投票过程,仅仅在上述第3歩那样,和其他服务节点一起得到投票结果。

图 1.3 Observer 写吞吐量测试

图1.3 显示了一个简单评测的结果。纵轴是,单一客户端能够发出的每秒钟同步写操作的数量。横轴是 ZooKeeper 集群的尺寸。蓝色的是每个服务器都是投票Server的情况,而绿色的则只有三个是投票Server,其它都是 Observer。从图中我们可以看出,我们在扩充 Observer时写性能几乎可以保持不便。但是,如果扩展投票Server的数量,写性能会明显下降,显然 Observers 是有效的。

这个简单的扩展,给 ZooKeeper 的可伸缩性带来了全新的镜像。我们现在可以加入很多 Observer 节点,而无须担心严重影响写吞吐量。但他并非是无懈可击的,因为协议中的通知阶段,仍然与服务器的数量呈线性关系。但是,这里的串行开销非常低。因此,我 们可以认为在通知服务器阶段的开销无法成为主要瓶颈。

二、Observer应用

(1) Observer提升读性能的可伸缩性

应对Client的数量增加,是 Observer的一个重要用例,但是实际上它还给集群带来很多其它的好处。Observer作为ZooKeeper的一个优化,Observer服务器可以直接获取Leader的本地数据存储,而无需经过投票过程。但这也面临一定的"时光旅行"风险,也就是说:可能在读到新值之后又读到老值。但这只在服务器故障时才会发生事实上,在这种情况下,Client可以通过"sync"操作来保证下一个值是最新的。

因此,在大量读操作的工作负载下,Observer会使ZooKeeper的性能得到巨大提升。若要增加投票Server数量来承担读操作,那么就 会影响ZooKeeper服务的写性能。而且Observer允许我们将读性能和写性能分开,这使ZooKeeper更适用于一些以读为主的应用场景。

(2) Observer提供了广域网能力

Observer还能做更多。Observer对于跨广域网连接的Client来说是很好的候选方案。Observer可作为候选方案,原因有三:

① 为了获得很好的读性能,有必要让客户端离服务器尽量近,这样往返时延不会太高。然而,将 ZooKeeper 集群分散到两个集群是非常不可取的设计,因为良好配置的 ZooKeeper 应该让投票服务器间用低时延连接互连——否则,我们将会遇到上面提到的低反映速度的问题。

② 而Observer 可以被部署在,需要访问 ZooKeeper 的任意数据中心中。这样,投票协议不会受到数据中心间链路的高时延的影响,性能得到提升。投票过程中 Observer 和领导节点间的消息远少于投票服务器和领导节点间的消息。这有助于在远程数据中心高写负载的情况下降低带宽需求。

③ 由于Observer即使失效也不会影响到投票集群,这样如果数据中心间链路发生故障,不会影响到服务本身的可用性。这种故障的发生概率要远高于一个数据中心中机架间的连接的故障概率,所以不依赖于这种链路是个优点。

三、ZooKeeper集群搭建案例

前面介绍了ZooKeeper集群中的几种角色,接下来给大家来介绍一下如何利用这些角色,来搭建一个性能良好的ZooKeeper集群。我以一个项目为例,给大家分析一下该如何规划我们的ZooKeeper集群。

假设我们的项目需要进行跨机房操作,我们的总部机房设在杭州,但他还要同美国,青岛等多个机房之间进行数据交互。但机房之间的网络延迟都比较大,比如中美机房走海底光缆有ping操作200ms的延迟,杭州和青岛机房有70ms的延迟。 为了提升系统的网络性能,我们在部署ZooKeeper网络时会在每个机房部署节点,多个机房之间再组成一个大的网络,来保证整个ZK集群数据一致性。

根据前面的介绍,最后的部署结构就会是:

(总部) 杭州机房  >=3台 :由Leader/Follower构成的投票集群

(分支) 青岛机房  >=1台 :由Observer构成的ZK集群

(分支) 美国机房  >=1台  : 由Observer构成的ZK集群

图 3.1 ZooKeeper集群部署图

从图中我们可以看出,我们在单个机房内组成一个投票集群,外围的机房都会是一个Observer集群和投票集群进行数据交互。 至于这样部署的一些好处,大家自己根据我前面对ZooKeeper角色的介绍,对比着体会一下,我想这样更能帮助大家理解ZooKeeper。而且针对这 样的部署结构,我们会引入一个优先集群问题: 比如在美国机房的Client,需要优先去访问本机房的ZK集群,访问不到才去访问HZ(总部)机房。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZooKeeper(八)伸缩性 的相关文章

  • 链路追踪Sleuth入门

    前言 在一个大型的分布式项目中存在各种各样的模块调用 每个模块负责不同的功能 组合成系统 在这种架构下的系统 一次请求往往会调用到许许多多的微服务 这样的跨度对于维护也是存在一定的问题 1 如何快速发现问题 2 如何判断故障影响范围 3 如
  • consul学习与常用命令和使用教程

    目录 consul是什么 常用命令 API 实例1 新建服务API 注册服务 查询服务 consul是什么 Consul是分布式的 高可用的 可横向扩展的用于实现分布式系统的服务发现与配置 consul就是提供服务发现的工具 做服务发现的框
  • 五:Zookeeper分布式一致性协议ZAB源码剖析

    目录 ZAB协议介绍 消息广播 崩溃恢复 数据同步 ZAB写数据源码流程图 整个Zookeeper就是一个多节点分布式一致性算法的实现 底层采用的实现协议是ZAB ZAB协议介绍 ZAB 协议全称 Zookeeper Atomic Broa
  • ZooKeeper(八)伸缩性

    一 ZooKeeper中Observer 1 1 ZooKeeper角色 经过前面的介绍 我想大家都已经知道了在ZooKeeper集群当中有两种角色Leader和Follower Leader可以接受client 请求 也接收其他Serve
  • 如何启动单节点zookeeper以及注意事项

    1 安装jdk 因为zookeeper是基于java进行开发的 2 将zookeeper解压之后 再zookeeper目录下conf目录下有一个zoo sample cfg 将它改名成zoo cfg 因为zookeeper启动时自动加载的是
  • 微服务全栈:深入核心组件与开发技巧

    文章目录 1 服务注册与发现 1 1 客户端注册 ZooKeeper 1 2 第三方注册 独立的服务Registrar 1 3 客户端发现 1 4 服务端发现 1 5 Consul 1 6 Eureka 1 7 SmartStack 1 8
  • Kafka常见的导致重复消费原因和解决方案

    点击上方蓝色字体 选择 设为星标 回复 资源 获取更多资源 大数据技术与架构 点击右侧关注 大数据开发领域最强公众号 暴走大数据 点击右侧关注 暴走大数据 问题分析 导致kafka的重复消费问题原因在于 已经消费了数据 但是offset没来
  • Zookeeper和Nacos的区别

    目录 Zookeeper 1 ZK结构 2 ZK的消息广播和崩溃恢复 Nacos 1 存储和数据更新 2 注册中心 Zookeeper 1 ZK结构 Zookeeper的功能主要是通过它的树形节点来实现的 当有节点数据变化时或者说节点过期的
  • 【clickhouse】clickhouse Exception: Table is in readonly mode

    文章目录 1 概述 1 概述 clickhouse报错 Code 242 e displayText DB Exception Table is in readonly mode zookeeper path clickhouse tabl
  • ZooKeeper系统模型之集群间消息通信。

    ZooKeeper的消息类型大体上可以分为四类 分别是 数据同步型 服务器初始化型 请求处理型和会话管理型 数据同步型 数据同步型消息是指在Learner和Leader服务器进行数据同步的时候 网络通信所用到的消息 通常有DIFF TRUN
  • dubbo 项目既是提供方又是消费方,调用不到服务问题

    1 先查看服务提供者有没有注册 这里通过安装eclipse中的zookeeper插件 进行了查看 服务已经注册上了 2 注册上以后 查看调用者有没有在zookeeper中注册 此时通过查看 并没有 3 没有注册上 然后查看是否是配置哪里出了
  • 使用Xshell7控制多台服务同时安装ZK最新版集群服务

    一 环境准备 主机名称 主机IP 节点 集群内通讯端口 选举leader clinet端提供服务 端口 docker0 192 168 1 100 node 0 2888 3888 2181 docker1 192 168 1 101 no
  • 搭建zookeeper集群的时候报: JAVA_HOME is not set and java could not be found in PATH.错误

    我在搭建zookeeper集群的时候总是报 JAVA HOME is not set and java could not be found in PATH 的错误 但是我的java环境是没问题的 这个问题困扰我两天了 终于解决了 在此记录
  • kafka配置内外网访问

    listeners 学名叫监听器 其实就是告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务 advertised listeners 和 listeners 相比多了个 advertised Advertised 的
  • Centos7下安装Zookeeper

    一 配置java环境 1 安装JDK yum install y java 1 8 0 openjdk 2 查看版本 root zookeeper java version openjdk version 1 8 0 362 OpenJDK
  • Nacos、ZooKeeper和Dubbo的区别

    Nacos ZooKeeper和Dubbo是三个不同的分布式系统组件 它们之间有以下几点区别 功能定位 Nacos主要提供服务发现 配置管理和服务治理等功能 而ZooKeeper主要是分布式协调服务 提供了分布式锁 分布式队列等原语 Dub
  • 大数据技术之Zookeeper

    大数据技术之Zookeeper 一 zookeeper特点 二 zookeeper单机模式 三 zookeeper 常用命令 四 查看zookeeper 状态的几种方式 一 zookeeper特点 Zookeeper 文件系统 通知机制 1
  • SpringCloud使用Zookeeper作为服务注册发现中心

    本篇文章主要记录SpringCloud使用Zookeeper作为服务注册发现中心 通过服务提供者和消费者为例 来真正掌握zk注册中心 目录 一 搭建服务提供者 1 创建cloud provider payment8004项目 2 修改配置
  • Zookeeper 和 Dubbo 的关系?

    Zookeeper的作用 zookeeper用来注册服务和进行负载均衡 哪一个服务由哪一个机器来提供必需让调用者知道 简单来说就是ip地址和服务名称的对应关系 当然也可以通过硬编码的方式把这种对应关系在调用方业务代码中实现 但是如果提供服务
  • 终于找到了最新版的Zookeeper入门级教程,建议收藏!

    小熊学Java https javaxiaobear cn 1 分布式一致性 1 CAP 理论 CAP 理论指出对于一个分布式计算系统来说 不可能同时满足以下三点 一致性 在分布式环境中 一致性是指数据在多个副本之间是否能够保持一致的特性

随机推荐

  • 【马士兵】Python基础--08(字典)

    Python基础 08 文章目录 Python基础 08 基础知识 字典的组成及原理 字典的创建方式 字典元素的获取 字典元素的增删改操作 获取字典视图 字典元素的遍历 字典生成式 基础知识 可变序列 目前包括字典 列表 不可变序列 目前包
  • 数电学习笔记

    数电学习笔记 背景 笔记正文 背景 在刚开学那段时间把清华大学阎石老师的 数字电子技术基础 第五版又看了一遍 记了点笔记 刚好实验室的打印机有扫描功能 于是把笔记分享一下 笔记正文 以上
  • jni中如何查看函数签名

    操作步骤 第一步 找到 build 文件夹 第二步 找到 javac 文件夹 第三步 找到自己写的 xxx class文件 第四步 右键 xxx class 文件 在 Terminal 中打开 第五步 执行 javap s xxx clas
  • 飞浆(paddle)实现机器学习

    一 飞浆 paddle 介绍 飞桨是国内唯一功能完备的端到端开源深度学习平台 集深度学习训练和预测框架 模型库 工具组件和服务平台为一体 拥有兼顾灵活性和高性能的开发机制 工业级应用效果的模型 超大规模并行深度学习能力 推理引擎一体化设计以
  • [机缘参悟-88]:什么是平台?国家、公司、家庭、硬件、软件、应用?

    目录 前言 1 什么是平台 1 1 英文是platform 1 2 百度百科 1 3 平台的现实案例 2 平台的特征 2 1 相对性 2 2 层次性 2 3 广泛性 第3章 三大系统 3 1 软硬件系统中的平台 3 2 人类社会的平台 3
  • linux网卡team0,team

    1 安装teamd root web01 yum y install teamd 2 停止NetworkManager什么是NetworkManager呢 NetworkManager服务是管理和监控网络设置的守护进程 CentOS7更加注
  • 直方图均衡化算法、直方图匹配算法 C++ 代码

    这两天一直在研究匀光匀色算法才了解到了直方图匹配算法 想要了解这个算法又要先了解直方图均衡化算法 通过网上查找了很多资料 没有现成C 代码 经过仔细思考和实验后大概复现了该算法 特此记录 以备查阅 参考链接如下 1 匀光匀色 直方图匹配算法
  • Spring扫描类的原理

    作为Java的开发者Spring可以称之为神一样的存在框架 好处太多无法用言语表达只能称之为Java排名的number one 框架 我们使用Spring它帮助我们实例化了很多Bean对象 但是这些Bean是怎样加载到Spring容器中的呢
  • LeetCode:Binary Tree Preorder Traversal(非递归方法前序遍历二叉树)

    Given a binary tree return the preorder traversal of its nodes values For example Given binary tree 1 2 3 1 2 3 return 1
  • clinvar数据库(1)

    遗传变异的数据库注释非常简单 就是从数据库里面下载记录文件 然后根据坐标对应一下即可 甚至很多成熟的工具都可以自动下载数据库以及比对 就跟我们前面讲到的把vcf文件注释到dbSNP数据库的ID一样简单 而clinvar的注释 可以寻找出对应
  • 百度翻译参数逆向过程

    翻译网站sign参数逆向 网址 aHR0cHM6Ly9mYW55aS5iYWlkdS5jb20v JS调试 加密参数sign 使用XHR断点 再查看方法调用栈 很容易定位到加密函数 经测试 原来就是这个b函数进行的加密 参数就是我们要翻译的
  • Python3.8+Pytorch1.0+CUDA11.1环境配置+安装pytorch-geometric

    1 conda创建环境 conda create n gnn python 3 8 2 安装pytorch pip install torch 1 9 0 cu111 torchvision 0 10 0 cu111 torchaudio
  • 国产开源IoTOS:腾讯物联网操作系统TencentOS Tiny的探索与实践

    导语 腾讯物联网终端操作系统 TencentOS tiny 是腾讯面向物联网领域自主研发的嵌入式实时操作系统 可助力物联网终端设备及业务快速接入腾讯云物联网平台 本文是对腾讯高级工程师汪礼超 赵健在云 社区 online 分享的整理 为大家
  • python操作word表格,并修改表格内容

    1 安装win32com client库 pip install pywin32 2 导包 import win32com client 3 总代码 import os import win32com client 创建 Word 应用程序
  • MySQL 在windos安装和遇到问题

    目录 一 安装 1 下载 2 安装MySQL 二 出现问题如下
  • Harvard transformer NLP 模型 openNMT 简介入门

    项目网址 OpenNMT Open Source Neural Machine Translation logo 一 从应用的层面先跑通 Harvard transformer GitHub harvardnlp annotated tra
  • 解决 An attempt was made to call a method that does not exist. 问题详解

    哈喽大家好 我是阿Q 今天在开发代码的过程中 由于手抖 不知道引入了什么包依赖 导致项目启动一直报错 特写本文来记录下解决问题的经过 文章目录 问题描述 报错信息如下 报错描述 解决方法 总结 有想赚点外块 技术交流的朋友 欢迎来撩 问题描
  • POI生成带图片Word

    RequestMapping exportHt public void exportHt RequestParam fid String fid HttpServletResponse response throws Exception i
  • linux移动文件到另一个文件夹命令_Linux 使用 mv 命令重命名或移动文件

    使用方法 split help 用法 mv 选项 T 源 目标 mv 选项 源 目标 mv 选项 t 目标 源 重命名或者移动文件 目录 长选项必须使用的参数对于短选项时也是必需使用的 b 类似 backup 选项 但不接受参数 覆盖前先备
  • ZooKeeper(八)伸缩性

    一 ZooKeeper中Observer 1 1 ZooKeeper角色 经过前面的介绍 我想大家都已经知道了在ZooKeeper集群当中有两种角色Leader和Follower Leader可以接受client 请求 也接收其他Serve