服务发现场景下zookeeper vs etcd

Posted 奔跑中的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务发现场景下zookeeper vs etcd相关的知识,希望对你有一定的参考价值。

在服务发现领域,一直以来zookeeper都是不二的选择,近两年,由于zookeeper发展速度的缓慢,docker的崛起引爆了etcd这个服务发现组件,下面就这两个组件做一下分析。

etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现。etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper Doozer,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性。

ZooKeeperApache ZooKeeperApache软件基金会的一个软件项目,他为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。 ZooKeeper曾经是Hadoop的一个子项目,但现在是一个独立的顶级项目。 ZooKeeper的架构通过冗余服务实现高可用性。


zookeeper
真的是高可用吗?

Nozookeeper实际上是一个cp的系统,通过paxoszab)来保证一致性,也就是参议员投票机制,假设在3data center分别部署了3zk节点(为了容灾),发生网络分区的时候,也就是其中一个节点和其他两个断网了,已经连接到这个节点的应用将无法向这个节点读写数据,作为一个分布协调系统,做到这点是必须的。实际上在客户端缓存数据是一个折中的办法,大多服务化框架也是这么做的,但是对于服务发现情况下,正在启动的服务,就非常不幸了。而这种场景并不少见,特别是当某个data center大面积故障时。

etcd虽然是不可写的,但是可以读取数据。在服务发现这种场景下,能读取到不一致的数据要好于什么都读不到。

Zookeeper的故障恢复时间是惊人的

一旦网络发生抖动,触发选主流程,意味着整个集群是不可用状态,而选主的时间通常在30-120s之间,在这段时间,应用会不断的报出异常(CONNECTIONLOSS(连接断开) 和SESSIONEXPIRED(Session 过期)),如果你自己分析生产环境上的日志,就会发现这个问题。

etcd依赖raft算法,选主流程要快的多。Raft竞选过程中,如果发生票数相同的情况,竞选节点(candidatetime out时间采用随机值,有效降低了冲突的概率。


Etcd
并不是强一致的

假设有5个节点,发生网络分区后,其中leader节点被分到了少数区域,此时多数节点又选出了一个新的leader,这种情况下,存在两个leader新的 leader 在下一次heartbeat timeout 时向所有的节点发送一次 heartbeat leader 在收到步进数更高的leader heartbeat 时放弃 leader 地位并切换到 follower 状态。值得注意的是,步进数落后的leader将丢弃前面的数据,和leader保持一致。

即使使用zookeeper,要保证强一致性也要费一番力气,你无法保证服务端的所有变化都能不遗漏的通知到每个客户端(zookeeper并不是直接把变化的数据发送到客户端,而是发送变化时,让客户端来服务端取数据。重要的是你不能永久性的watch节点变化,只能重复注册,在收到变化,重新注册之前,这个时间段变化的数据,你是会永久性的错过的)。

节点数变更

无论是zookeeper还是etcd,减少节点数并不复杂。如果要增加节点,zookeeper3.5以上版本支持动态扩容,etcd比较容易。

易用性

Etcd做的不错,提供了http+json和客户端两种选择。需要注意的是,如果使用http+json,需要自己实现一系列功能。看客户端的代码你就知道了。

容灾

实际上对两个系统来说都能做到,只是需要适当调大超时时间和心跳间隔,etcd的官方建议可以看这里https://coreos.com/etcd/docs/latest/tuning.html,不过对于zookeeper来说,由于上文中提到的一些观点,可用性、性能受到挑战,很多公司采用在单个区域形成集群,跨区域增加oberserver的方式来提升读性能。例如北京地区三机房,部署一套集群,在杭州增加oberserver的方式,优先访问本地节点。这样的话,需要在客户端设置优先策略,否则客户端访问server list是采用随机后轮训的机制。

总结

再回到服务发现这个应用场景,在此场景下,etcd是一个不错的选择,理由可以参加上文。另一个理由是apache的项目更新速度太慢,很多问题长时间不解决。导致很多用户自行修改源码,或者直接放弃。要知道,在很多公司,凭几个技术人员的几句话,完全可以放弃一个存在个别问题的成熟的开源项目,转为自己开发。也正是因为etcd的更新速度比较快,架构和接口容易变更,会有一定的成本。需要注意的是etcd还不算特别成熟,应用范围并不算广,目前知道的是CoreOSKubernetesCloudFoundry等知名项目均在生产环境中使用了etcd。而zookeeper无疑在很多公司和大型的项目中被大规模使用。但是etcd还是非常值得期待的。

etcd2.1.0官方benchmarks

1.1 Performance

1.1.1reading one single key

key size in bytes

number of clients

target etcd server

read QPS

90th Percentile Latency (ms)

64

1

leader only

1534

0.7

64

64

leader only

10125

9.1

64

256

leader only

13892

27.1

256

1

leader only

1530

0.8

256

64

leader only

10106

10.1

256

256

leader only

14667

27.0

64

64

all servers

24200

3.9

64

256

all servers

33300

11.8

256

64

all servers

24800

3.9

256

256

all servers

33000

11.5

1.1.2writing one single key

key size in bytes

number of clients

target etcd server

write QPS

90th Percentile Latency (ms)

64

1

leader only

60

21.4

64

64

leader only

1742

46.8

64

256

leader only

3982

90.5

256

1

leader only

58

20.3

256

64

leader only

1770

47.8

256

256

leader only

4157

105.3

64

64

all servers

1028

123.4

64

256

all servers

3260

123.8

256

64

all servers

1033

121.5

256

256

all servers

3061

119.3


以上是关于服务发现场景下zookeeper vs etcd的主要内容,如果未能解决你的问题,请参考以下文章

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

服务发现:Zookeeper vs etcd vs Consul

服务发现:Zookeeper vs etcd vs Consul

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

Zookeeper vs. etcd

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