作为服务注册中心,Eureka比Zookeeper好在哪里
CAP是Consistency、Availablity和Partition Tolerance的缩写。一般的分布式系统最多满足其中两条。而Partition Tolerance是分布式系统的关键,因此都会保留此特性。
Eureka是基于AP原则构建的,而ZooKeeper是基于CP原则构建的。这些可以从他们的特性中得到体现。
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中独立出来成为单独可部署执行的服务。
最新文章
- win10电脑优化
- java中可定制的序列化过程 writeObject与readObject
- 移动端web开发技巧
- jwt refresh token
- js之oop <;四>;对象管理
- solr异常解决
- 【转载】Fast Inserts to PostgreSQL with JDBC and COPY FROM
- XE3随笔12:TSuperTableString、TSuperAvlEntry
- How to calculate a good InnoDB log file size
- EF Code First 更新数据库, 数据库迁移
- 基于.Net的单点登录(SSO)解决方案
- Net Framework中的提供的常用委托类型
- superagent和request结果转换区别
- ajax 处理请求回来的数据
- ElasticSearch-6.2安装head插件
- git push后出错
- Python成绩雷达图
- spring源码分析系列 (2) spring拓展接口BeanPostProcessor
- SpringMVC:后台将List转为Json,传值到页面
- [z]一分钟教你知道乐观锁和悲观锁的区别
热门文章
- 链表Linked List
- message contains no documents code:13066 mongdb数据库报的错误
- HDU 2842 Chinese Rings(矩阵高速功率+递归)
- 推断(inference)、贝叶斯规则(Bayes's rule)与导出分布(derived distribution)
- Go程序开发---Go环境配置:CentOS6.5+Go1.8标准包安装
- UVA10940 - Throwing cards away II(找到规律)
- Node.js &;&; Angular &;&; TypeScript 环境安装与更新
- 首个 C++ 编译器诞生 30 周年了,来听听 C++ 之父畅谈 C++
- x:Static
- Java FTP 基本操作