Nginx:ip_hash 背后的算法

0 nginx

来自我的两个亚马逊节点的请求进入同一个后端节点。我想弄清楚为什么?

通过谷歌搜索,我发现“散列是使用客户端地址的 C 类网络地址完成的”

如果可能的话,任何人都可以用一些例子来解释我 ip_hash 背后的算法。

Kvi*_*sle 5

非常简短的回答:coincodence 就是原因。散列算法使它最终出现在同一个存储桶中,它试图解决的问题是“确保同一个客户端总是与同一个后端通信——但仍然尝试在我的后端保持相当均匀的分布”。

它与其他 IP 散列算法等效。在一个非常基本的层面上:

  1. 您查看与您联系的对等方的 IP 地址。
  2. 您对它进行哈希处理 - 这样做会为您提供一个相当随机的数字(但是,对于同一地址始终相同)- 比 IP 地址更随机,这取决于您的用户可能非常连续。
  3. 通过执行选择后端 hash % backends

通过这样做,您完成的是相当均匀的客户分布 - 但您应该能够期望客户为每个请求保持与同一个后端通信。例如,如果您将会话数据存储在每个服务器上,这将非常有用。

如果您只想将负载分散到后端,并且就您的应用程序而言无需担心;Round Robin 是一个更好的选择——你会得到更均匀的传播(即使在大多数情况下只是轻微的——ip_hash 效果很好)——并且由于不花时间散列客户端地址,它会消耗更少的资源。