zookeeper 选举机制 和 eruake

zookeeper简介: 在分布式环境中,多个服务之间协调一致。有提供分布式锁、服务配置。实现分布式领域CAP(consistency一致性,Availiablity高可用,patition tolrenance 分区容错性)原理中的CP。

问题一:为何zookeeper要有leader?

zookeeper是以Fast Paxos算法为基础,paxos算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fase Paxos作了一些优化,通过选举产生一个leader,只有leader才能提交proposer,具体的可以看一下Fast Paxos算法

zookeeper协调一致原理paxos算法: 在分布式系统只发生几起宕机或网络异常情况下,在集群内部对某个数据达成一致(proposer和accepter和learner都认为某个value被选定),并且保证不论发生上述任何异常,都不会整个系统的一致性。

在paxos算法中,分为以下角色:

proposer:提议者

accepter:决策者

learners:最终决策学习者

提议者想决策者提出方案,决策者会根据zookeeper的权重(时间约后启动,权重越大)选择leader,如果过半的决策者同意则产生主节点。

选举状态: looking:竞选状态

following:随从状态,参与投票

observing:观察状态,不参与投票

leading:领导中

选举流程: 假设有5台机器,分别A,B,C,D,E。  注:zookeeper启动的时候,会读集群的配置Ip

1.A启动,当前没有leader,给自己投票,其他机器没有启动,收不到反馈信息,处于LOOKING

2.B启动,当前没有leader,给自己投票,B发消息给其他机器,A接受到了来自B的投票,B比自己服务号大,接受投票,支持B当选,B接收到A 小于或等于自己的投票,支持A投自己。所以2:1,但是没有超过一半;following状态

3.C启动,当前没有leader,给自己投票,广播给A和B,A和B收到比自己大的服务号,支持C当选并且A清空支持B的投票,此时比分为A:B:C=1:1:3,超过一半,C胜出,成为LEADER,状态为leading

4.D启动,已经有leader了,同步leader状态,不参与投票,observing状态

zookeeper弱点--脑裂: zookeeper之间是通过心跳检测来确认节点是否可用,在网络延迟的情况下,会出现假死情况。假设A,B,C,D,E,F,E七个节点,C为主节点。现在C假死了,A,B可用连C,D,E,F都连不上C,D,E,F会通知集群所有可用的zk(master挂掉了,超过半数都连不上C,我们要重新选举),从而F会成为新的主节点。F去通知client主节点切换了,但是会有网络延迟。此时有两部分client,一部分连接新master,一部分连接老大master,如果此时client要更新同一份数据进行更新,就无法保持一致性了。

eureka(希腊语,词义:我找到啦,我发现了) 特点:

1.如果某台服务器宕机了,不会有选举过程,客户端会自动切换到其他eureka,如果故障服务器回复后,又将重新纳入集群,并同步新的服务注册信息。当网络故障,每个eruka吃持续对外提供服务,zookeeper要先选举,只有master对外提供服务

2.eureka当机器心跳异常,会进入自我保护模式,延长注册服务过期时间,就是好数据和坏数据都留着总比丢掉好数据强,等网络恢复后再推出保护模式

部署:

1.下载war包:

http://search.maven.org/#search%7Cga%7C1%7Ceureka-server

2.git下载源码编译:

https://github.com/Netflix/eureka

3.自己建spring-boot项目:

<parent>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-parent</artifactId>   <version>1.5.9.RELEASE</version>   <relativePath />  </parent>  <artifactId>luochaoqun-spring-cloud-eureka</artifactId>  <properties>  </properties>  <dependencies>   <dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>    <version>1.4.2.RELEASE</version>   </dependency>  </dependencies>    <dependencyManagement>   <dependencies>    <dependency>     <groupId>org.springframework.cloud</groupId>     <artifactId>spring-cloud-dependencies</artifactId>     <version>Dalston.SR5</version>     <type>pom</type>     <scope>import</scope>    </dependency>       </dependencies>  </dependencyManagement> package com.main;   import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;   /** *@author:luo.cq *@email:lcqjava@sina.cn *@since:2018年5月30日 *@description: * **/ @EnableEurekaServer @SpringBootApplication public class EurekaServerApplication {    public static void main(String[] args) {   SpringApplication.run(EurekaServerApplication.class, args);  } }   配置项application.properties:

server.port=9000 eureka.instance.hostname=localhost #don't regist self eureka.client.register-with-eureka=false #jinzhi jiansuo fuwu eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka

界面:

--------------------- 作者:fightingiow 来源:CSDN 原文:https://blog.csdn.net/fightingiow/article/details/80495502 版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/sweet6/p/10574152.html