服务发现工具和检查节点健康状况的负载均衡器在概念上有什么区别?
What is the conceptual difference between Service Discovery tools and Load Balancers that check node health?
最近有几种服务发现工具变得流行/"mainstream",我想知道在哪些主要用例下应该使用它们而不是传统的负载平衡器。
使用 LB,您将一堆节点聚集在平衡器后面,然后客户端向平衡器发出请求,然后平衡器(通常)将这些请求轮询到集群中的所有节点。
通过服务发现(Consul, ZK 等),您让集中式“共识”服务确定特定服务的哪些节点是健康的,并且您的应用程序连接到该服务认为健康的节点. 因此,虽然服务发现和负载平衡是两个不同的概念,但服务发现为您提供负载平衡作为一个方便的副作用。
但是,如果负载均衡器(比如 HAProxy or nginx)内置了监控和健康检查功能,那么您几乎可以将服务发现作为负载均衡的副作用!意思是,如果我的 LB 知道不要将请求转发到其集群中不健康的节点,那么这在功能上等同于共识服务器告诉我的应用程序不要连接到不健康的节点。
所以对我来说,服务发现工具感觉就像是负载均衡器的“六合一,六合一”。我在这里错过了什么吗?如果某人的应用程序架构完全基于负载均衡的微服务,那么切换到基于服务发现的模型有什么好处(或没有好处)?
负载平衡器通常需要资源的端点来平衡流量负载。随着微服务和基于容器的应用程序的增长,运行时创建的动态容器(docker 容器)是短暂的并且没有静态端点。这些容器端点是短暂的,它们会随着因扩展或其他原因而被逐出和创建而改变。 Consul 等服务发现工具用于存储动态创建的容器(docker 个容器)的端点信息。容器主机上的 consul-registrator 运行 等工具在 consul 等服务发现工具中注册容器端点。 Consul-template 等工具将监听 consul 中容器端点的变化,并更新负载均衡器 (nginx) 以将流量发送到。因此,像 Consul 这样的服务发现工具和像 Nginx 这样的负载平衡工具共存,分别提供运行时服务发现和负载平衡能力。
跟进:与传统 VM 等 "permanent" 节点相比,临时节点(来来去去,生死攸关的节点)有什么好处?
[DDG]:我很快想到的事情:像 docker 容器这样的临时节点适用于 API 等无状态服务(使用外部卷的持久容器有吸引力 - 卷驱动程序等)
速度:启动或销毁临时容器(docker 图像中的容器)只需不到 500 毫秒,而启动传统 VM 只需几分钟
弹性基础设施:在云时代,我们希望根据用户需求进行横向扩展和缩减,这意味着本质上会有短暂的容器(无法保留 IP 等)。想想一个为期一周的营销活动,我们预计流量 TPS 会增加 200%,使用容器快速扩展,然后 post 活动,销毁它。
资源利用率:数据中心或云现在是一台大型计算机(计算集群),容器打包计算集群以实现最大资源利用率,在需求疲软期间破坏基础设施以降低 bill/resource用法。
这在很大程度上是可能的,因为失去了与临时容器的耦合以及使用像 consul 这样的服务发现工具进行运行时发现。传统的 VM 和 IP 的紧密绑定会扼杀这种能力。
请注意,两者不一定相互排斥。例如,您可能仍将客户端定向到负载均衡器(它可能执行其他角色,例如节流),但让负载均衡器使用服务注册表来定位实例。
还值得指出的是,服务发现支持客户端负载平衡,即客户端可以直接调用服务,而无需通过负载平衡器进行额外的跃点。我的理解是,这是 Netflix 开发 Eureka 的原因之一,以避免服务间调用必须通过他们必须支付的外部 ELB 往返。客户端负载平衡还为客户端提供了一种根据其自身的服务可用性观点来影响负载平衡决策的方法。
如果你从一个完全不同的角度来看这些工具,即 ITSM/ITIL,负载平衡变成 "just that",而服务发现是保持你的 CMDB 最新的一部分,并且与您的所有服务及其互连性,以便在停机时更好地了解影响,并在高可用性应用程序的情况下概述可能需要补充的区域。
此外,service-discovery 只为您提供上次扫描的图片,而不是接近实时的(当然取决于您设置的扫描间隔),而负载平衡将保持最新-您的应用程序健康状况的日期图片。
最近有几种服务发现工具变得流行/"mainstream",我想知道在哪些主要用例下应该使用它们而不是传统的负载平衡器。
使用 LB,您将一堆节点聚集在平衡器后面,然后客户端向平衡器发出请求,然后平衡器(通常)将这些请求轮询到集群中的所有节点。
通过服务发现(Consul, ZK 等),您让集中式“共识”服务确定特定服务的哪些节点是健康的,并且您的应用程序连接到该服务认为健康的节点. 因此,虽然服务发现和负载平衡是两个不同的概念,但服务发现为您提供负载平衡作为一个方便的副作用。
但是,如果负载均衡器(比如 HAProxy or nginx)内置了监控和健康检查功能,那么您几乎可以将服务发现作为负载均衡的副作用!意思是,如果我的 LB 知道不要将请求转发到其集群中不健康的节点,那么这在功能上等同于共识服务器告诉我的应用程序不要连接到不健康的节点。
所以对我来说,服务发现工具感觉就像是负载均衡器的“六合一,六合一”。我在这里错过了什么吗?如果某人的应用程序架构完全基于负载均衡的微服务,那么切换到基于服务发现的模型有什么好处(或没有好处)?
负载平衡器通常需要资源的端点来平衡流量负载。随着微服务和基于容器的应用程序的增长,运行时创建的动态容器(docker 容器)是短暂的并且没有静态端点。这些容器端点是短暂的,它们会随着因扩展或其他原因而被逐出和创建而改变。 Consul 等服务发现工具用于存储动态创建的容器(docker 个容器)的端点信息。容器主机上的 consul-registrator 运行 等工具在 consul 等服务发现工具中注册容器端点。 Consul-template 等工具将监听 consul 中容器端点的变化,并更新负载均衡器 (nginx) 以将流量发送到。因此,像 Consul 这样的服务发现工具和像 Nginx 这样的负载平衡工具共存,分别提供运行时服务发现和负载平衡能力。
跟进:与传统 VM 等 "permanent" 节点相比,临时节点(来来去去,生死攸关的节点)有什么好处?
[DDG]:我很快想到的事情:像 docker 容器这样的临时节点适用于 API 等无状态服务(使用外部卷的持久容器有吸引力 - 卷驱动程序等)
速度:启动或销毁临时容器(docker 图像中的容器)只需不到 500 毫秒,而启动传统 VM 只需几分钟
弹性基础设施:在云时代,我们希望根据用户需求进行横向扩展和缩减,这意味着本质上会有短暂的容器(无法保留 IP 等)。想想一个为期一周的营销活动,我们预计流量 TPS 会增加 200%,使用容器快速扩展,然后 post 活动,销毁它。
资源利用率:数据中心或云现在是一台大型计算机(计算集群),容器打包计算集群以实现最大资源利用率,在需求疲软期间破坏基础设施以降低 bill/resource用法。
这在很大程度上是可能的,因为失去了与临时容器的耦合以及使用像 consul 这样的服务发现工具进行运行时发现。传统的 VM 和 IP 的紧密绑定会扼杀这种能力。
请注意,两者不一定相互排斥。例如,您可能仍将客户端定向到负载均衡器(它可能执行其他角色,例如节流),但让负载均衡器使用服务注册表来定位实例。
还值得指出的是,服务发现支持客户端负载平衡,即客户端可以直接调用服务,而无需通过负载平衡器进行额外的跃点。我的理解是,这是 Netflix 开发 Eureka 的原因之一,以避免服务间调用必须通过他们必须支付的外部 ELB 往返。客户端负载平衡还为客户端提供了一种根据其自身的服务可用性观点来影响负载平衡决策的方法。
如果你从一个完全不同的角度来看这些工具,即 ITSM/ITIL,负载平衡变成 "just that",而服务发现是保持你的 CMDB 最新的一部分,并且与您的所有服务及其互连性,以便在停机时更好地了解影响,并在高可用性应用程序的情况下概述可能需要补充的区域。
此外,service-discovery 只为您提供上次扫描的图片,而不是接近实时的(当然取决于您设置的扫描间隔),而负载平衡将保持最新-您的应用程序健康状况的日期图片。