通过错误,理解 HAProxy 负载均衡下的 RabbitMQ |
来源:支点信息 时间:2018-5-25 14:24:24 |
具体错误信息:
Spring Boot 配置 RabbitMQ(使用 HAProxy 负载均衡):
最近使用 RabbitMQ 集群的时候(HAProxy 负载均衡),频繁的出现上面错误信息,但是消息可以正常被消费掉,如果只使用单机版 RabbitMQ 的话(不使用 HAProxy),是没有任何错误的。 被这个问题困扰了很久,Google 找了很多资料,也没有找到解决方案,无意间找到一篇文章:RabbitMQ and HAProxy: a timeout issue 文章说,如果使用 HAProxy 配置 RabbitMQ 高可用集群的话,则会遇到客户端连接超时问题。 为什么会出现此问题呢?因为 HAProxy 配置了客户端连接超时参数(timeout client ms),如果客户端连接超过配置的此参数,那么 HAProxy 将会删除这个客户端连接。 RabbitMQ 客户端使用永久连接到代理,从不超时,那为什么还会出现问题?因为如果 RabbitMQ 在一段时间内处于非活动状态,那么 HAProxy 将自动关闭连接(有点坑呀??)。 那如何解决这个问题呢?我们看到 HAProxy 提供了一个clitcpka参数配置,它可以从客户端发送TCP keepalive数据包。 我们就使用它,但发现配置了之后,还是出现了上面的问题。 为什么呢?
什么意思?意思就是TCP keepalive数据包的发送,取决于操作系统/内核配置。 我们可以使用命令查看(HAProxy 所在服务器中的tcp_keepalive_time配置):
tcp_keepalive_time默认配置时间 2 个小时,表示发送TCP keepalive数据包的间隔时间是 2 个小时,或者说每隔 2 个小时发送TCP keepalive数据包。 这么说就清楚了吧,虽然我们在 HAProxy 中,配置了clitcpka参数,但因为系统发送TCP keepalive数据包的间隔时间过长,远远超过 HAProxy 中的 timeout client超时时间(默认好像是 2 秒),所以客户端连接每隔 2 秒,就被 HAProxy 无情的给删除掉,然后不断的被重建。 说了那么多,我们该怎么解决此问题呢? 两种方案: 修改系统的tcp_keepalive_time配置,间隔时间低于 HAProxy 配置的timeout client超时时间(因为有可能影响其他系统服务,不推荐)。 修改 HAProxy 中的timeout client超时时间,配置大于系统的tcp_keepalive_time间隔时间(推荐) 因为系统tcp_keepalive_time发送TCP keepalive数据包间隔时间是 2 个小时,所以,我们将 HAProxy 中的timeout client超时时间,设置为 3 个小时:
完整示例配置:
重新运行 HAProxy,然后 RabbitMQ 测试成功: |
支点信息是一家以网络技术和数据库技术为主导的高端IT技术培训公司,是Pearson VUE国际IT认证考试中心,支点信息为企业及广大学员提供全面、细致、专业的线上、线下服务,致力于为客户提升良好的职业竞争力。 咨询电话:027-87538988 |
地址:武汉市武昌区华乐商务中心2401(鲁巷购物广场西侧,乘车至“鲁巷站”即到) 邮编:430073 版权所有 2012 支点信息技术有限公司,Copyright © 20112 zd-lab.com All rights reserved 备案号:鄂ICP备07002426号 | 咨询电话:027-87538988 咨询 QQ:200867967 |