Zookeeper和etcd比较

zookeeper:

zookeeper是基于paxos的简化版zab,我觉得确实很难理解?,以前看了好多遍《从paxos到zookeper》才感觉似懂非懂了,然而过了几个月发现又一脸蒙蔽了,在这里在整理一下(仅表示我自己的理解)

ZAB协议中存在着三种状态,每个节点都属于以下三种中的一种:

1. Looking :系统刚启动时或者Leader崩溃后正处于选举状态

2. Following :Follower节点所处的状态,Follower与Leader处于数据同步阶段;

3. Leading :Leader所处状态,当前集群中有一个Leader为主进程;

在开始时,所有的节点都是looking状态并且每个节点都希望自己能成为leader节点,所有每个节点都会向集群中发送一个提案内容是选取自己作为leader节点,提案编号是ZXID

(ZAB协议中使用ZXID作为事务编号,ZXID为64位数字,低32位为一个递增的计数器,每一个客户端的一个事务请求时Leader产生新的事务后该计数器都会加1,高32位为Leader周期epoch编号,当新选举出一个Leader节点时Leader会取出本地日志中最大事务Proposal的ZXID解析出对应的epoch把该值加1作为新的epoch,将低32位从0开始生成新的ZXID;ZAB使用epoch来区分不同的Leader周期),如果得到的提案的zxid比自己的大则说明发出这个题案的节点数据更新,则进行同意的投票,否则继续投自己,先得到多数的同意的节点当选为leader

现在leader就可以进行管理了,zookeeper也是两段提交的实现,客户端提交事务请求时Leader节点为每一个请求生成一个事务Proposal,将其发送给集群中所有的Follower节点,收到过半Follower的反馈后开始对事务进行提交,ZAB协议使用了原子广播协议

Leader节点为每一个Follower节点分配一个队列按事务ZXID顺序放入到队列中,且根据队列的规则FIFO来进行事务的发送。Follower节点收到事务Proposal后会将该事务以事务日志方式写入到本地磁盘中,成功后反馈Ack消息给Leader节点,Leader在接收到过半Follower节点的Ack反馈后就会进行事务的提交,以此同时向所有的Follower节点广播Commit消息,Follower节点收到Commit后开始对事务进行提交;?

如果leader宕机,则集群进入恢复阶段,根据上面的方式选举出ZXID最大的节点当选leader,并进入恢复阶段,所有的follewer都会将自己的ZXID发送个leader,由leader根据follower的ZXID与自己的相差的阶段数采取不同的措施实现整个集群的数据同步(若相差较小,则使用Leader发送从Follolwer.lastZXID到Leader.lastZXID议案的DIFF指令给Follower同步数据,若相差较大则直接发送leader的快照给follower)?

etcd

etcd作为最近很火的一个高可用性?键值对服务发现系统被Kubernetes等系统广泛使用

他相比与zookeeper来说更加简单,在面对较小集群时可能会效率更高些?,而且他的编写语言Go本身就是一种多线程编程语言,确实有很大吸引人的地方(虽然我不懂Go语言,但是在学习docker时也是一睹其风采了)

在Raft中,任何时候一个服务器可以扮演下面角色之一:

Leader: 处理所有客户端交互,日志复制等,一般一次只有一个Leader.

Follower: 类似选民,完全被动
Candidate候选人: 类似Proposer律师,可以被选为一个新的领导人。

1.leader选举阶段

和zookeeper一样 刚刚开始所有节点都会希望选取自己作为leader,但是不一样的是etcd却简单的多,他维持一个计时器,当这个计时器过时还没有leader发来心跳信息或者候选人发来的投票信息,就当自动成为选民向其他节点发送选取自己为leader的请求,若收到多数派的投票就当选 ,如果很不凑巧,有两个节点同时发起并且获得的投票数相同,那么过三百毫秒后两个节点再次进行争夺,这次相同投票数的概率就十分低,实在不行再来一次

2.消息同步阶段

假设Leader领导人已经选出,在leader接受到?消息请求,这时leader增加一个日志的要求,比如日志是"GO":

2. Leader要求Followe遵从他的指令,都将这个新的日志内容追加到他们各自日志中:

3.大多数follower服务器将日志写入磁盘文件后,确认追加成功,发出Commited Ok:

4. 在下一个心跳heartbeat中,Leader会通知所有Follwer更新commited 项目。

对于每个新的日志记录,重复上述过程。

3.网络分区问题

如果在这一过程中,发生了网络分区或者网络通信故障,使得Leader不能访问大多数Follwers了,那么Leader只能正常更新它能访问的那些Follower服务器,而大多数的服务器Follower因为没有了Leader,他们重新选举一个候选者作为Leader,然后这个Leader作为代表于外界打交道,如果外界要求其添加新的日志,这个新的Leader就按上述步骤通知大多数Followers,如果这时网络故障修复了,那么原先的Leader就变成Follower,在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的更新。?

说了这么多?------------------动画!!!!!!

看完瞬间开朗啊,不知道是哪位大神做的~?

http://thesecretlivesofdata.com/raft/

时间: 2024-12-10 09:41:26

Zookeeper和etcd比较的相关文章

Zookeeper vs. etcd

etcd是go语言实现的. 对比,可以参考这篇文章: http://studygolang.com/articles/4837 <服务发现:Zookeeper vs etcd vs Consul> etcd是一个数据库,它的目标是构建一个高可用的分布式键值数据库,它是基于GO语言实现.在分布式系统中,各种服务的配置信息的管理分享,服务的发现是一个很基本同时也是很重要的问题.CoreOS项目就希望基于etcd来解决这一问题. http://blog.csdn.net/shanyongxu/art

服务发现:Zookeeper vs etcd vs Consul

摘自:http://dockone.io/article/667 [编者的话]本文对比了Zookeeper.etcd和Consul三种服务发现工具,探讨了最佳的服务发现解决方案,仅供参考. 如果使用预定义的端口,服务越多,发生冲突的可能性越大,毕竟,不可能有两个服务监听同一个端口.管理一个拥挤的比方说被几百个服务所使用的所有端口的列表,本身就是一个挑战,添加到该列表后,这些服务需要的数据库和数量会日益增多.因此我们应该部署无需指定端口的服务,并且让Docker为我们分配一个随机的端口.唯一的问题

服务发现框架选型,Consul还是Zookeeper还是etcd

本文并不介绍服务发现的基本原理.除了一致性算法之外,其他并没有太多高深的算法,网上的资料很容易让大家明白上面是服务发现. 想直接查看结论的同学,请直接跳到文末. 目前,市面上有非常多的服务发现工具,<Open-Source Service Discovery>一文中列举了如下开源的服务发现工具.(http://jasonwilder.com/blog/2014/02/04/service-discovery-in-the-cloud/) 上面表格中,前三个是通用的,后面都是各大公司自己造的轮子

服务发现比较:Consul vs Zookeeper vs Etcd vs Eureka

这里就平时经常用到的服务发现的产品进行下特性的对比,首先看下结论: Feature Consul zookeeper etcd euerka 服务健康检查 服务状态,内存,硬盘等 (弱)长连接,keepalive 连接心跳 可配支持 多数据中心 支持 — — — kv存储服务 支持 支持 支持 — 一致性 raft paxos raft — cap ca cp cp ap 使用接口(多语言能力) 支持http和dns 客户端 http/grpc http(sidecar) watch支持 全量/

服务注册选型比较:Consul vs Zookeeper vs Etcd vs Eureka

zookeeper基于paxos的化简版zab,etcd基于raft算法.consul也是基于raft算法.etcd和consul作为后起之秀,并没有因为已经有了zookeeper而放弃自己,而是采用更为直接的raft算法. 原文  http://luyiisme.github.io/2017/04/22/spring-cloud-service-discovery-products/ 主题 ConsuletcdZooKeeper 这里就平时经常用到的服务发现的产品进行下特性的对比,首先看下结论

常用的服务发现对比(Consul、zookeeper、etcd、eureka)

这里就平时经常用到的服务发现的产品进行下特性的对比,首先看下结论:   Feature Consul Zookeeper Etcd Eureka 服务健康检查  服务状态,内存,硬盘等  (弱)长连接,keepalive  连接心跳  可配支持 多数据中心  支持  -  -  - kv存储服务  支持  支持  支持  - 一致性  raft  paxos  raft  - CAP定理  CA  CP  CP  AP 使用接口(多语言能力)  支持http和dns  客户端  http/grp

Etcd和ZooKeeper,究竟谁在watch的功能表现更好?

ZooKeeper和Etcd的主要异同可以参考这篇文章,此外,Etcd的官网上也有对比表格(https://coreos.com/etcd/docs/latest/learning/why.html),本文不加赘述. 本文主要关注这两者在watch上的功能差异.ZooKeeper和Etcd都可以对某个key进行watch,并在当这个key发生改变(比如有更新值,或删除key的操作发生)时触发. ZooKeeper的watch ZooKeeper的watch功能可参考其官网文档 但是光看文档不足以

etcd 快速入门

一.认识etcd 1.1 etcd 概念 从哪里说起呢?官网第一个页面,有那么一句话: "A distributed, reliable key-value store for the most critical data of a distributed system" 即 etcd 是一个分布式.可靠 key-value 存储的分布式系统.当然,它不仅仅用于存储,还提供共享配置及服务发现. 1.2 etcd vs Zookeeper 提供配置共享和服务发现的系统比较多,其中最为大家

Redis 应用进阶

Redis 基础应用(二) ============================================================================== 概述: 安全相关的配置: 事务功能: connection(连接)及Server 相关的命令 发布与订阅(publish/subscribe) Redis的持久化 Redis的主从复制 Redis的sentinel机制 Redis的Clustering机制 ============================