美文网首页
Zookeeper和Eureka的区别

Zookeeper和Eureka的区别

作者: 机灵鬼鬼 | 来源:发表于2020-11-25 09:54 被阅读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

    相关文章

      网友评论

          本文标题:Zookeeper和Eureka的区别

          本文链接:https://www.haomeiwen.com/subject/eqjiiktx.html