zookeeper 和 eureka

411 阅读3分钟

zookeeper 和 eureka 作为两种最常用的 注册中心,他们之间有什么不同之处呢?

不同之处很多,这里指讨论一点。

两者的设计原则和对 CAP 的倾向不同

什么是 CAP

参考 分布式系统中的 CAP 定理

Zookeeper 的 CP 原则

对于 zookeeper 来说,它倾向满足 CP 的。也就是说,zookeeper 是保证数据的一致性的,但是这里还需要注意一点是,zookeeper 它默认不是强一致的,什么意思呢?

打个比方,现在客户端 A 提交一个写操作,zookeeper 在过半数节点操作成功之后就可以返回,但此时,客户端 B 的读操作请求的是 A 写操作尚未同步到的节点,那么读取的就不是 A 最新提交的数据了。

那如何保证强一致性呢?我们可以在读取数据的时候先执行一下 sync 操作,即与 leader 节点先同步一下数据,再去取,这样才能保证数据的强一致性。

满足一致性的同时,就很难满足可用性。刚刚提到了 leader 节点,当 master 节点因为网络故障与其他节点失去联系时,剩余节点会重新进行 leader 选举。问题在于,选举 leader 的时间太长,30 ~ 120s, 且选举期间整个 zookeeper 集群都是不可用的,这就导致在选举期间注册服务瘫痪。

Eureka 的 AP 原则

大规模的网络系统,失败是在所难免的,我们无法回避这个问题。当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接 down 掉不可用

Eureka 在被设计的时候,就考虑到了这一点,因此在设计时优先保证可用性,这就是 AP 原则。

Eureka 各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。 而 Eureka 的客户端在向某个 Eureka 注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台 Eureka 还在,就能保证注册服务可用(即保证A原则),只不过查到的信息可能不是最新的(不保证C原则)。

除此之外, Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况

  1. Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务

  2. Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)

  3. 当网络稳定时,当前实例新的注册信息会被同步到其它节点中.

Eureka 可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像 zookeeper 那样使整个注册服务瘫痪

看法

作为服务注册中心,最重要的是要保证可用性,可以接受短时间内数据不一致的情况。因此个人觉得 Eureka 作为单纯的服务注册中心会更好一点

虽然 eureka2.x 分支不再维护,但是 eureka1.x 官方还在积极维护,并不是像网上说的 eureka 凉了

Eureka 是随着 Spring Cloud 被人们熟知,是 Spring Cloud 的默认配置中心,但是 Spring Cloud 也支持使用 zookeeper、consul 等。