ZooKeeper和Eureka的基本区别一次性搞懂!

目录

先说apc

金融系统或医疗系统是CP,那么AP呢,一般是什么场景或则是什么系统?

用 Eureka的时候 服务之间的调用经过 Eureka 吗?还是 直接通过从Eureka 那里读取一个服务地址列表,然后通过服务地址列表就可以访问服务了?

是不是消费者每次消费都要去Eureka哪里查一遍?

ZooKeeper 也是这样的吗?和Eureka的区别在哪里?

ZooKeeper更注重数据一致性和分布式协调 ,怎么实现的?

 为什么还需要投票,直接服从不就可以了吗?

如果盲目执行的一致性 强制执行 ,后果是什么 是数据不一致或错误的决策吗?

 跟随者节点为什么要同意提案?

对于没有协调不过来的节点,这种情况下,又是投票是多数,那么是不是要被强制执行呢?

问题是,如果ZooKeeper 在提案的时候,是不是 要耗时时间呢?因为“同意提案的过程就是用来协调节点之间的一致性。”需要时间嘛

然后是ZooKeeper 开始有100个节点,然后坏了10个有九十个了,那么这时是 51算超过半数还是46算超过半数?

为什么不把那10个抛弃掉呢?这样就可以把46当超过半数了

那么Eureka 集群又是怎么回事呢?

Eureka集群的消息会通过提案吗?

集群中的节点会定期互相同步服务实例的信息,算法是什么呢?

Eureka 的消费者是有一个服务地址缓存列表的,定期去更新,ZooKeeper 没有服务地址缓存列表,每次都去ZooKeeper 读,对吗?


先说apc

CP模型是一致性和分区容忍性的缩写。它是CAP定理的一部分,CAP定理指出,在分布式系统中,无法同时满足以下三个属性:

  1. 一致性(Consistency):所有节点在同一时间看到的数据是相同的,即系统的状态在任何时间点都是一致的。

  2. 分区容忍性(Partition Tolerance):系统可以容忍节点之间的通信失败或分区(网络故障),即系统在出现网络问题时仍然能够继续工作。

  3. 可用性(Availability):系统在任何时间都能够响应客户端请求,即系统是可用的。

CP模型强调一致性和分区容忍性,意味着在分布式系统中,当发生网络分区或通信失败时,系统会优先保证数据的一致性,而可能会牺牲部分可用性。这意味着如果系统中的某些节点无法通信或发生分区时,系统可能会阻止某些操作或对外提供有限的服务,以确保数据的一致性。

在实际应用中,选择CP模型通常意味着在出现网络分区或节点故障时更加关注数据的完整性和一致性,而可能会导致系统的某些部分无法提供服务。这种模型适用于那些对数据一致性要求非常高的应用场景,例如金融系统或医疗系统,其中数据的准确性至关重要。

不过,需要注意的是,CAP定理的一个重要特点是在分布式系统中需要在一致性、可用性和分区容忍性之间进行权衡,因此在选择系统的设计和配置时,通常需要根据具体的需求和业务场景来决定应该更加强调哪个属性。

金融系统或医疗系统是CP,那么AP呢,一般是什么场景或则是什么系统?

AP模型通常在一些特定的应用场景或系统中选择,其中可用性(Availability)比一致性(Consistency)更为重要。以下是一些常见的应用场景和系统,可能更倾向于选择AP模型:

  1. 互联网应用程序:许多互联网应用程序,尤其是社交媒体、博客平台、内容分发网络(CDN)等,更注重可用性和性能,因此可能容忍一定程度的数据不一致性。例如,社交媒体上的帖子或评论可能会有一些延迟,但系统仍然可用。

  2. 在线游戏:在线多人游戏通常需要快速响应玩家操作,因此可用性对于游戏服务器非常关键。游戏系统可能会容忍一些同步问题,以确保游戏流畅运行。

  3. 实时数据分析和日志处理:对于某些实时数据分析和日志处理应用,数据的实时处理和可用性至关重要。系统可能会容忍短暂的数据不一致性,以保证数据的及时处理。

  4. 内容传递网络(CDN):CDN系统需要将内容分发到全球各地的节点,以提供高性能和低延迟的内容访问。在这种情况下,可用性和性能通常比严格的一致性更为重要。

  5. 分布式缓存系统:分布式缓存系统如Redis和Memcached通常更注重性能和可用性,因此可能容忍一定程度的数据不一致性。

需要注意的是,即使在这些场景中,也需要谨慎权衡可用性和一致性。AP模型通常意味着系统可能会在一定程度上放宽数据一致性的要求,因此在选择AP模型时需要确保数据不一致性不会导致严重的问题或损失。每个应用程序都有不同的需求,因此在设计和配置分布式系统时需要根据具体情况来决定选择哪种CAP模型。

用 Eureka的时候 服务之间的调用经过 Eureka 吗?还是 直接通过从Eureka 那里读取一个服务地址列表,然后通过服务地址列表就可以访问服务了?

使用Eureka作为服务注册与发现的组件时,服务之间的调用通常不会经过Eureka服务器。相反,Eureka的主要作用是帮助服务提供者注册其服务,并允许服务消费者查询可用服务的信息。

具体流程如下:

  1. 服务提供者注册服务:当一个微服务启动时,它会向Eureka服务器注册自己的服务实例信息,包括服务名称、IP地址、端口号等。这样,Eureka服务器会维护一个服务注册表,其中包含了所有已注册的服务实例信息。

  2. 服务消费者查询服务列表:当服务消费者需要调用某个服务时,它可以向Eureka服务器发出查询请求,获取特定服务的服务实例列表。Eureka会返回该服务的多个实例的网络地址。

  3. 服务消费者直接调用服务:一旦服务消费者获取了服务实例列表,它可以直接使用这些实例的网络地址来发起对服务提供者的HTTP请求或其他通信协议的调用。这个调用过程不再经过Eureka服务器,而是直接与服务提供者通信。

总结起来,Eureka主要负责服务的注册和服务实例的查询。一旦服务消费者获取了服务实例的地址列表,它们可以直接与服务提供者进行通信,不需要再经过Eureka服务器。这种直接调用的方式可以提高系统的性能和可伸缩性,减少了中间层的负载。

是不是消费者每次消费都要去Eureka哪里查一遍?

不一定。消费者在启动时通常会从Eureka服务器查询一次服务实例列表,并将这个列表缓存在本地。然后,消费者可以在本地缓存中定期刷新或重新查询服务实例列表,以确保获取最新的服务信息。

具体来说,一般的流程如下:

  1. 消费者在启动时向Eureka服务器查询特定服务的服务实例列表,并将其缓存在本地内存中。

  2. 消费者可以使用本地缓存中的服务实例信息来发起对服务提供者的调用,而无需每次调用都去查询Eureka服务器。这样可以提高调用效率,减轻Eureka服务器的负载。

  3. 为了确保服务实例信息的及时性和准确性,消费者通常会定期刷新本地缓存或重新查询Eureka服务器以获取最新的服务实例列表。这个刷新可以根据配置定时执行,以确保服务实例信息不会过期。

需要注意的是,Eureka客户端通常会提供内置的机制来处理服务实例列表的自动刷新和缓存管理,消费者不需要手动实现这些逻辑。这样,消费者可以从本地缓存中获取服务实例信息,但仍然保持与Eureka服务器的定期通信,以确保及时获取新的服务实例信息和处理服务实例的下线等变更。这种机制可以在一定程度上提高性能并减轻Eureka服务器的负载。

ZooKeeper 也是这样的吗?和Eureka的区别在哪里?

ZooKeeper和Eureka都是用于服务注册与发现的工具,但它们在设计和工作方式上有一些不同之处。

ZooKeeper:

  1. 一致性: ZooKeeper 是一个分布式协调服务,它强调一致性(CP模型)。它的主要目标是确保数据的强一致性,即在分布式系统中的所有节点都能看到相同的数据。

  2. 服务发现: ZooKeeper可以用于实现服务发现,但不像Eureka那样专门为此而设计。在ZooKeeper中,服务的注册和发现是通过创建和监听ZooKeeper节点来实现的。服务提供者将自己的信息写入ZooKeeper节点,而服务消费者则监听相应的节点以获取服务实例信息。

  3. 分布式锁和协调: ZooKeeper在分布式系统中还用于实现分布式锁、领导者选举等分布式协调任务,因此它不仅限于服务注册与发现。

Eureka:

  1. 可用性: Eureka是Netflix开源的服务注册与发现组件,它更注重可用性(AP模型)。在Eureka中,可用性是首要考虑因素,即使在部分节点不可用或网络分区的情况下,Eureka仍然可以提供服务注册与发现功能。

  2. 自动化: Eureka被设计为更加自动化和易于使用。服务提供者只需注册自己的服务实例,而服务消费者只需查询Eureka服务器来获取服务信息。Eureka客户端提供了自动化的服务发现机制,不需要手动创建节点或监听。

  3. 负载均衡: Eureka还包含负载均衡和故障切换功能,可以帮助服务消费者在多个服务实例之间实现负载均衡,并在服务实例故障时自动切换到可用实例。

总的来说,ZooKeeper和Eureka都可以用于服务注册与发现,但它们的设计目标和特性不同。ZooKeeper更注重数据一致性和分布式协调,适用于那些对一致性要求非常高的场景,而Eureka更注重可用性和自动化,适用于需要高可用性的服务注册与发现场景,特别是微服务架构中的应用。选择哪个取决于您的特定需求和系统设计目标。

ZooKeeper更注重数据一致性和分布式协调 ,怎么实现的?

ZooKeeper实现数据一致性和分布式协调的关键是其核心算法Zab(ZooKeeper Atomic Broadcast)。Zab算法确保了ZooKeeper集群中的数据一致性和领导者选举。下面是ZooKeeper如何实现这些目标的简要过程:

1. 数据一致性:

  • 写入操作: 当一个ZooKeeper客户端要写入数据时,它会将请求发送给ZooKeeper集群中的一个节点(通常是领导者)。这个节点负责处理写入请求。

  • 领导者广播: 一旦领导者节点接收到写入请求,它会将请求转换为一个提案(proposal),并将这个提案广播给所有的跟随者节点。

  • 提案投票: 跟随者节点收到提案后,它们会对提案进行投票。当大多数节点投票同意接受提案时,提案被视为已经被接受。

  • 提交操作: 一旦提案被接受,领导者节点将其提交到自己的本地存储中。然后,领导者会通知所有的跟随者节点提交提案。

  • 数据变更: 一旦提案被提交,数据就会发生变更,这个变更在整个ZooKeeper集群中都是一致的。

这个过程确保了数据的一致性,因为只有大多数节点同意接受提案,提案才会被提交。这就意味着在正常运行时,只有一个领导者负责写入操作,从而确保了数据的一致性。

2. 分布式协调:

  • 领导者选举: ZooKeeper集群中有一个特殊的节点被选举为领导者,负责处理写入请求。如果当前的领导者出现故障,其他节点会触发新的领导者选举。选举过程包括提出候选者、投票、选举、通知等步骤,确保了只有一个节点成为领导者。

  • 分布式锁: ZooKeeper还可以用于实现分布式锁,多个客户端可以通过ZooKeeper来协调对共享资源的访问,保证只有一个客户端可以获得锁并执行关键操作。

总之,ZooKeeper通过Zab算法实现了数据一致性和领导者选举,使其成为一个强大的分布式协调工具。这些机制可以用于构建分布式系统,确保数据一致性、高可用性和分布式协调。

 为什么还需要投票,直接服从不就可以了吗?

在ZooKeeper中使用投票的机制是为了确保数据的一致性和分布式系统的可靠性。投票的过程允许每个节点表达自己的意见,并在大多数节点达成一致意见后才将操作视为已经被接受,这有几个重要的原因:

  1. 分布式环境不可靠: 在分布式系统中,网络延迟、节点故障等因素可能导致消息丢失或节点无法达成一致。如果没有投票机制,一旦领导者广播了提案,它们可能无法确定其他节点是否成功收到了提案。通过投票,可以确保每个节点都对提案进行了确认,从而减少了可能的错误和不一致。

  2. 容错性: 在分布式系统中,节点可能出现故障或者网络分区,导致某些节点无法正常运行或者通信。如果所有节点都盲目服从,可能会导致数据不一致或错误的决策。通过投票,可以确保只有大多数节点同意提案才能执行,从而提高了系统的容错性。

  3. 防止脑裂问题: 在分布式系统中,如果不使用投票机制,可能会出现脑裂(Split-Brain)问题,即多个子集的节点分别认为自己是领导者,导致数据不一致。通过投票,可以防止脑裂问题的发生,因为只有大多数节点同意才能选举出唯一的领导者。

综上所述,投票机制是分布式系统中确保一致性和可靠性的关键部分。它确保了每个节点都有机会表达自己的意见,同时要求大多数节点达成一致才能执行操作,以降低分布式系统中的不确定性和错误。这种方式可以确保数据在分布式环境中保持一致性,而不受故障或网络问题的影响。

如果盲目执行的一致性 强制执行 ,后果是什么 是数据不一致或错误的决策吗?

盲目执行或强制执行的一致性是一种非常严格的一致性模型,要求在分布式系统中的每个节点上的操作都必须按照相同的顺序和结果来执行,以确保强一致性。这意味着不管是哪个节点发起的操作,都必须等待所有节点都达成一致意见后才能执行,否则操作会被拒绝。

这种模型的主要后果是可能导致系统的性能降低和可用性下降。因为每个操作都必须等待所有节点的确认,这可能导致延迟增加,特别是在网络通信不稳定或节点故障的情况下。

举个例子来说明:

假设有一个分布式文件系统,多个节点存储文件数据。在强一致性模型下,如果某个客户端想要写入一个文件,它必须等待所有节点确认写入操作后才能继续。这意味着如果有一个节点出现网络故障或者响应变慢,整个写入操作都会受到影响,导致系统的性能降低。

另一个例子是分布式数据库系统中的写操作。在强一致性模型下,每个写操作都必须等待所有节点确认写入,这可能导致写入操作的延迟增加,并且在高负载情况下可能引发性能问题。

虽然强一致性模型确保了数据的强一致性,但它通常会牺牲一些性能和可用性。因此,在设计分布式系统时,需要根据具体的需求和应用场景来选择适当的一致性模型,权衡一致性、性能和可用性之间的关系。

 跟随者节点为什么要同意提案?

同意提案的过程是分布式一致性算法中的核心步骤,它具有确保系统数据一致性和可用性的重要作用。让我再详细解释一下为什么要同意提案:

  1. 保证数据一致性:在分布式系统中,多个节点可能同时接收到不同的操作请求,这些请求可能涉及对共享数据的修改。为了确保数据的一致性,必须通过协调机制来决定哪些操作可以执行,哪些不可以执行。同意提案的过程就是用来协调节点之间的一致性。

  2. 防止数据冲突:如果不经过同意提案的过程,各个节点可以独立地修改共享数据,可能会导致数据冲突、不一致或错误。通过同意提案,可以协调节点之间的操作,避免冲突,确保数据的正确性。

  3. 强一致性要求:在一些分布式系统中,要求数据具有强一致性,这意味着无论哪个节点执行读取操作,都应该获得相同的最新数据。同意提案的过程确保了强一致性,因为只有在大多数节点同意后才会执行操作。

  4. 防止错误的决策:如果不同意提案,可能会导致错误的决策。例如,在分布式数据库中,如果一个节点单独执行写操作,而其他节点不同意,可能导致数据不一致或错误的查询结果。

综上所述,同意提案的过程是为了确保分布式系统中的数据一致性和正确性。只有当大多数节点同意某个提案时,该提案才会被执行,从而防止数据冲突和错误的决策。这是分布式一致性算法的核心原理之一,用来保障系统的可靠性。

对于没有协调不过来的节点,这种情况下,又是投票是多数,那么是不是要被强制执行呢?

在分布式系统中,一致性算法通常设计成能够处理节点之间可能出现的网络分区或故障情况,以确保系统的可用性和一致性。具体来说:

  1. 投票:在一致性算法中,节点进行投票来决定是否同意提案。通常,只有大多数节点同意提案才能被接受和执行。这是为了确保在正常情况下,绝大多数节点达成一致。但是,在出现网络分区或节点故障的情况下,可能会导致无法达成多数节点的一致意见。

  2. 强制执行:一致性算法的设计通常考虑了强制执行的情况。如果网络分区或节点故障导致无法达成多数节点的一致意见,那么系统可能会暂时陷入不一致状态。在一些情况下,系统可能会采取一些容错机制,例如等待一段时间来尝试达成一致,或者通过其他手段来解决冲突。

  3. 容错性:一致性算法也考虑了容错性,以确保即使部分节点无法正常工作,系统仍然能够正常运行。这意味着即使少数节点无法参与投票或达成一致,系统仍然可以继续运行,只是可能会在一致性方面出现一些问题,但不会导致系统崩溃。

总之,一致性算法的设计是为了在分布式系统中处理各种可能的情况,包括网络分区和节点故障,以确保系统的可用性和一致性。在某些情况下,可能需要采取特定的容错措施来解决冲突,但这通常是根据具体的一致性算法和应用场景来决定的。不过,一致性算法的目标是尽量确保数据一致性,而不是强制执行操作。

问题是,如果ZooKeeper 在提案的时候,是不是 要耗时时间呢?因为“同意提案的过程就是用来协调节点之间的一致性。”需要时间嘛

是的,ZooKeeper 中的提案和同意过程会涉及网络通信和节点之间的协调,因此会耗费一定的时间。在分布式系统中,网络通信和节点之间的协调是不可避免的开销,会影响到操作的延迟。

具体耗时的情况取决于多个因素,包括网络延迟、节点的负载、提案的复杂性等等。在一致性算法中,通常会采用一些优化策略来降低延迟,例如批量处理提案、异步通信等。但无论如何,一致性算法的目标是确保数据一致性,因此可能会牺牲一些性能来实现这一目标。

在设计分布式系统时,通常需要权衡一致性和性能之间的关系。某些情况下,可以接受一定的延迟来获得强一致性,而在其他情况下,可能更注重性能和可用性,愿意牺牲一些一致性来提高系统的响应速度。这个权衡取决于应用程序的具体需求和设计目标。

总之,一致性算法中的提案和同意过程可能会耗费一定的时间,但这是为了确保数据一致性而必要的。设计分布式系统时需要根据具体情况来考虑一致性和性能之间的权衡。

然后是ZooKeeper 开始有100个节点,然后坏了10个有九十个了,那么这时是 51算超过半数还是46算超过半数?

在ZooKeeper中,要计算是否超过半数,通常是以初始节点数来计算。如果初始有100个节点,坏了10个后剩下90个,那么51算是超过半数。因为半数是50,而51大于50,所以它仍然被认为是多数节点,可以达成一致。这是为了确保在节点失效后,系统仍然可以继续正常运行,而不至于因为失效节点过多而导致无法达成一致。

为什么不把那10个抛弃掉呢?这样就可以把46当超过半数了

在分布式系统中,抛弃失效节点的策略通常是基于容错性和系统可用性的考虑。抛弃节点可能会导致系统的可用性下降,因为失效节点可能会在未来恢复,而如果抛弃了这些节点,它们将无法参与系统的工作。

通常,一致性算法会采用一种更加鲁棒的策略,即在发生节点故障时,继续尝试与失效节点协调,直到达到多数节点的一致性。这样做的目的是保证系统的可用性,即使在部分节点失效的情况下,系统仍然可以正常工作。

当然,在一些情况下,也可以采用手动或自动的方式将失效节点从系统中排除,这通常是在确定节点永久失效或不可恢复的情况下采取的措施。但这个过程需要小心谨慎,以确保不会误判节点状态,否则可能会导致数据不一致或系统可用性下降。因此,一般情况下,系统会尽量保持容忍部分失效节点的状态,以确保可用性和一致性。

那么Eureka 集群又是怎么回事呢?

Eureka是Netflix开源的一个基于REST的服务注册与发现组件,用于构建分布式系统中的服务注册和发现功能。Eureka集群是一种部署多个Eureka服务器节点的方式,旨在提高可用性和可扩展性。

在Eureka集群中,多个Eureka服务器节点协同工作,它们之间相互注册并维护服务实例的信息。集群中的每个节点都具有相同的功能,可以接受服务提供者注册服务实例的请求,并为服务消费者提供可用的服务列表。Eureka集群通常采用互相注册的方式,以确保节点之间的信息同步。

Eureka集群的好处包括:

  1. 高可用性:由于有多个节点,即使其中一个节点出现故障,其他节点仍然可以继续提供服务注册和发现功能。这提高了系统的可用性。

  2. 可扩展性:当服务数量增加时,可以通过添加新的Eureka服务器节点来扩展集群,而不会影响现有节点的性能。

  3. 负载均衡:Eureka客户端可以与任何集群中的节点通信,因此可以实现负载均衡,分散请求负载。

  4. 自动故障转移:如果某个节点发生故障,Eureka客户端会自动切换到其他可用节点,无需手动干预。

总之,Eureka集群是一种用于构建高可用性、可扩展性和负载均衡的服务注册和发现解决方案。通过部署多个Eureka服务器节点,可以确保系统在面临故障或扩展性需求时能够继续正常运行。

Eureka集群的消息会通过提案吗?

Eureka集群的消息通常不会通过提案(proposal)的方式来实现一致性,因为Eureka的设计目标更侧重于高可用性和可扩展性,而不同于分布式一致性算法如ZooKeeper或Raft。

Eureka集群中的各个节点之间通常采用基于HTTP的RESTful API进行通信,而不是像一致性算法中那样通过提案和投票来实现一致性。集群中的节点会定期互相同步服务实例的信息,以确保节点之间的状态一致。这种方式更适合构建服务注册与发现系统,因为它更加简单和易于实现,不需要严格的一致性保证。

总之,Eureka集群通过定期同步信息来保持节点之间的状态一致,而不是像一致性算法那样通过提案和投票来实现一致性。这种设计使得Eureka更适合用于构建高可用性的服务注册与发现系统。

集群中的节点会定期互相同步服务实例的信息,算法是什么呢?

Eureka集群中的节点之间通常采用基于HTTP的RESTful API来同步服务实例的信息,而不涉及像分布式一致性算法中那样的复杂的提案和投票机制。这是因为Eureka的设计目标更侧重于高可用性和可扩展性,而不同于一致性算法如ZooKeeper或Raft。

Eureka的节点之间的信息同步通常采用以下简化的步骤:

  1. 心跳检测:Eureka客户端会定期向Eureka服务器发送心跳请求,以通知服务器自己的存活状态。

  2. 定期同步:Eureka服务器之间会定期互相同步服务实例的信息。这通常是通过定时的任务来实现的,一个Eureka服务器会向另一个服务器请求最新的服务实例信息。

  3. 失效检测:如果一个节点在一定时间内没有发送心跳或无法连接,其他节点会将其标记为失效。失效节点的信息会从服务列表中移除。

  4. 自我保护模式:Eureka还具有自我保护模式,当集群中的节点相互断开连接时,为了保持可用性,它可以在短时间内允许一些过期的实例信息继续存在,以避免误判节点失效。

需要注意的是,Eureka的信息同步机制相对简单,并不涉及复杂的分布式一致性算法。这使得Eureka更适合构建高可用性和可扩展性的服务注册与发现系统,但在某些情况下可能会牺牲严格的一致性保证。如果需要更强的一致性保证,可以考虑使用基于一致性算法的其他解决方案,如ZooKeeper或Consul。

Eureka 的消费者是有一个服务地址缓存列表的,定期去更新,ZooKeeper 没有服务地址缓存列表,每次都去ZooKeeper 读,对吗?

是的,在Eureka中,服务消费者通常会维护一个本地的服务地址缓存列表,定期从Eureka服务器获取服务实例的信息并更新缓存。这样,服务消费者在一段时间内可以直接从本地缓存中获取服务地址,而不需要每次都去Eureka服务器查询。

而在ZooKeeper中,服务消费者通常需要每次都向ZooKeeper查询服务地址,因为ZooKeeper本身并不提供像Eureka那样的本地缓存机制。这意味着每次服务消费者需要获取服务地址时,都要发起一次ZooKeeper查询操作。

这两种方式各有优劣势。Eureka的本地缓存可以提高查询效率,并减轻了Eureka服务器的负载,但可能会导致本地缓存与实际服务实例列表之间的不一致。而ZooKeeper每次都直接查询可以保证数据的一致性,但可能会增加网络通信和ZooKeeper服务器的负载。

在选择服务注册与发现的解决方案时,需要根据具体的需求和性能要求来权衡这些因素。不同的情况下可能选择不同的实现方式。

你可能感兴趣的:(日常代码,zookeeper,eureka,分布式)