单一模式

参考https://blog.haomingzx.top/2020/02/22/RabbitMQ%E5%AD%A6%E4%B9%A0/

登录rabbitmq报错User can only log in via localhost?

配置文件/etc/rabbitmq/添加 如下配置

loopback_users = none

普通模式

默认的集群模式。

环境

IP地址 主机名 操作系统 防火墙和SELinux 用途
192.168.56.114 mq1 CentOS7(64位) 关闭 磁盘节点
192.168.56.115 mq2 CentOS7(64位) 关闭 内存节点

RabbitMQ集群节点必须在同一网段里,如果是跨广域网,效果会变差。

配置

  1. 修改主机名 vi /etc/hostname,mq2相同操作,修改后需要重启系统生效。

    mq1.localdomain

  2. 修改hosts文件 vi /etc/hosts

    192.168.56.114 mq1
    192.168.56.125 mq2
  3. 拷贝erlang.cookie

    Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群景象。Erlang的集群中各节点是经由过程一个magic cookie来实现的,这个cookie存放在/var/lib/rabbitmq/.erlang.cookie中,文件是400的权限。所以必须保证各节点cookie一致,不然节点之间就无法通信。

  4. 安装插件

    rabbitmq-plugins list //查看插件安装情况
    rabbitmq-plugins enable rabbitmq_management //启用rabbitmq_management服务
  5. 将mq1作为内存节点加入mq1节点集群中,在mq2执行如下命令:

    rabbitmqctl stop_app    //停掉rabbit应用
    rabbitmqctl join_cluster --ram rabbit@mq1 //加入到磁盘节点 ram表示内存节点
    rabbitmqctl start_app  //启动rabbit应用
  6. 查看集群状态

    rabbitmqctl cluster_status

  7. 更改节点类型

    内存节点: 内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。例外情况是:持久的 queue 的内容将被保存到磁盘。

    磁盘节点: 将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启 RabbitMQ 的时候,丢失系统的配置信息。

    注意点:

    1、内存节点由于不进行磁盘读写,它的性能比磁盘节点高。

    2、集群中可以存在多个磁盘节点,磁盘节点越多整个集群可用性越好,但是集群整体性能不会线性增加,需要权衡考虑。

    3、RabbitMQ 要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。

    4、设置两个磁盘节点,至少有一个是可用的,可以保存元数据的更改。

    # 停止节点 
    sbin/rabbitmqctl stop_app 
    # 与集群通讯,从集群中删除节点 
    sbin/rabbitmqctl reset 
    # 以RAM模式重新加入集群 
    sbin/rabbitmqctl join_cluster rabbit@MQ1 --ram 
    # 启动节点 
    sbin/rabbitmqctl start_app 

    节点单机状态时,reset 命令将清空节点的状态,并将其恢复到空白状态。当节点是集群的一部分时,该命令也会和集群中的磁盘节点通信,告诉他们该节点正在离开集群。

    这很重要,不然,集群会认为该节点出了故障,并期望其最终能够恢复回来,在该节点回来之前,集群禁止新的节点加入。

镜像模式

把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适用;要实现镜像模式,需要先搭建一个普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用。

上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。虽然该模式解决一项目组节点压力,但队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。

镜像队列是基于普通的集群模式的,然后再添加一些策略,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做。

配置

图形界面配置
  1. 登录控制台 http://192.168.56.114:15672/#/

    • Name:策略名称
    • Pattern:匹配的规则,这里表示匹配a开头的队列,如果是匹配所有的队列,那就是^.
    • Definition:使用ha-mode模式中的all,也就是同步所有匹配的队列。问号链接帮助文档。
命令行配置

rabbitmqctl set_policy <name> [-p <vhost>] <pattern> <definition> [--apply-to <apply-to>]

name: 策略名称    
vhost: 指定vhost, 默认值 /    
pattern: 通过正则表达式匹配哪些需要镜像, ^为所有    
definition:         
ha-mode: 指明镜像队列的模式,有效值为 all/exactly/nodes
	all     表示在集群所有的节点上进行镜像,无需设置ha-params            
	exactly 表示在指定个数的节点上进行镜像,节点的个数由ha-params指定             
	nodes   表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params: 
	ha-mode 模式需要用到的参数         
ha-sync-mode: 镜像队列中消息的同步方式,有效值为automatic,manually    
apply-to: 策略作用对象。可选值3个,默认all 
	exchanges 表示镜像 exchange       
	queues    表示镜像 queue        
	all       表示镜像 exchange和queue

示例命令:

rabbitmqctl set_policy admin "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

ha-mode ha-params 功能
all 镜像队列将会在整个集群中复制。当一个新的节点加入后,也会在这 个节点上复制一份。
exactly count 镜像队列将会在集群上复制 count 份。如果集群数量少于 count 时候,队列会复制到所有节点上。如果大于 Count 集群,有一个节点 crash 后,新进入节点也不会做新的镜像。
nodes node name 镜像队列会在 node name 中复制。如果这个名称不是集群中的一个,这不会触发错误。如果在这个 node list 中没有一个节点在线,那么这个 queue 会被声明在 client 连接的节点。

测试

参考

https://blog.51cto.com/11134648/2155934

https://www.rabbitmq.com/access-control.html#default-state

https://www.cnblogs.com/passzhang/p/13207426.html