百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

ZooKeeper vs. Etcd3(zookeeper /etc/profile)

cac55 2024-10-20 04:21 12 浏览 0 评论

背景

随着微服务架构盛行,也面临着分布式环境当中多个进程之间的同步控制问题, 目前常见的分布式协调方案有Apache ZooKeeperetcdconsul Hazelcast,尽管这些系统中有些不是直接的分布式协调系统,但是它们提供了有效的协调方案。在分布式协调中有两个极为出色的系统:Apache ZooKeeper etcdZooKeeper 源于 Hadoop 生态系统,被广泛应用到各大系统中,而 etcd 则是 Google Kubernetes 使用的分布式协调方案,接下来将围绕着这两个系统展开介绍。



Apache ZooKeeper

介绍

ZooKeeper 最初是 Hadoop 的一个子项目,并发展成为 Apache Software Foundation 的顶级项目。目前,大多数 Apache 项目都在使用它,包括 HadoopKafkaSolr 等等。由于其良好的跟踪记录和稳定性,ZooKeeper 已成为世界上顶级的分布式协调系统之一。


应用场景

消息发布与订阅:数据发布/订阅的一个常见的场景是配置中心,发布者把数据发布到 ZooKeeper 的一个或一系列的节点上,供订阅者进行数据订阅,达到动态获取数据的目的

负载均衡:首先建立 Servers 节点,在每个服务器启动时,在 Servers 节点下建立临时子节点 Worker Server,并在该子节点下存入服务器的相关信息(IP,端口等等),在每个请求过来时从 ZooKeeper 服务器中获取当前集群服务器列表,根据自定义负载均衡算法选出其中一个服务器来处理请求,以达到负载均衡的目的

命名服务:命名服务就是提供名称的服务。ZooKeeper 的命名服务有两个应用方面,第一,提供类 JNDI 功能,可以把系统中各种服务的名称、地址以及目录信息存放在 Zookeeper,需要的时候去 ZooKeeper 中读取,第二,制作分布式的序列号生成器

分布式通知与协调:基于其临时节点的特性,不同机器在 ZooKeeper 的一个指定节点下创建临时子节点,不同机器之间可以根据这个临时节点来判断客户端机器是否存活

分布式锁:分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,一般需要通过一些互斥的手段来防止彼此之间的干扰,以保证一致性


数据模型

Zookeeper的数据模型是树结构,在内存数据库中,存储了整棵树的内容,包括所有的节点路径、节点数据、ACL信息,Zookeeper会定时将这个数据存储到磁盘上。

模型

描述

DataTree

DataTree是内存数据存储的核心,是一个树结构,代表了内存中一份完整的数据。DataTree不包含任何与网络、客户端连接及请求处理相关的业务逻辑,是一个独立的组件

DataNode

DataNode是数据存储的最小单元,其内部除了保存了结点的数据内容、ACL列表、节点状态之外,还记录了父节点的引用和子节点列表两个属性,其也提供了对子节点列表进行操作的接口

ZKDatabase

Zookeeper的内存数据库,管理Zookeeper的所有会话、DataTree存储和事务日志。ZKDatabase会定时向磁盘dump快照数据,同时在Zookeeper启动时,会通过磁盘的事务日志和快照文件恢复成一个完整的内存数据库

分布式集群

ZooKeeper 使用采用Paxos 强一致性算法实现分布式集群。为了实现高可用性,ZooKeeper 在一个集合中运行——也就是说,一组节点共同运行 ZooKeeper 工作以提供其分布式特性。这组节点被称为 ZooKeeper 集合体。一个 ZooKeeper 集合体应该总是包含奇数个节点。运行时,这些节点首先相互通信并选举一个 leader,这就是为什么 ZooKeeper 需要在奇数个节点的集合中运行。之后,其他节点被称为 Followers,而选出的节点被称为 Leader。现在连接到 ZooKeeper 的客户端可以连接到任何一个节点。客户端读取请求可以由任何节点处理,但写入请求只能由 Leader 来负责。因此,向 ZooKeeper 集合体添加更多节点将提高读取速度,但不会提高写入速度。



性能

zookeeper原本不是为高可用性设计的,选举过程速度很慢,zookeeper的选举流程通常耗时30到120秒,期间zookeeper由于没有master,都是不可用的,zookeeper的性能是有限的,典型的zookeeper的tps大概是一万多,无法覆盖系统内部每天动辄几十亿次的调用。因此每次请求都去zookeeper获取业务系统master信息是不可能的


优缺

优点

缺点

●非阻塞完整快照(保证最终一致性)。

●高效的内存管理。

●可靠(已经存在了很长时间)。

●简化的 API。

●自动 ZooKeeper 连接管理与重试。

●完整的,经过充分测试的 ZooKeeper recipes 实现。

●一个可以更容易地编写新的 ZooKeeper Recipes 的框架。

●通过 ZooKeeper watches 支持事件。

●在网络分区中,少数和多数分区都将进行 leader 选举。因此,少数分区将停止运行。

●由于 ZooKeeper 是用 Java 编写的,它继承了 Java 的一些缺点(即垃圾收集导致暂停)。

●创建快照时(将数据写入磁盘),ZooKeeper 读取/写入操作暂时中止。只有我们启用了快照才会发生这种情况。否则,ZooKeeper 将作为内存中的分布式存储运行。

●对于每个新的 watch 请求,ZooKeeper 都会打开一个新的 socket 连接。这使得 ZooKeeper 更加复杂,因为它必须实时管理大量打开的 socket 连接。




ETCD

介绍

etcd 是用 Go 编写的 一个高可用强一致性的键值仓库,在很多分布式系统架构中得到了广泛的应用,其最经典的使用场景就是服务发现。我们将讨论最新版本的etcd(etcd v3),与之前的etcd v2相比,它有很大的变化。


应用场景

服务发现:服务发现(Service Discovery)要解决的是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接。从本质上说,服务发现就是想要了解集群中是否有进程在监听udp或tcp端口,并且通过名字就可以进行查找和连接。

消息发布与订阅:在分布式系统中,最为适用的组件间通信方式是消息发布与订阅机制。具体而言,即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦相关主题有消息发布,就会实时通知订阅者。通过这种方式可以实现分布式系统配置的集中式管理与实时动态更新

负载均衡:在分布式系统中,为了保证服务的高可用以及数据的一致性,通常都会把数据和服务部署多份,以此达到对等服务,即使其中的某一个服务失效了,也不影响使用。这样的实现虽然会导致一定程度上数据写入性能的下降,但是却能实现数据访问时的负载均衡。因为每个对等服务节点上都存有完整的数据,所以用户的访问流量就可以分流到不同的机器上

分布式通知与协调:这里讨论的分布式通知与协调,与消息发布和订阅有些相似。两者都使用了etcd中的Watcher机制,通过注册与异步通知机制,实现分布式环境下不同系统之间的通知与协调,从而对数据变更进行实时处理。实现方式通常为:不同系统都在etcd上对同一个目录进行注册,同时设置Watcher监控该目录的变化(如果对子目录的变化也有需要,可以设置成递归模式),当某个系统更新了etcd的目录,那么设置了Watcher的系统就会收到通知,并作出相应处理

分布式锁:因为etcd使用Raft算法保持了数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现分布式锁。锁服务有两种使用方式,一是保持独占,二是控制时序。


数据模型

etcd 设计用于可靠存储不频繁更新的数据,并提供可靠的观察查询,ectd 使用多版本持久化键值存储来存储数据。当键值对的值被新的数据替代时,持久化键值存储保存先前版本的键值对。键值存储事实上是不可变的;它的操作不会就地更新结构,替代的是总是生成一个新的更新后的结构。为了缓解压力,etcd会定期进行压缩,清理过旧的数据。存储的逻辑视图是一个扁平的二进制键空间。键空间有一个在 byte string 键上的语义排序的索引,因此范围查询不是太昂贵。ETCD采用B树索引加速查询,存储的状态的每个修订版本仅仅包含和它的前一个修订版本的增量以求高效。单个修订版本可能对应到 tree 上的多个 key。在查询时,先在内存索引中通过用户指定的Key值,查找到该Key值对应的全部版本号,然后根据用户指定的版本号,从底层存储中查找到具体的Value值。在etcd v3版本中,底层存储使用的是BoltDB,其中的Key是版本信息(main revision+subrevision)。这样,在查询时先通过上述B树索引查询到对应的版本信息,然后在BoltDB中通过版本信息查找相应的Value值

分布式集群

ETCD 采用 raft 一致性算法,基于 Go 语言实现。etcd作为一个高可用键值存储系统,天生就是为集群化而设计的。由于Raft算法在做决策时需要多数节点的投票,所以etcd一般部署集群推荐奇数个节点,推荐的数量为3、5或者7个节点构成一个集群,Raft算法将Server分为三种类型:Leader、Follower和Candidate。Leader处理所有的查询和事务,并向Follower同步事务。Follower会将所有的RPC查询和事务转发给Leader处理,它仅从Leader接受事务的同步。数据的一致性以Leader中的数据为准实现。在节点初始启动时,节点的Raft状态机将处于Follower状态等待来来自Leader节点的心跳。如果在一定时间周期内没有收到Leader节点的心跳,节点将发起选举。Follower节点选举时会将自己的状态切换为Candidate,然后向集群中其它Follower节点发送请求,询问其是否选举自己成为Leader。当收到来自集群中过半数节点的接受投票后,节点即成为Leader,开始接收Client的事务处理和查询并向其它的Follower节点同步事务。Leader节点会定时向Follower发送心跳来保持其地位。众所周知的 Google 的容器编排平台 Kubernetes 使用 etcd v2 作为分布式存储来获取其 master 组件的分布式锁。这是 etcd 功能强大的一个例子。


性能

etcd 提供稳定的,持续的高性能。两个定义性能的因素:延迟(latency)和吞吐量(throughput)。延迟是完成操作的时间。吞吐量是在某个时间期间之内完成操作的总数量。当 etcd 接收并发客户端请求时,通常平均延迟随着总体吞吐量增加而增加。在通常的云环境,比如 Google Compute Engine (GCE) 标准的 n-4 或者 AWS 上相当的机器类型,一个三成员 etcd 集群在轻负载下可以在低于1毫秒内完成一个请求,并在重负载下可以每秒完成超过 30000 个请求。

优缺

优点

缺点

●创建快照时用增量快照避免了暂停,这在 ZooKeeper 中是个问题。

●由于使用堆外存储,所以没有垃圾回收导致的暂停。

●Watches 被重新设计,将旧的事件模型替换为在关键时间间隔内持久监听和事件复用的模型。因此,不会为每个 watch 分配一个 socket 连接。它在相同的连接上复用事件。

●与 ZooKeeper 不同,etcd 可以使用当前的 watch 持续监听。一旦 watch 被触发,就不需要设置一个新的 watch。

●etcd3 拥有一个滑动窗口来保留旧事件,以便断开连接不会导致所有事件丢失

●请注意,如果客户端超时或者客户端与 etcd 成员之间出现网络中断,客户端的运行状态可能不确定。当有 leader 选举时,etcd 也可能会中断运行。在此事件中,etcd 不会发送终止响应给客户端的未决请求。

●网络分区时,如果 leader 在少数分区中,序列化的读取请求仍然可以处理。




总结

etcd 实现的这些功能,ZooKeeper 都能实现。那么为什么要用 etcd 而非直接使用 ZooKeeper 呢?


Zookeeper缺点:

1. 复杂:ZooKeeper 的部署维护复杂,管理员需要掌握一系列的知识和技能;而 Paxos 强一致性算法也是素来以复杂难懂而闻名于世;另外,ZooKeeper 的使用也比较复杂,需要安装客户端,官方只提供了 Java 和 C 两种语言的接口。和Raft算法相比,有点过度设计了,解决的是一个标准的拜占庭问题,不仅仅可以处理节点故障问题,还可以防止节点作弊。代价是消息交互的次数大大增加

2. java 编写:这里不是对 Java 有偏见,而是 Java 本身就偏向于重型应用,它会引入大量的依赖。而运维人员则普遍希望保持强一致、高可用的机器集群尽可能简单,维护起来也不易出错。

3. 发展缓慢:Apache 基金会项目特有的“Apache Way”在开源界饱受争议,其中一大原因就是由于基金会庞大的结构以及松散的管理导致项目发展缓慢。

Etcd3优点:

1. 简单:使用 Go 语言编写部署简单;使用 HTTP 作为接口使用简单;使用 Raft 算法保证强一致性让用户易于理解。

2. 数据持久化:etcd 默认数据一更新就进行持久化。

3. 安全:etcd 支持 SSL 客户端安全认证。

最后,etcd 作为一个年轻的项目,真正告诉迭代和开发中,这既是一个优点,也是一个缺点。优点是它的未来具有无限的可能性,缺点是无法得到大项目长时间使用的检验。然而,目前 CoreOS、Kubernetes 和 CloudFoundry 等知名项目均在生产环境中使用了 etcd,所以总的来说,etcd 值得你去尝试。




推荐阅读

更多内容查看公众号,请关注同名公众号

ZooKeeper vs. Etcd3

Java vs. Python

Redis vs. Memcached

相关推荐

MIRIX重塑AI记忆:超Gemini 410%,节省99.9%内存,APP同步上线

MIRIX,一个由UCSD和NYU团队主导的新系统,正在重新定义AI的记忆格局。在过去的十年里,我们见证了大型语言模型席卷全球,从写作助手到代码生成器,无所不能。然而,即使最强大的模型依...

硬盘坏了怎么把数据弄出来对比10种硬盘数据恢复软件

机械硬盘或固态硬盘损坏导致数据丢失时,应立即停止对硬盘的读写操作,并根据损坏类型选择逻辑层恢复工具或专业物理恢复服务。紧急处置措施立即停止通电使用:发现硬盘异响、无法识别或数据异常时,需立即断开连接,...

蓝宝石B850A WIFI主板新玩法:内存小参调节体验

蓝宝石前段时间发布了一款性价比极高的主板:NITRO氮动B850AWIFI主板。这款主板的售价只要1349元,相比普遍1500元以上的B850主板,确实极具竞争力。虽然价格实惠,蓝宝石NITR...

内存卡损坏读不出怎么修复?这5个数据恢复工具汇总,3秒挽回!

在数字化生活的浪潮中,内存卡凭借小巧便携与大容量存储的特性,成为相机、手机、行车记录仪等设备存储数据的得力助手,承载着无数珍贵回忆与重要文件。然而,当内存卡突然损坏无法读取,无论是误删、格式化、病毒入...

内存卡修复不再难,2025年必学的6款软件工具

内存卡出现问题时,通常是因为文件系统损坏、物理损坏或病毒感染。通过专业的修复工具,我们可以尝试恢复数据并修复内存卡。内存卡修复利器:万兴恢复专家万兴恢复专家是一款功能强大的数据恢复软件,支持多种设备和...

有5款内存卡修复工具汇总,内存卡数据轻松找回!

在如今的数字时代,内存卡作为不可或缺的存储介质,广泛应用于相机、手机、行车记录仪等各类设备中,承载着我们珍贵的照片、视频以及重要文件。然而,数据丢失的风险却如影随形,误删、格式化、病毒入侵、硬件故障等...

揭秘:如何通过多种方式精准查询内存条型号及规避风险?

以下是内存条型号查询的常用方法及注意事项,综合了物理查看、软件检测、编码解析等多种方式:一、物理标签查看法1.拆机查看标签打开电脑主机/笔记本后盖找到内存条,观察标签上的型号标识。例如内存标签通常标...

内存卡数据恢复5个工具汇总推荐,轻松找回珍贵记忆!

在这个数字化时代,内存卡作为我们存储珍贵照片、重要文件的常用载体,广泛应用于手机、相机、平板电脑等设备。但数据丢失的意外却常常不期而至,误删除、格式化、病毒攻击,甚至内存卡的物理损坏,都可能让辛苦保存...

电脑内存智能监控清理,优化性能的实用软件

软件介绍Memorycleaner是一款内存清理软件。功能很强,效果很不错。Memorycleaner会在内存用量超出80%时,自动执行“裁剪进程工作集”“清理系统缓存”以及“用全部可能的方法清理...

TechPowerUp MemTest64:内存稳定性测试利器

TechPowerUpMemTest64:内存稳定性测试利器一、软件简介TechPowerUpMemTest64,由知名硬件信息工具GPU-Z的出品公司TechPowerUp发布,是一款专为64位...

微软推出AI恶意软件检测智能体Project Ire,精确度高达98%

IT之家8月6日消息,当地时间周二,微软宣布推出可自主分析恶意软件的AI检测系统原型——ProjectIre。该项目由微软研究院、Defender研究团队及Discovery&a...

农村老木匠常用的20种老工具,手艺人靠它养活一家人,你认识几种

生活中的手艺老匠人是非常受到尊敬和崇拜的,特别是在农村曾经的老匠人都是家里的“座上宾”。对于民间传统的手艺人,有一种说法就是传统的八大匠:木匠、泥匠、篾匠、铁匠、船匠、石匠、油匠和剃头匠。木匠的祖始爷...

恶意木马新变种伪装成聊天工具诱人点击

国家计算机病毒应急处理中心通过对互联网监测发现,近期出现一种恶意木马程序变种Trojan_FakeQQ.CTU。该变种通过伪装成即时聊天工具,诱使计算机用户点击运行。该变种运行后,将其自身复制到受感染...

学习网络安全 这些工具你知道吗?

工欲善其事必先利其器,在新入门网络安全的小伙伴而言。这些工具你必须要有所了解。本文我们简单说说这些网络安全工具吧!Web安全类web类工具主要是通过各种扫描工具,发现web站点存在的各种漏洞...

5分钟盗走你的隐私照片,这个全球性漏洞到底有多可怕?

这个时代,大家对电脑出现漏洞,可能已经习以为常。但如果机哥告诉大家,这个漏洞能够在5分钟内,破解并盗取你所有加密文件,而且还无法通过软件和补丁修复...这可就有点吓人啦。事情是酱婶的。来自荷兰埃因...

取消回复欢迎 发表评论: