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也可)

配置

  1. 配置hosts,两个节点都需要配置
#节点1,例172.17.0.2 rabbit1
ip hostName
#节点2,例172.17.0.3 rabbit2
ip hostName
  1. 配置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. 启动普通模式集群
#节点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

修改后错误依旧,只需重启机器即可