Nginx 基于TCP负载对动态服务器集进行一致哈希

Nginx 基于TCP负载对动态服务器集进行一致哈希,nginx,networking,tcp,haproxy,consistent-hashing,Nginx,Networking,Tcp,Haproxy,Consistent Hashing,我有一个场景,我需要通过HAProxy或nginx这样的代理将TCP流量路由到一组动态的后端服务器(确切地说是Kubernetes pods,但在本文中我们可以忽略它)。流量需要根据客户端在TCP有效负载中提供的密钥(称之为路由_密钥)进行路由 我发现nginx和HAProxy都支持一致的散列。然而,根据HAProxy的(参见“平衡”一节)可以看出,没有办法基于TCP负载执行一致的散列。基于负载的负载平衡似乎仅限于L7HTTP参数,如Header和URI参数。概述了一种基于字符串匹配TCP负载的

我有一个场景,我需要通过HAProxy或nginx这样的代理将TCP流量路由到一组动态的后端服务器(确切地说是Kubernetes pods,但在本文中我们可以忽略它)。流量需要根据客户端在TCP有效负载中提供的密钥(称之为路由_密钥)进行路由

我发现nginx和HAProxy都支持一致的散列。然而,根据HAProxy的(参见“平衡”一节)可以看出,没有办法基于TCP负载执行一致的散列。基于负载的负载平衡似乎仅限于L7HTTP参数,如Header和URI参数。概述了一种基于字符串匹配TCP负载的静态平衡方法,但我的案例更具动态性,因此更倾向于使用真正一致的哈希方法

Nginx似乎提供了更大的灵活性,因为您可以将散列值设置为任意变量。这似乎适用于L7(“后端”小节)和L4(“流”小节)。然而,我有点不清楚你是什么,不允许对变量做什么。有没有人举过一个例子,将变量设置为从TCP负载中提取的值,并使用该值进行一致性哈希


最后一个有奖问题:路由_密钥值实际上是一个AES-GCM加密值。代理服务器可以访问用于解密此值的密钥。是否有可能让nginx从TCP负载中获取路由密钥值,使用已知密钥对其进行解密,然后使用该密钥进行一致性哈希?这会涉及到创建一个nginscript模块吗

在HAProxy 2.1中,您是否可以将aes\u gcm\u dec(…)与请求有效负载(…)结合使用,以满足此类要求

我的想法,未经检验

listen tcp-in
  bind :443 ssl cert 
  tcp-request inspect-delay 10s
  tcp-request session set-var(sess.routingkey) req.payload(0,500)

  # for consistent hashing try this
  hash-type consistent wt6

  use_backend %[var(sess.routingkey),aes_gcm_dec(128,txn.nonce,Zm9vb2Zvb29mb29wZm9vbw==,txn.aead_tag)]
这里还有指向html文档的链接。



hash-type-consistent…

中进行了描述,这可能是我对HA代理如何工作的无知,但这是否满足了一致哈希的要求?我不太清楚解密后的有效负载如何转换为哈希,该哈希将一致地映射到许多后端中的特定后端。您可以尝试将
哈希类型设置为一致的wt6
。但你是对的,我也没有看到一个基于tcp负载的平衡选项。也许你可以在邮件列表上询问一些如何解决你的问题的想法haproxy@formilux.org