首先看一下rabbitmq集群镜像模式的示意图
坑1:possibly caused by authentication failure rabbitmq错误
参考:Access Control (Authentication, Authorisation) in RabbitMQ
默认的Virtual Host和User
virtual host /
user guest password guest,并且赋予virtual host / 的所有权限
所以推荐删除这个guest用户或者修改其密码
而且默认情况下,guest用户是不允许远程连接broker的,其只能通过loopback interface即localhost来连接。
如果希望允许guest用户通过远程来连接,那么应设置loopback_users为none
loopback_users = none
坑2:使用keepalived带来两个问题
参考:keepalived配置学习,解决vip无法ping通,虚拟服务器端口无法访问的问题
1. vip虚拟ip ping不通
解决方法是:在keepalived.conf中显式配置 vrrp_strict,并#vrrp_strict
2. ping通之后,无法连接rabbitmq java client
rabbitmq java client,也就是我用java写的rabbitmq producer和consumer,连接不上vip,或者偶尔能连接上,但是大多数情况都是connection err
这个问题搞了好久,其实整个链路分成好几块部分。
我的rabbitmq java client连接vip,然后转到haproxy,haproxy再转到rabbitmq mirror cluster
于是在本地telnet vip 端口,结果发现果然不是很稳定
怎么办呢?那么要从整个链路上去分析了
想法1:keepalived的tcp连接设置为长连接,这样我的rabbitmq java client就能连接好了
于是,在haproxy.conf中配置
试了一下,好像也没啥效果
想法2:
参考:解决 RabbitMQ 集群 Channel shutdown: connection error 错误(HAProxy 负载均衡)
这篇文章讲了HAProxy和rabbitmq java client的连接
如果使用 HAProxy 配置 RabbitMQ 高可用集群的话,则会遇到客户端连接超时问题。
为什么会出现此问题呢?因为 HAProxy 配置了客户端连接超时参数(timeout client ms),如果客户端连接超过配置的此参数,那么 HAProxy 将会删除这个客户端连接。
RabbitMQ 客户端使用永久连接到代理,从不超时,那为什么还会出现问题?因为如果 RabbitMQ 在一段时间内处于非活动状态,那么 HAProxy 将自动关闭连接(有点坑呀?)。
因为系统发送TCP keepalive数据包的间隔时间过长,远远超过 HAProxy 中的 timeout client超时时间(默认好像是 2 秒),所以客户端连接每隔 2 秒,就被 HAProxy 无情的给删除掉,然后不断的被重建
给haproxy.conf中添加
timeout client 3h
timeout server 3h
果然,加了这两个参数,不再超时了
haproxy的一些配置,有时间可以看一下
坑3:给vhost指定rabbitmq set_policy ha-all
在rabbitmq mirror cluster中,如果没有指定rabbitmq set_policy,那么并不会开启镜像队列,其只会使用master
如
那么命令
rabbitmqctl set_policy ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
其实是对vhost /(默认vhost)开启ha-all
而且如果没有指定ha-sync-mode,那么如果某个node down,会出现下面的情况
需要手动来resync
比如说我们新建了一个用户,并指定了一个新的vhost,那么要记得给这个vhost指定rabbitmq set policy
rabbitmqctl set_policy -p "/vhost_simple" ha-all "^" '{"ha-mode":"all", "ha-sync-mode":"automatic"}'
这样才开启了ha-all