RabbitMQ集群搭建
RabbitMQ集群介绍
rabbitmq有3种运行模式:
- 单机模式
单独运行一个rabbitmq - 普通集群模式
默认模式,该模式并不能达到高可用的目的,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象 - 镜像集群模式
把需要的队列做成镜像队列,存在与多个节点属于**RabbitMQ的HA方案。**该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用
搭建步骤
集群搭建准备
两台安装RabbitMQ的服务器(虚拟机也可,docker也可)
配置
- 配置hosts,两个节点都需要配置
#节点1,例172.17.0.2 rabbit1
ip hostName
#节点2,例172.17.0.3 rabbit2
ip hostName
- 配置erlang
RabbitMQ的集群是依赖erlang集群,而erlang集群是通过.erlang.cookie文件中cookie进行通信认证的
两个节点中的cookie是不一致的,需要把集群中的两台机器中的cookie统一成其中一个的
cd /var/lib/rabbitmq
# 修改cookie
vim .erlang.cookie
注:该文件为只读,需要修改权限
chmod u+w .erlang.cookie
验证状态
rabbitmqctl status
如报如下错误,则是文件权限修改有误,该文件只能用户所有者访问,重新修改即可:chmod 600 .erlang.cookie
Error: Failed to initialize erlang distribution:
“Cookie file /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only”
- 启动普通模式集群
#节点1作为master,将节点2加入集群
rabbitmqctl join_cluster rabbit@rabbit1
#启动节点1
rabbitmqctl start_app
#启动节点2
rabbitmqctl start_app
查看集群状态
rabbitmqctl cluster_status
能正确显示信息,则表示无问题
root@rabbitHost:/# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]},{alarms,[]}]
访问http://ip:port/15672,查看nodes如下图可以看到两个节点启动成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VpxgX3Id-1632635193629)(C:\Users\cxu\AppData\Roaming\Typora\typora-user-images\image-20210926122806711.png)]
rabbitHost和rabbitHostNode为主机名,等同于rabbit1和rabbit2,可在某个节点中新建队列,该队列也会出现在另一个节点,但当创建队列的节点挂了则该队列不可用,也就是目前这种集群属于普通集群,无法做到高可用
附:常见rabbitmqctl命令
rabbitmq-server -deched --后台启动服务
rabbitmqctl start_app --启动服务
rabbitmqctl stop_app --关闭服务
rabbitmq-plugins enable rabbitmq_management --启动web管理插件
rabbitmqctl add_user zlh zlh --添加用户,密码
rabbitmqctl set_user_tags zlh administrator --设置zlh为administrator权限
4.配置镜像模式集群
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
在任意节点执行命令,设置集群规则
参数意思为:
ha-all:为策略名称,:为匹配符,只有一个代表匹配所有,^test为匹配名称为test的exchanges或者queue。
ha-mode:为匹配类型,分为3种模式:all-所有(所有的queue),exctly-部分(需配置ha-params参数,此参数为int类型比如3,众多集群中的随机3台机器),nodes-指定(需配置ha-params参数,此参数为数组类型比如[“rabbit@rabbit1”,“rabbit@rabbit2”]这样指定为rabbit1与rabbit2两台机器)
RabbitMQ web界面配置方式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H6pYJWDA-1632635193631)(C:\Users\cxu\AppData\Roaming\Typora\typora-user-images\image-20210926123703652.png)]
配置完镜像集群后,节点之间可以进行数据同步,相当于每个节点都存了同样的数据,即使某个节点宕机,MQ也能正常提供服务
安装问题
rabbitmq unable to connect to epmd (port 4369) on xxx: address (cannot connect to host/port)
原因:找不到对应的hostName
解决方案:在某节点中应配置所有节点的hosts
例如:
172.17.0.3 rabbit1
172.17.0.2 rabbit2Authentication failed (rejected by the remote node), please check the Erlang cookie
原因:集群中节点未统一配置.erlang.cookie
解决方案:将各个节点.erlang.cookie中的cookie统一
cd /var/lib/rabbitmq
vim .erlang.cookie
修改后错误依旧,只需重启机器即可