当前位置: 首页 > 科技观察

如何选择ETCDvs.Consul和zooKeeper

时间:2023-03-16 01:01:16 科技观察

etcdvs.Prefacevs.Consul和ZooKeeper。选择etcd有什么好处?基本架构及原理etcdETCD是一个分布式、可靠的key-value存储分布式系统,用于在分布式系统中存储关键数据;当然,它不仅用于存储,还提供配置共享和服务发现;基于Go语言实现。etcd的特点全复制:集群中的每个节点都可以使用一个完整的存档高可用性:etcd可用于避免硬件或网络问题的单点故障一致性:每次读取都返回跨多个主机的最新写入简单:包括一个井-defined,user-facingAPI(gRPC)Secure:通过可选的客户端证书认证实现自动化TLSReliable:使用Raft算法实现强一致性、高可用的服务存储目录etcd是基于raft算法实现的。具体实现可以参考raft源码解读之etcd实现。Consul先放一张consul架构图。Consul使用Gossip协议。Gossip的中文名称是GossipProtocol,是一种消息传播协议。它的核心思想其实来源于我们生活中的八卦八卦。我们日常生活中看到的突发新闻其实来自两种,一种是国家新闻媒体等权威机构发布的新闻,另一种是人们通过微信等社交聊天软件相互八卦的消息。传播结果。Gossip协议的基本工作原理和我们的八卦类似。在Gossip协议中,如下图所示,每个节点会周期性的选择一定数量的节点,然后向这些节点同步消息。节点收到消息后,也采取类似的动作,随机选择节点,继续向其他节点传播。Gossip协议的基本工作原理和我们的八卦类似。在Gossip协议中,如下图所示,每个节点会周期性的选择一定数量的节点,然后向这些节点同步消息。节点收到消息后,也采取类似的动作,随机选择节点,继续向其他节点传播。最终,经过一定次数的扩散和传输,整个集群中的所有节点都能感知到这条消息,并且各个节点的数据趋于一致。Gossip协议广泛应用于许多知名项目,如RedisCluster集群版、ApacheCassandra、AWSDynamo。Consul自然支持多数据中心,但是多数据中心的服务数据不会跨数据中心同步。每个数据中心的服务器集群都是独立的。Consul提供了PreparedQuery功能,支持按照一定的策略返回多个数据中心下的最佳服务实例地址,让你的服务具有跨数据中心容灾。我们来看一下PreparedQuery的查询过程:比如当你的API网关收到用户查询服务A的请求时,API网关服务会先从缓存中寻找服务A对应的最佳实例。如果没有缓存,则向Consul发送PreparedQuery请求,查询服务实例A。Consul收到请求后,先返回数据中心下的服务实例。如果本数据中心没有或异常的数据中心,根据数据中心之间的RTT从近到远查询其他数据中心的数据,最终网关可以将用户请求转发到最佳数据中心下的实例地址.Consul支持以下三种读请求模式:Default(默认)。默认是这种模式,可以保证大部分场景下的数据强一致性。但是,当旧领导与网络分区隔离并选举新领导时,过时读取可能会在非常小的时间窗口内发生。这是因为Consul为了提高读性能,使用Lease机制维护Leader身份,避免与其他节点交互确认的开销。强一致性(consistent)。强一致性读和etcd默认的线性读模式是一样的。每个请求都需要集群中的大多数节点来确认Leader身份。因此,与默认模式读取相比,性能会有所下降。弱一致性(陈旧)。任何节点都可以读取它,无论它是否是领导者。可以读取陈旧数据,类似于etcd的串行读取。这种读模式不需要集群有leader,所以当集群不可用时,只要有节点存活,它仍然可以响应读请求。ZooKeeperZooKeeper是一个典型的分布式数据一致性解决方案。分布式应用可以基于ZooKeeper实现数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分发。队列等功能。ZooKeeper的优点:顺序一致性:从同一个客户端发起的事务请求最终会严格按照顺序应用到ZooKeeper上。原子性:所有事务请求的处理结果在整个集群的所有机器上都是一致的应用,即要么整个集群的所有机器都成功应用了某个事务,要么都没有应用。单一系统镜像:无论客户端连接到哪个ZooKeeper服务器,它看到的服务器数据模型都是一致的。可靠性:应用更改请求后,更改的结果将一直保留,直到被下一个更改覆盖。我们来看看ZooKeeper的架构图。图片取自etcd实战课。ZooKeeper集群中的所有机器都通过Leader选举过程选出一个名为“Leader”的机器。Leader可以同时为客户端提供写服务和读服务。服务。除了Leader,Follower和Observer都只能提供读服务。Follower和Observer唯一的区别是Observer机器不参与Leader选举过程,也不参与写操作的“超过一半写入成功”策略,因此Observer机器可以提高读集群的性能而不影响写入性能。ZooKeeper使用Zab协议ZAB(ZooKeeperAtomicBroadcast)协议是专门为分布式协调服务ZooKeeper设计的支持崩溃恢复的原子广播协议。在ZooKeeper中,主要依靠ZAB协议实现分布式数据一致性。基于该协议,ZooKeeper实现了主备模式的系统架构,以维护集群中副本之间的数据一致性。Zab协议可以分为以下几个阶段:Phase0,LeaderElection。节点只能通过获得超过一半的选票来选举为准领导者;第一阶段,发现。准领导者收集其他节点的数据信息,并将最新的数据复制给自己;阶段2,同步。Thequasi-Leadercopiesitslatestdatatootherlaggingnodes,andinformsothernodesthatitisofficiallyelectedastheLeader;第三阶段,广播。Leader正式对外服务,处理客户端写请求,广播消息。当收到写入请求时,它会生成一个Proposal广播给每个Follower节点。在超过一半的Follower节点响应后,Leader会向每个Follower发送Commit命令,通知他们提交相关提案;关于ZAB中的两种模式:crashrecovery和消息广播crashrecovery当整个服务框架在启动过程中,或者Leader服务器出现网络中断、crash退出、重启等异常情况时,ZAB协议会进入恢复模式并选举一个新的Leader服务器。当leader被选好,完成上面Phase2的同步过程,就会退出崩溃恢复模式消息广播。Thequasi-LeaderwillcopyitslatestdatatootherlaggingnodesandinformothernodesthatitisofficiallyelectedastheLeader.这时候就可以进入广播模式了。当客户端进行数据写入操作时,可以通过广播的方式通知所有的follower。当集群中超过半数的Follower服务器与Leader服务器完成状态同步后,整个服务框架就可以进入消息广播模式。选型对比1.并发原语:etcd和ZooKeeper不提供原生的分布式锁和leader选举支持,只提供核心的基础数据读写,和并发控制API,由应用上层封装,consul是更简单,提供本机支持,可以使用简单的命令;2、服务发现:etcd和ZooKeeper不提供原生的服务发现支持。Consul为解放用户在服务发现上的双手做了很多工作,提供服务发现框架帮助你的业务快速接入,并提供HTTP和DNS两种获取服务的方式;3、健康检查:consul的健康检查机制是基于client和Gossip协议的分布式健康检查机制。它具有低延迟和可扩展性的特点。业务可以使用Consul的健康检查机制来检测HTTP接口返回码、内存甚至磁盘空间。与etcd和ZooKeeper相比,它们的健康检查机制和能力非常有限;etcd提供了Lease机制来实现活体检测。它是一种集中式健康检查,依赖于用户不断发送心跳来更新租约和更新TTL。ZooKeeper使用一种叫做临时节点的状态来实现健康检查。当客户端与ZooKeeper节点的连接断开时,ZooKeeper会删除这个临时节点的key-value数据。它比基于心跳的机制更复杂,给客户端带来了更多的复杂性。所有客户端都必须与ZooKeeper服务器保持活动连接并使其保持活动状态。4.watch特性:Consul存储引擎相比etcd,是基于RadixTree实现的,所以不支持范围查询和监控,只支持前缀查询和监控,而etcd两者都支持,而ZooKeeper的Watch特性有更多的局限性,它是一次性触发器;5.线性读取。etcd和Consul都支持线性读,而ZooKeeper不支持。6.权限机制比较。etcd实现了RBAC权限验证,而ZooKeeper和Consul实现了ACL。7.交易比较。etcd和Consul都提供简单的事务能力,支持字段比较,而ZooKeeper只提供版本号检查能力,比较弱。8.多个数据中心。在多数据中心支持方面,自然只支持Consul。虽然不支持跨数据中心的数据自动同步,但其提供的服务发现机制和PreparedQuery功能,可以在可用区后端实例出现故障时,实现业务恢复,它将请求转发到最近的数据中心实例。而etcd和ZooKeeper不支持。总结总的来说,consul提供了原生的分布式锁、健康检查、服务发现机制支持,让业务更省心,同时也支持多数据中心;当然etcd和ZooKeeper也有相应的库,也可以很好的支持,但是两者都不支持多数据中心;ZooKeeper在Java业务选型中经常用到,而etcd是用go语言开发的,所以如果是go技术栈,用这个也是不错的选择。Consul在国外应用广泛,中文文档和实际案例比etcd少;参考【服务发现框架选择:Consul、Zookeeper还是etcd?】https://www.cnblogs.com/sunsky303/p/11127324.html【23|选择:etcd/ZooKeeper/Consul等,我们应该如何选择?】https://time.geekbang.org/column/article/351898【服务发现对比】https://developer.aliyun.com/article/759139【ZooKeeper讲解】https://juejin.cn/post/6844903677367418893