2016-11-21 336 views
0

我试图让RabbitMQ配置在F5负载均衡器后面。我有一个工作的RabbitMQ节点,其默认节点名称为rabbit @%computername%。它设置为侦听所有网络接口(所有IP地址为0.0.0.0:5671,这是AMQP SSL端口),并且工作正常。但是,连接到它的所有客户端应用程序当前正在使用特定的节点名称,例如“%计算机%”。为了利用负载平衡器的容错能力,我想更新所有客户端应用程序以使用负载平衡名称而不是特定节点名称,例如使用HostName =“balancedname.mycompany.com”而不是“%computername%”连接。但是,当我更新我的客户端应用程序以连接到负载平衡名称时,连接失败。我怎样才能使这个工作?带F5负载均衡器的RabbitMQ

我是F5的新手,我注意到池的成员地址是IP地址...应该是节点名称而不是IP吗?甚至有可能看到节点名称可能完全是任意的,并不一定映射到任何网络可解析的东西?我处于托管状态,因为我没有对F5的写入权限,所以尝试这些事情有点棘手。

我在负载平衡RabbitMQ设置上一直没有找到非常多的信息。我明白,所有RabbitMQ队列只存在于一个节点上,我已经将F5设置为主动 - 被动模式,这样流量总是会路由到主节点,除非它停止。

更新1:看来,this issue回来咬我这里。我使用SSL证书进行EXTERNAL身份验证,并且由于客户端使用负载平衡名称而不是节点名称进行连接,并且负载平衡名称未用于创建证书,所以它拒绝了连接。我最终重新生成了证书并使用了负载平衡名称,但这还不够 - 我还必须在Windows主机文件中添加一个条目,以将127.0.0.1和:: 1映射到负载平衡DNS地址。

更新2:更新1仅解决连接问题,用于在作为负载平衡器一部分的应用程序服务器上运行客户端应用程序,但远程客户端无法工作。内部例外说“证书链是由不受信任的权威机构颁发的”。 RabbitMQ + SSL很难。而增加负载平衡使其更加困难。

回答

0

我在回答我自己的问题,希望它能为人们节省一些时间。在我的场景中,我需要客户端连接到像myrabbithost.mycompany.com这样的负载均衡地址,并且只要F5将流量引导到一个节点并且在故障转移到辅助节点(如果它关闭的情况下)。我已经配置了安全性,并使用自签名证书对RabbitMQ进行了身份验证。这些证书具有特定于每个主机的通用名称,这是该问题。为了使用.NET,证书上的通用名称必须与正在连接的服务器名称(myrabbithost.mycompany.com)相匹配。我必须做到以下几点:

  • 与myrabbithost.mycompany.com
  • 的通用名称的RabbitMQ的服务器上生成新的服务器和客户端证书生成一个新的证书的客户,同时为了使用连接使用SSL身份验证
  • 仍然在RabbitMQ服务器上,我必须连接用于证书颁发机构的多个cacert.pem文件,以便客户端可以使用任何节点生成的客户端证书对任何节点进行身份验证。当我修改rabbit.config来使用“all.pem”而不是“cacert.pem”时,客户端能够连接,但是它打破了管理界面,所以我修改了rabbit.config中的rabbitmq_management设置来指定host-具体的cacert.pem文件,它又开始工作。

为了建立高可用性,我建立了一个RabbitMQ集群,但也遇到了一些问题。除了将Erlang cookie从主节点复制到C:\ Windows和C:\ users \ myusername中的辅助节点之外,我必须通过任务管理器终止epmd.exe进程,因为rabbitmqctl join_cluster命令失败,出现“节点向下“错误。 epmd.exe进程在RabbitMQ中断时仍然存在,并且它可能会导致rabbitmqctl.bat报告错误的错误,比如“node down”,即使它没有关闭。