Zookeeper和Eureka的区别

2020-11-25  本文已影响0人  机灵鬼鬼

回答这个问题之前先强调一个概念:分布式系统的著名的理论CAP,由于分区容错性P是必须要保证的,因此我们在设计系统时,只能在A和C之间权衡。
C:(Consistency)强一致性
A:(Availability)可用性
P:(Partition tolerance)分区容错性

Zookeeper保证CP

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

Eureka保证AP

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

集群配置
在机器中启动 eureka server 指定生效配置,优先于application.yml的配置
java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=ek3 &

server:
  port: 7001
spring:
  profiles:
    active: ek3
  application:
      name: eureka-server
---
eureka:
  instance:
    hostname: ek3  #eureka服务端实例名
    prefer-ip-address: false

  client:
    #不将eureka server 注册进来,会提示unavailable-replicas
    #默认情况下,Eureka Server会向自己注册,这时需要配置eureka.client.registerWithEureka 和 eureka.client.fetchRegistry为false,防止自己注册自己。
    register-with-eureka: false #false表示不向注册中心注册自己
    fetch-registry: false #false 表示此应用就是注册中心,职责就是维护服务实例,并不需要去检测服务
    service-url:
      defaultZone: http://ek25:${server.port}/eureka/,http://ek36:${server.port}/eureka/ #设置与Eureka server 交互的地址查询服务和注册服务
spring:
  profiles: ek3
---
eureka:
  instance:
    hostname: ek25  #eureka服务端实例名
    prefer-ip-address: false

  client:
    register-with-eureka: false #false表示不向注册中心注册自己
    fetch-registry: false #false 表示此应用就是注册中心,职责就是维护服务实例,并不需要去检测服务
    service-url:
      defaultZone: http://ek3:${server.port}/eureka/,http://ek36:${server.port}/eureka/ #设置与Eureka server 交互的地址查询服务和注册服务
spring:
  profiles: ek25
---
eureka:
  instance:
    hostname: ek36  #eureka服务端实例名
    prefer-ip-address: false

  client:
    register-with-eureka: false #false表示不向注册中心注册自己
    fetch-registry: false #false 表示此应用就是注册中心,职责就是维护服务实例,并不需要去检测服务
    service-url:
      defaultZone: http://ek3:${server.port}/eureka/,http://ek25:${server.port}/eureka/ #设置与Eureka server 交互的地址查询服务和注册服务
spring:
  profiles: ek36
image.png
image.png
image.png
上一篇下一篇

猜你喜欢

热点阅读