深入浅出zookeeper之一:功能及本质

zookeeper(下文简写为zk)大家都不陌生。但是,看到很多同学对zookeeper的理解过于程式化,有些地方甚至需要背,是大可不必的。把本质理解了,概念性和功能介绍都可以推出来的,而且架构要活学活用,透过现象看本质,才能对技术和技术领悟有大的提升。下面来看下zk的功能及本质。

zookeeper的定义及用途

我们先了解官方的定义。

Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly reliable distributed coordination.

Apache ZooKeeper 是一个致力于开发和维护开源服务器,该服务器实现高可用的分布式协调框架。

ZooKeeper is a high-performance coordination service for distributed applications. It exposes common services - such as naming, configuration management, synchronization, and group services - in a simple interface so you don‘t have to write them from scratch.

zookeeper是一个高性能的分布式应用协调服务框架。它以简单接口形式实现了一系列的通用服务,比如** 命名、配置管理、同步、分组 **等,因此你不必从一堆草稿中去实现他们.

zookeeper的本质功能

通过官方的定义介绍,我们知道了zk是一个server,擅长分布式协调功能。我们来分析下功能的本质实现是怎样的。

zk的数据模型是以znode的形式存储和组织。与标准文件系统类似,是一个树形结构,根节点是‘/‘。

图中每个节点都是一个znode,类似于文件系统中的一个文件,形成了一个树形结构,每个znode内部还可以存储不超过1M的数据。这些znode可以是持久的,还可以是短期的(ephemeral )。
短期的(ephemeral )znode当创建他的客户端session超时,会被zk主动删除。有点类似给文件加锁,进程异常退出后,锁立刻解除。

zk的数据模型类似文件系统,这点也没什么特别的。本质还是kv形式,如果kv的value还要求是kv格式,那么就和zk的数据模型一样。表示成树形的格式,更容易表示层级关系。

zk的特别之处在于:

  1. zk内部的选主和写数据机制。有超过一半的zk集群节点选出来的主节点,成为集群的leader节点,负责主写和同步其他丛属follower节点。底层用的ZAB(ZooKeeper Atomic Broadcast)协议。
  2. 短期的(ephemeral )znode功能。方便实现锁类操作,在分布式中处理超时状态。
  3. 客户端可以设置监控watch某个znode的功能,当znode发生变化(版本号变更)时,会主动通知watch的客户端有变化了。该功能让客户端不必轮询,能够有序地知道znode变更顺序。

命名、配置管理、同步、分组等功能,都是通过1、2两点结合实现的。我们自研的业务如果想实现,也都能想到,或者用类似方式实现。

zk内部的选主和写数据机制。就不那么容易想了,只能依靠论文实现。所以这点更要好好学习下,这种方法很有特点,并且不容易想出来,也不容易理解。

与已有自研业务的区别

自研业务中,实现zk功能的,比较像的是配置中心(下文简称cc)。

一般实现cc,采用一主多从,主节点负责写,从节点只读。主节点通过binlog同步从节点,保证最终一致性。

主节点有两个写数据途径:

1、通过管理台的配置中心更新配置表;

2、通过客户端api上报服务状态,更新客户端节点负载和健康状况。

3、把心跳和变更回包作为一个协议,通知客户端配置更新。

如果从节点死机,不影响集群服务,对应的客户端寻找新的从节点去读。
如果主节点死机,cc只提供读服务,要人工来恢复。

影响:故障期间不能新增或修改配置以及配置项的负载。

如果用zk来实现cc,在正常情况下运行方式和cc是一样的。但是当主死机后,会用算法重新选出主,对客户端透明。让主节点死机停写的概率降低。但是如果有一半的节点死掉,会造成整个zk集群不可用。

对比:
| | 自研cc | zk |
|--------|--------|--------|
|选主方式|人工配置,主死了集群只读,人工介入恢复|集群协商选主,自恢复后继续服务
|集群完全不可用条件|所有节点都死掉|一半节点死掉(可能有分区问题造成zk内部同步有问题,但是节点是可以服务的)

zk的选主方式,并没有完胜一主多从的所有场景。

  1. 算法比较复杂,不容易理解和实现。
  2. 某些重要任务,出现主写问题,为了一致性,要人工介入恢复,自动选新主切换会造成数据丢失。
  3. 对于业务特定的场景特点,做一些弥补方案,能降低单点主写的风险。例如搭建多套cc,并行写,都对外提供服务,因为配置节点健康和负载的少量不一致,对业务来说是可以接受的。还可以在业务中增加缓存,保证主死了能够有足够的时间恢复。

以上自研业务没有引入ZAB或paxos协议的原因。在出现zk之后,想用的业务可以直接在zk之上构建集群内节点选主功能。

注意事项

我们在zk上构建服务的时候,要注意zk死一半节点就全集群死掉的特点。要考虑到如果zk集群不服务,业务有备选方案,能够对外尽力服务。例如zk充当配置中心,client要设置缓存,或默认配置。

为了节约资源,zk集群必须是奇数台机器。但是zk的机器数变多,对性能会有较大影响。写数据同步和选主都会变得越来越慢。

解决方法:

  1. 读多写少:增加观察者节点来扩展读性能。观察者节点不参与主从节点的协商和选举,只负责同步主节点。
  2. 读少写多:根据业务特点划分set,做到平行扩展。

总结

zookeeper通过ZAB协议实现了集群内部选主和写同步功能,提高了服务的健壮性,和写操作的有序性。是实现的难点,背后有严密的数学理论推理。

通过实现,短期的(ephemeral )znode和主动通知节点变更消息的功能,客户端能够及时知道监听节点变化,在客户端和zk断开连接后,也能够自动释放节点。轻松地实现锁类服务和监听更新类需求。这些是实现名字服务、配置管理、同步、分组等服务的基础。



转载请注明来源:深入浅出zookeeper之一:功能及本质
本文链接地址:https://www.owenzhang.net/blog/121.html

原文地址:https://www.cnblogs.com/owenandhisfriends/p/9545207.html

时间: 2024-08-08 07:10:37

深入浅出zookeeper之一:功能及本质的相关文章

Zookeeper的功能以及工作原理(转)

Zookeeper的功能以及工作原理 1.ZooKeeper是什么?ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作.最终,将简单易用的接口和性能高效.功能稳定的系统提供给用户 2.ZooKeeper提供了什么? 1)文件系统 2)通知机制 3.Zookeeper文件系统 每个子目录项如 NameService 都被称作为znode,和文件系统一样,我们

Zookeeper的功能以及工作原理

1 Zookeeper的基本概念 1.1 角色 Zookeeper中的角色主要有以下三类,如下表所示: 系统模型如图所示: 1.2 设计目的 1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能. 2 .可靠性:具有简单.健壮.良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受. 3 .实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息.但由于网络延时等原因,Zook

深入浅出Zookeeper

能找到的一些zookeeper的资料一上来不是扯一通paxos算法就是一大坨一大坨的代码.很多人对zookeeper更多的是听过,所以这一篇文章就尝试用尽可能用精简的语言科普zookeeper. zookeeper是什么 网上的定义:zookeeper作为一个开源的分布式应用协调系统,作为一个正常人我看完这句话之后是——懵逼.理解一个工具最好的办法是问它解决什么问题的,举个例子: 微服务中每个服务是可以被单独部署的,为了便于Client调用,所有服务都必须在注册中心完成注册.这样Client就可

深入浅出话VC++——MFC的本质

本文为转载,为阅读方便,部分内容作出修改. 一.引言 在实际开发中,我们大多数都是使用已有的类库来开发Windows应用程序. MFC(Microsoft Foundation Class, 微软基础类库)是微软为了简化程序员的开发工作而将Windows API 封装到C++类中,利用这些类,程序员可以有效地完成Windows平台下应用程序的开发.本专题将详细剖析它. 二.利用向导创建一个MFC程序 用于帮助有效地开发Windows应用程序的类库除了MFC外,还有其他开源类库提供,比如说QT,只

zookeeper基本概念和功能

2019/2/19 星期二 zookeeper基本概念和功能 zookeeper是hadoop生态圈里面重要的底层的框架,主要为上层的框架提供分布式协调服务的. hadoop-spof 问题及HA 解决思路引入集群协调服务框架的必要性 zookeeper 简介ZooKeeper 是一个分布式应用程序协调服务,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.目前zookeeper 被广泛应用于hadoop 生态体系中各种框架的分布式协调,我们也可以利用zookeeper 来简化分布式应

深入浅出RPC——浅出篇(转载)

本文转载自这里是原文 近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 RPC 在其中扮演着关键的作用. 在平时的日常开发中我们都在隐式或显式的使用 RPC,一些刚入行的程序员会感觉 RPC 比较神秘,而一些有多年使用 RPC 经验的程序员虽然使用经验丰富,但有些对其原理也不甚了了. 缺乏对原理层面的理解,往往也会造成开发中的一些误用. 本文分上下两篇<浅出篇>和<深入篇>,其目标就是想尝试深入浅出的分析下 RPC 本质,我总是这么认为理解了本质才能更好的

深入浅出 RPC - 浅出篇

近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 RPC 在其中扮演着关键的作用.在平时的日常开发中我们都在隐式或显式的使用 RPC,一些刚入行的程序员会感觉 RPC 比较神秘,而一些有多年使用 RPC 经验的程序员虽然使用经验丰富,但有些对其原理也不甚了了.缺乏对原理层面的理解,往往也会造成开发中的一些误用. 本文分上下两篇<浅出篇>和<深入篇>,其目标就是想尝试深入浅出的分析下 RPC 本质,我总是这么认为理解了本质才能更好的应用. RPC 是什么?

[转帖]Zookeeper学习系列【一】 教会你Zookeeper的一些基础概念

Zookeeper学习系列[一] 教会你Zookeeper的一些基础概念 https://segmentfault.com/a/1190000018927058 前言 最近加入了部门的技术兴趣小组,被分配了Zookeeper的研究任务.在研究过程当中,发现Zookeeper由于其开源的特性和其卓越的性能特点,在业界使用广泛,有很多的应用场景,而这些不同的应用场景实际上底层的原理都是差不多的,只要你真正理解了Zookeeper的一些基础概念和机制,就能够触类旁通. 于是乎,在第一次和项目小组内成员

Zookeeper学习系列【一】 教会你Zookeeper的一些基础概念

前言 最近加入了部门的技术兴趣小组,被分配了Zookeeper的研究任务.在研究过程当中,发现Zookeeper由于其开源的特性和其卓越的性能特点,在业界使用广泛,有很多的应用场景,而这些不同的应用场景实际上底层的原理都是差不多的,只要你真正理解了Zookeeper的一些基础概念和机制,就能够触类旁通. 于是乎,在第一次和项目小组内成员分享过Zookeeper作为服务注册中心的原理和客户端demo演示之后,我萌生出了整理一个专题的想法,以此为起点,慢慢捡起自己的博客分享之路. 本篇的内容主要介绍