负载均衡器是一种允许在多个后端资源之间分配 HTTP 请求(或其他类型的网络请求)的工具。
负载均衡器的主要操作是允许将流量定向到单个地址,以便在多个相同的后端服务器之间分配,从而分散负载并实现更好的吞吐量。通常,流量将通过循环分配,即按顺序在所有这些之间分配:
第一个工人,然后另一个工人,连续:
那是正常的操作。但它也可以用来替换服务。负载均衡器确保每个请求都干净利落地发送给一个工作人员或另一个工作人员。工作池中的服务可以不同,因此我们可以使用它来干净地在一个版本的 Web 服务和另一个版本之间进行转换。
出于我们的目的,负载均衡器后面的一组旧 Web 服务可以添加一个或多个向后兼容的替换服务,而不会中断操作。替换旧服务的新服务将少量添加(可能是一两个工人),以合理配置分配流量,并确保一切按预期工作。验证后,通过停止向旧服务发送新请求、耗尽它们并只留下新服务器来完全替换它。
如果在快速移动中完成,例如在部署新版本的服务时,这称为滚动更新,因此工作人员会被一个接一个地替换。
但对于从旧的单体架构迁移到新的微服务,放慢速度更为明智。服务可以在 5%/95% 的拆分中存活数天,因此任何意外错误只会出现二十分之一的时间,然后迁移到 33/66,然后是 50/50,然后是 100% 迁移。
A highly loaded system with good observability will be able to detect problems very quickly and may only need to wait minutes before proceeding. Most legacy systems will likely not fall into this category, though.
任何能够以反向代理模式运行的 Web 服务器,例如 NGINX,都能够作为负载均衡器工作,但是,对于这个任务,可能最完整的选项是 HAProxy (http://www.haproxy.org/)。
HAProxy 专门用于在高可用性和高需求的情况下充当负载均衡器。它是非常可配置的,并在必要时接受从 HTTP 到较低级别 TCP 连接的流量。它还有一个很棒的状态页面,有助于监控通过它的流量,以及采取快速行动,例如禁用失败的工作人员。
AWS 或 Google 等云提供商也提供集成负载均衡器产品。它们在我们的网络边缘工作非常有趣,因为它们的稳定性使它们很棒,但它们不会像 HAProxy 那样可配置且易于集成到您的操作系统中。例如,Amazon Web Services 提供的产品称为 Elastic Load Balancing (ELB)—https://aws.amazon.com/elasticloadbalancing/。
要从具有 DNS 引用的外部 IP 的传统服务器迁移并在前面放置负载均衡器,您需要遵循以下过程:
- Create a new DNS to access the current system. This will allow you to refer to the old system independently when the transition is done.
- Deploy your load balancer, configured to serve the traffic to your old system on the old DNS. This way, accessing either the load balancer or the old system, the request will ultimately be delivered in the same place. Create a DNS just for the load balancer, to allow referring specifically to it.
- Test that sending a request to the load balancer directed to the host of the old DNS works as expected. You can send a request using the following curl command:
- Change the DNS to point to the load balancer IP. Changing DNS registries takes time, as caches will be involved. During that time, no matter where the request is received, it will be processed in the same way. Leave this state for a day or two, to be totally sure that every possible cache is outdated and uses the new IP value.
- The old IP is no longer in use. The server can (and should) be removed from the externally facing network, leaving only the load balancer to connect. Any request that needs to go to the old server can use its specific new DNS.
请注意,像 HAProxy 这样的负载均衡器可以使用 URL 路径,这意味着它可以将不同的路径定向到不同的微服务,这在从单体应用迁移时非常有用。
Because a load balancer is a single point of failure, you'll need to load balance your load balancer. The easiest way of doing it is creating several identical copies of HAProxy, as you'd do with any other web service, and adding a cloud provider load balancer on top.
因为 HAProxy 用途广泛且速度快,如果配置正确,您可以将其用作重定向请求的中心点——以真正的微服务方式!