作者:管理员  历史版本:1  最后编辑:Eddy  更新时间:2024-11-15 09:05

RabbiMQ模式

RabbitMQ模式大概分为以下三种:

  1. 单一模式。

  2. 普通模式(默认的集群模式)。

  3. 镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适用)。

要实现镜像模式,需要先搭建一个普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用。

RabbitMQ的集群节点包括内存节点、磁盘节点。RabbitMQ支持消息的持久化
也就是数据写在磁盘上,最合适的方案就是既有内存节点,又有磁盘节点。

集群搭建

环境准备

IP地址 操作系统 防火墙和SELinux
192.168.3.207 CentOS7.4(64位) 关闭

在服务器中安装好RabbitMQ,以及开启了相关插件.

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

单机多实例

启动3个实例

# 因为配置了web管理插件,所以还要指定其web插件占用的端口号,如果不指定,将不能启动多个节点,因为端口号被占用
# 此为单机模式下的启动方式,非单机模式直接启动对应服务器中的rabbtitmq即可
RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit rabbitmq-server -detached

RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached

RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached

组成集群

#我们以rabbit为主节点,剩下两个为从节点(在从节点执行以下命令,主节点不用动,-n指定具体那个节点,非单机情况下无需指定)
$ rabbitmqctl -n rabbit2 stop_app
$ rabbitmqctl -n rabbit2 reset
$ rabbitmqctl -n rabbit2 join_cluster rabbit@`hostname` --ram 
$ rabbitmqctl -n rabbit2 start_app

# --ram 表示指定为内存节点,一个集群中最少要有一个磁盘节点,默认为磁盘节点
# 如果想要更改节点类型,可以使用命令rabbitmqctl change_cluster_node_type disc(ram),前提是必须停掉rabbit应用
# 另一个从节点操作同上

配置镜像队列

rabbitmqctl set_policy ha-all "^my" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
# ha-all:为策略名称;
# ^my:为匹配符,只有一个^代表匹配所有,^abc为匹配名称以abc开头的queue或exchange;
# ha-mode:为同步模式,一共3种模式:
#    ①all-所有(所有的节点都同步消息),
#    ②exctly-指定节点的数目(需配置ha-params参数,此参数为int类型比如2,在集群中随机抽取2个节点同步消息)
#    ③nodes-指定具体节点(需配置ha-params参数,此参数为数组类型比如["rabbit@rabbitmq1","rabbit@rabbitmq2"],明确指定在这两个节点上同步消息)。

三个实例启动成功后,连接其中一个节点的管理页面,可以看到相关节点信息,如下图所示:

策略信息配置信息页面

消息队列信息页面

配置

在任一节点添加用户并设置密码,以及添加vhost,其他节点会自动同步此配置,但是/etc/rabbitmq/rabbitmq.config文件不会同步.

删除节点

rabbitmqctl forget_cluster_node rabbit3@hostname

查看节点信息

rabbitmqctl -n rabbit cluster_status

非单机情况下需要拷贝erlang.cookie

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