做为服务注册中心,Eureka比Zookeeper好在哪里

CAP是Consistency、Availablity和Partition Tolerance的缩写。通常的分布式系统最多知足其中两条。而Partition Tolerance是分布式系统的关键,所以都会保留此特性。java

Eureka是基于AP原则构建的,而ZooKeeper是基于CP原则构建的。这些能够从他们的特性中获得体现。web

ZK有一个Leader,并且在Leader没法使用的时候经过Paxos(ZAB)算法选举出一个新的Leader。这个Leader的目的就是保证写信息的时候只向这个Leader写入,Leader会同步信息到Followers。这个过程就能够保证数据的一致性。算法

对比下ZK,Eureka不用选举一个Leader。每一个Eureka服务器单独保存服务注册地址,Eureka也没有Leader的概念。这也所以产生了没法保证每一个Eureka服务器都保存一直数据的特性。当Eureka与注册者心跳没法保持的时候,依然保存注册列表的信息很长一段时间。固然了,客户端中必须用有效的机制屏蔽坏掉的服务器,这个Spring Cloud中的体现是Ribbon。服务器

Eureka由于没有选举过程来选举Leader,所以写的信息能够独立进行。所以有可能出现数据信息不一致的状况。可是当网络出现问题的时候,每台服务器也能够完成独立的服务。固然了,一些客户端的负载平衡和Fail Over机制须要来辅助完成额外的功能。相较之下,ZK由于基于CP原则,能保证很好的数据一致性,可是可用性支持力度不高。而在一个内部系统中,主要是服务的注册与发现,而不是配置(文件)共享,所以Eureka更适用于内部服务的建设。网络

著名的CAP理论指出,一个分布式系统不可能同时知足C(一致性)、A(可用性)和P(分区容错性)。因为分区容错性在是分布式系统中必需要保证的,所以咱们只能在A和C之间进行权衡。在此Zookeeper保证的是CP, 而Eureka则是AP。分布式

4.1 Zookeeper保证CP

当向注册中心查询服务列表时,咱们能够容忍注册中心返回的是几分钟之前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。可是zk会出现这样一种状况,当master节点由于网络故障与其余节点失去联系时,剩余节点会从新进行leader选举。问题在于,选举leader的时间太长,30 ~ 120s, 且选举期间整个zk集群都是不可用的,这就致使在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大几率会发生的事,虽然服务可以最终恢复,可是漫长的选举时间致使的注册长期不可用是不能容忍的。性能

4.2 Eureka保证AP

Eureka看明白了这一点,所以在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工做,剩余的节点依然能够提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时若是发现链接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。除此以外,Eureka还有一种自我保护机制,若是在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现如下几种状况: 
1. Eureka再也不从注册列表中移除由于长时间没收到心跳而应该过时的服务 
2. Eureka仍然可以接受新服务的注册和查询请求,可是不会被同步到其它节点上(即保证当前节点依然可用) 
3. 当网络稳定时,当前实例新的注册信息会被同步到其它节点中设计

所以, Eureka能够很好的应对因网络故障致使部分节点失去联系的状况,而不会像zookeeper那样使整个注册服务瘫痪。开发

5. 总结

Eureka做为单纯的服务注册中心来讲要比zookeeper更加“专业”,由于注册服务更重要的是可用性,咱们能够接受短时间内达不到一致性的情况。不过Eureka目前1.X版本的实现是基于servlet的java web应用,它的极限性能确定会受到影响。期待正在开发之中的2.X版本可以从servlet中独立出来成为单独可部署执行的服务。部署

相关文章
相关标签/搜索