Nacos对比Zookeeper、Eureka之间的区别

CAP定律

这个定理的内容是指的是在一个分布式系统中、Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。

  • 一致性(C)在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)

  • 可用性(A)在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)

  • 分区容错性(P)以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。

  • 在分布式系统中网络会存在脑裂的问题,部分Server与整个集群失去节点联系,无法组成一个群体。只有在AP和CP选择一个平衡点

Eureka与Zookepper

相同点

  • 都可以实现分布式服务注册中心

不同点

  • Zookeeper采用CP保证数据的一致性的问题,原理采用Zab原子广播协议,当我们的zk领导因为某种原因宕机的情况下,会自动触发重新选一个新的领导角色,整个选举的过程为了保证数据的一致性问题,在选举的过程中整个zk环境是不可使用的可短暂可能无法使用到zk。意味着微服务采用该模式情况下,可能无法实现通讯(本地有缓存除外)

注意:可运行的节点必须满足过半机制,整个zk采用使用。

Eureka采用AP的设计理念架构注册中心,完全去中心化思想,也就是没有主从之分

每个节点都是均等,采用相互注册的原理,你中有我我中有你,只要最后有一个eureka节点存在就可以保证整个微服务可以实现通讯。

我们在使用注册中心,可用性在优先级最高,可以读取数据短暂不一致性,但是至少要能够保证注册中心可用性。

Nacos与Eureka的区别

定律的区别:

  • Eureka采用AP模式形式实现注册中心

  • Nacos默认采用AP模式。在1.0版本之后采用AP+CP模式混合实现注册中心。

Eureka与Nacos底层实现集群协议:

  • 去中心化对等。

  • Raft协议实现集群产生领导角色。

Raft到底是什么:分布式一致性协议的算法

  • 分布式系统一致性算法 应用于系统软件实现集群保持每个节点数据的同步性

  • 保持我们的集群中每个节点的数据的一致性的问题,专业的术语分布式一致性的算法。

  • 场景:Redis集群、nacos集群、mongdb集群等

CP情况下:虽然我们服务不能用,但是必须要保证数据的一致性

AP情况下:可以短暂保证数据不一致性,但是最终可以一致性,不管怎么样,要能够保证我们的服务可用

所以大多的注册中心都是AP

ZAB协议集群原理

Zookeeper Atomic Broadcast

我们在分布式系统,存在多个系统之间的集群保持数据一致性,采用CP一致性算法保持数据的一致性问题。

Zookeeper基于ZAB协议实现保持每个节点的数据同步的问题,中心化思想集群模式

分为领导和跟随角色。

在这里插入图片描述
在程序中如何取决某个节点能力比较强:

对每个节点配置一个myid或者serverid还有数值越大表示能力越强或者随机时间

整个集群中为了保持数据的一致性的问题,必须满足过半可运行的节点环境下才可以使用

ZAB的协议实现原理事通过比较myid,myid谁最大谁就是为可能是领导角色,只要满足过半的机制就可以成为领导角色,后来启动的节点不会参与选举的

Zab协议如何保持数据的一致性问题

所有写的请求统一交给我们的领导角色实现,领导角色写完数据之后,领导角色再将数据同步给每个节点。

注意:数据之间同步采用2pc两个阶段提交协议。

选举过程:

  • 先去比较zxid, zxid谁最大谁就是为领导角色;

  • 如果zxid相等的情况下,myid谁最大谁就为领导角色;

如果领导角色在同步过程中宕机了怎么办?

  • 如果有同步完成的从机,那么会在从机里面选
  • 如果都没有,那么就重新选举

Raft协议选举的基本概念

Raft协议算法

  • 1、状态:分为三种 跟随者、竞选者(候选人)、领导角色

  • 2、大多数:>=n/2+1 3/2=1+1=2

  • 3、任期:每次选举一个新的领导角色 任期都会 实现增加

  • 4、竞选者谁的票数最多,谁就是为领导角色

存在的疑问:

多个竞选者,产生的票数都完全一样,这到底谁是领导角色?

​ 注意当我们的集群节点总数,如果是奇数情况下,就算遇到了该问题也不用担心。

当我们的节点是偶数的情况下,可能会存在该问题,如果两个竞选者获取的票数相等的情况下,开始重置竞选的超时时间,一直到谁的票数最多谁就为领导。

默认情况下选举的过程:

  • 1、默认的情况下每个节点都是跟随者角色

  • 2、每个节点会随机生成一个选举的超时时间,例如大概是100-300ms,在这个超时时间范围内必须要等待。

  • 3、超时时间过后,当前节点的状态由跟随者变为竞选者状态,会给其他的节点发出选举的投票通知,只要该竞选者有超过半数以上即可选为领导角色。

    核心的设计原理:谁超时时间最短,谁就有非常大的概率为领导角色。

那么在随机数有可能一样的情况下,如何选举呢?

  • 1、如果所有的节点的超时随机数都是一样的情况下,当前投票全部作废,重新进入随机生成超时时间。
  • 2、如果有多个节点生成的随机数都是一样的情况下,比较谁的票数最多,谁就是领导。如果票数完全一样的情况,直接作废,重新进入随机生成超时时间。
  • 注意:建议集群节点为奇数。偶数节点容易造成死循环。

故障重新实现选举:

如果我们跟随者节点不能够及时的收到领导角色消息,那么这时候跟随者就会将当前自己的状态由跟随者变为竞选者状态,会给其他的节点发出选举投票的通知,只要该竞选者有超过半数以上即可选举为领导角色。

数据是如何保持一致性的?类似于ZAP两阶段提交协议

如何实现日志的复制

  • 1、所有的写的请求都是统一的交给我们的领导角色完成,写入该对应的日志,标记该日志为被提交状态。

  • 2、为了提交该日志,领导角色就会将该日志以心跳的形式发送给其他的跟随者节点,只要满足过半的跟随者节点写入该目志,则直接通知其他的跟随者节点同步该数据,这个过程称为日志复制的过程。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐