RabbitMQ集群

前言

一般一台RabbitMQ 服务器,无法满足目前真实应用的要求;特别是在RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等情况,如果不使用集群消息队列功能就会完全失效,并且不能支持很高的吞吐量,所以搭建集群是很有必要的。

集群搭建

大致结构:

image-20220903215739041

步骤

  1. 准备三台服务器(可以克隆,可以利用docker创建三个容器)

  2. 配置各个服务器的host文件:vim /etc/hosts

    image-20220903220243851

  3. 要确保各个节点的 cookie 文件使用的是同一个值,在node1上进行远程复制:

    scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookie

    scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/.erlang.cookie

  4. 重新启动 RabbitMQ 服务,顺带启动 Erlang 虚拟机和 RbbitMQ 应用服务(在三台节点上分别执行以下命令):rabbitmq-server -detached

  5. 分别让node2和node3加入到以node1为主的集群中:

    1
    2
    3
    rabbitmqctl stop_app (rabbitmqctl stop 会将Erlang 虚拟机关闭,rabbitmqctl stop_app 只关闭 RabbitMQ 服务) 
    rabbitmqctl reset
    rabbitmqctl join_cluster rabbit@node1 rabbitmqctl start_app(只启动应用服务)
  6. 查看集群状态:rabbitmqctl cluster_status

  7. 需要重新设置用户:

    1
    2
    3
    4
    5
    6
    # 创建账号
    rabbitmqctl add_user admin 123
    # 设置用户角色
    rabbitmqctl set_user_tags admin administrator
    # 设置用户权限
    rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

    解除集群(只需要在node2和node3中执行):

    1
    2
    3
    4
    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl start_app
    rabbitmqctl cluster_status

    在node1上执行:

    1
    2
    rabbitmqctl forget_cluster_node rabbit@node2
    rabbitmqctl forget_cluster_node rabbit@node3

    镜像队列

如果 RabbitMQ 集群中只有一个 Broker 节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能会导致消息的丢失。

引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他 Broker 节点之上,如果集群中的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性。

搭建

  1. 随便给一个节点添加policy(在ui界面里的admin这一栏右侧的policies中):

    image-20220904130344264

  2. 在 node1 上创建一个队列发送一条消息,队列存在镜像队列

  3. 停掉 node1 之后发现 node2 成为镜像队列,并且就算整个集群只剩下一台机器了 依然能消费队列里面的消息说明队列里面的消息被镜像队列传递到相应机器里面了。

实现负载均衡

…..后续学习