在一组服务器之间分配请求的最佳负载平衡算法?
Best load balancing algorithm to distribute requests across a group of servers?
在一组服务器之间分配传入请求的负载平衡算法是哪种更好?我读到它们是一些算法,例如 Round Robin.. 但我想知道您对此有更好或至少最常用的算法的看法。
希望大家能帮帮我。
答案是:视情况而定。当考虑特定于服务的多个因素时,可以实现最佳负载平衡。例如,假设您有一项服务提供 API 来对字符串进行编码,其中编码完全取决于字符串的内容。您有服务的 N 个副本 运行。
一种简单的方法是让客户端选择服务索引 i = hash(string)/N。假设输入字符串均匀分布在散列 space 上,这将工作得很好并且很容易实现。
现在说出于某种原因,由于某些原因,字符串在散列上分布不均space(例如,可能会重复很多字符串)。在这种情况下,您可以使用一种简单的方法进行循环,或随机选择一个索引。您还可以测量来自服务器的背压:例如,如果 RPC 调用是同步的,您可以在客户端测量它需要多长时间,并且在字符串编码的情况下,将其除以细绳;如果客户端注意到此数字上升,则可能意味着服务无法跟上,客户端可以减少发送给此类客户端的流量。这显然有点复杂。
TLDR:负载平衡有很多选项,"the best"取决于要扩展的问题的具体性质。
1- 循环赛
2-加权循环
3- 最少连接数
4- 加权最少连接数
5-随机
请看这个url:
对于 HTTP 服务器,Round Robin、Weight Round Robin 和 Random 可能是最常用和最安全的模式,因为它们不会创建因试图确定要发送到哪个主机而引起的热点。
我知道可以使用多层方法来平均分配请求。这是你有 2 个集群的地方,它们是 Round Robined,每个集群都有几个随机分布的服务器。
最少连接和最快响应依赖于根据过去的性能预测每台服务器的性能。虽然它们对某些类型的负载很有用——比如很多长 运行 连接,但它们对于高流量的网络服务器可能会有问题,因为它们可能导致对新部署的服务器或刚刚崩溃的服务器的大量请求.
理想的负载平衡算法是 HTTP 并不真正支持的算法 - 'Competing consumers'。这是许多队列系统的工作方式(例如 RabbitMq)。客户端拉取消息而不是将消息推送给他们。最快接受工作的那个
- 因此最有空执行它的人 - 将获得它。
HTTP 网络服务器是基于推送而非拉取的,因此这种模式并不适合。
但是,可以使用实现请求-响应模式的中间代理自己构建这种解决方案,但它也有自己的挑战。
在一组服务器之间分配传入请求的负载平衡算法是哪种更好?我读到它们是一些算法,例如 Round Robin.. 但我想知道您对此有更好或至少最常用的算法的看法。
希望大家能帮帮我。
答案是:视情况而定。当考虑特定于服务的多个因素时,可以实现最佳负载平衡。例如,假设您有一项服务提供 API 来对字符串进行编码,其中编码完全取决于字符串的内容。您有服务的 N 个副本 运行。
一种简单的方法是让客户端选择服务索引 i = hash(string)/N。假设输入字符串均匀分布在散列 space 上,这将工作得很好并且很容易实现。
现在说出于某种原因,由于某些原因,字符串在散列上分布不均space(例如,可能会重复很多字符串)。在这种情况下,您可以使用一种简单的方法进行循环,或随机选择一个索引。您还可以测量来自服务器的背压:例如,如果 RPC 调用是同步的,您可以在客户端测量它需要多长时间,并且在字符串编码的情况下,将其除以细绳;如果客户端注意到此数字上升,则可能意味着服务无法跟上,客户端可以减少发送给此类客户端的流量。这显然有点复杂。
TLDR:负载平衡有很多选项,"the best"取决于要扩展的问题的具体性质。
1- 循环赛
2-加权循环
3- 最少连接数
4- 加权最少连接数
5-随机
请看这个url:
对于 HTTP 服务器,Round Robin、Weight Round Robin 和 Random 可能是最常用和最安全的模式,因为它们不会创建因试图确定要发送到哪个主机而引起的热点。
我知道可以使用多层方法来平均分配请求。这是你有 2 个集群的地方,它们是 Round Robined,每个集群都有几个随机分布的服务器。
最少连接和最快响应依赖于根据过去的性能预测每台服务器的性能。虽然它们对某些类型的负载很有用——比如很多长 运行 连接,但它们对于高流量的网络服务器可能会有问题,因为它们可能导致对新部署的服务器或刚刚崩溃的服务器的大量请求.
理想的负载平衡算法是 HTTP 并不真正支持的算法 - 'Competing consumers'。这是许多队列系统的工作方式(例如 RabbitMq)。客户端拉取消息而不是将消息推送给他们。最快接受工作的那个 - 因此最有空执行它的人 - 将获得它。
HTTP 网络服务器是基于推送而非拉取的,因此这种模式并不适合。
但是,可以使用实现请求-响应模式的中间代理自己构建这种解决方案,但它也有自己的挑战。