• RabbitMQ(十)【高级 - 集群】


    十、RabbitMQ - 高级 - 集群


    上一篇文章内存磁盘的监控

    RabbitMQ 集群

    RabbitMQ 这款消息队列中间件产品本身是基于 Erlang 语言天生具备分布式特性(通过同步 Erlang 集群个节点的 magic cookie 来实现)。因此,RabbitMQ 天然支持 Clustering。这便得 RabbitMQ 本身不需要像 ActiveMQ、Kafka那样通过 Zookeeper 分别来实现 HA 方案和保存集群和元数据。集群是保证可靠性得一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力得目的

    在实际使用过程中采取多机多实例部署方式

    主要参考官方文档https://www.rabbitmq.com/clustering.html

    10.1 集群搭建(在Linux虚拟机上使用docker部署)

    配置得前提是rabbitmq服务可以运行起来,比如ps aux|grep rabbitmq可以看到相关进程,又比如运行rabbitmqctl status可以看到rabbitmq得运行状态

    # 查看 rabbitmq 进程
    [root@vinjcent /]# ps aux|grep rabbitmq
    
    • 1
    • 2

    在这里插入图片描述

    或者

    # 查看 RabbitMQ 进程状态
    [root@vinjcent /]# systemctl status rabbitmq-server
    
    • 1
    • 2

    确保 RabbitMQ 可以运行,确保完成之后,需要将 RabbitMQ 服务停止,后台看不到RabbitMQ得进程为止

    # 停止 RabbitMQ 服务
    [root@vinjcent /]# systemctl stop rabbitmq-server
    
    • 1
    • 2

    环境准备

    • docker
    • java环境
    # 获取rabbitmq镜像
    [root@vinjcent rabbitmq]# docker pull rabbitmq:3.10.5-management
    
    • 1
    • 2

    单机实例搭建

    # 创建容器并启动
    [root@bogon ~]# docker run -d -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.10.5-management
    
    • 1
    • 2

    测试本地访问:http://192.168.159.100:15672/#/

    默认账号密码是guest,guest

    注意:如果运行容器过程出现错误,重启一下docker就可以解决了systemctl restart docker

    docker: Error response from daemon: driver failed programming external connectivity on endpoint rabbitmq01 (77f97c9602f7d8490cc4ac82f67e846b0ed09ba7d1849aa83b2adcad465b2d53): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 15673 -j DNAT --to-destination 172.17.0.2:15672 ! -i docker0: iptables: No chain/target/match by that name.

    集群模式搭建

    1. 首先创建容器映射目录,用于共享容器文件
    # 创建rabbitmq用于存放rabbitmq集群映射信息
    mkdir /mydata/rabbitmq
    # 分别创建各集群映射目录
    cd rabbitmq/
    mkdir rabbitmq01 rabbitmq02 rabbitmq03
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 安装容器并运行
    # rabbitmq01
    docker run -d --hostname rabbitmq01 --name rabbitmq01 -v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='zr' rabbitmq:3.10.5-management
    
    # rabbitmq02
    docker run -d --hostname rabbitmq02 --name rabbitmq02 -v /mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq -p 15674:15672 -p 5674:5672 -e RABBITMQ_ERLANG_COOKIE='zr' --link rabbitmq01:rabbitmq01 rabbitmq:3.10.5-management
    
    # rabbitmq03
    docker run -d --hostname rabbitmq03 --name rabbitmq03 -v /mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq -p 15675:15672 -p 5675:5672 -e RABBITMQ_ERLANG_COOKIE='zr' --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 rabbitmq:3.10.5-management
    
    ### 参数信息
    -d 后台运行
    
    --hostname 设置容器的主机名
    
    --name 设置容器名
    
    -v 设置容器数据卷
    
    -p 本地端口与容器端口映射
    
    --link 配置网络桥接
    
    RABBITMQ_ERLANG_COOKIE 节点认证作用,部署集成时,需要同步该值
    
    RABBITMQ_ERLANG_COOKIE 为rabbitmq多节点之间通信所用到的cookie,rabbitmq集群就是利用这一特性实现的
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在本机测试访问,默认账号密码是guest,guest

    http://192.168.159.100:15673/#/

    http://192.168.159.100:15674/#/

    http://192.168.159.100:15675/#/

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    1. 设置 rabbitmq01 为主节点
    # 1.进入正在运行的rabbitmq01容器
    [root@vinjcent rabbitmq]# docker exec -it rabbitmq01 /bin/bash
    # 2.停止容器中rabbitmq应用
    root@rabbitmq01:/# rabbitmqctl stop_app
    RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
    Stopping rabbit application on node rabbit@rabbitmq01 ...
    # 3.清除节点上的历史数据(如果不清除,无法将节点加入到集群)
    root@rabbitmq01:/# rabbitmqctl reset
    RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
    Resetting node rabbit@rabbitmq01 ...
    # 4.启动应用
    root@rabbitmq01:/# rabbitmqctl start_app
    RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
    Starting node rabbit@rabbitmq01 ...
    
    ### Ctrl + p + q 退出并运行(尽量避免个人的设置的快捷键与之冲突,从而失效)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    1. rabbitmq02加入rabbitmq01
    # 1.进入正在运行的rabbitmq02容器
    [root@vinjcent rabbitmq]# docker exec -it rabbitmq02 /bin/bash
    # 2.停止容器中rabbitmq应用
    root@rabbitmq02:/# rabbitmqctl stop_app
    # 3.清除节点上的历史数据
    root@rabbitmq02:/# rabbitmqctl reset
    # 4.将rabbitmq02节点加入到rabbitmq01(主节点)集群当中
    root@rabbitmq02:/# rabbitmqctl join_cluster --ram rabbit@rabbitmq01
    # 5.启动应用
    root@rabbitmq02:/# rabbitmqctl start_app
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    1. rabbitmq03加入rabbitmq01
    # 1.进入正在运行的rabbitmq03容器
    [root@vinjcent rabbitmq]# docker exec -it rabbitmq03 /bin/bash
    # 2.停止容器中rabbitmq应用
    root@rabbitmq03:/# rabbitmqctl stop_app
    RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
    Stopping rabbit application on node rabbit@rabbitmq03 ...
    # 3.清除节点上的历史数据
    root@rabbitmq03:/# rabbitmqctl reset
    RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
    Resetting node rabbit@rabbitmq03 ...
    # 4.将rabbitmq03节点加入到rabbitmq01(主节点)集群当中
    root@rabbitmq03:/# rabbitmqctl join_cluster --ram rabbit@rabbitmq01
    RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
    Clustering node rabbit@rabbitmq03 with rabbit@rabbitmq01
    
    08:35:58.823 [warning] Feature flags: the previous instance of this node must have failed to write the `feature_flags` file at `/var/lib/rabbitmq/mnesia/rabbit@rabbitmq03-feature_flags`:
    
    08:35:58.823 [warning] Feature flags:   - list of previously disabled feature flags now marked as such: [:maintenance_mode_status]
    
    08:35:59.030 [warning] Feature flags: the previous instance of this node must have failed to write the `feature_flags` file at `/var/lib/rabbitmq/mnesia/rabbit@rabbitmq03-feature_flags`:
    
    08:35:59.030 [warning] Feature flags:   - list of previously enabled feature flags now marked as such: [:maintenance_mode_status]
    
    08:35:59.057 [error] Failed to create a tracked connection table for node :rabbit@rabbitmq03: {:node_not_running, :rabbit@rabbitmq03}
    
    08:35:59.057 [error] Failed to create a per-vhost tracked connection table for node :rabbit@rabbitmq03: {:node_not_running, :rabbit@rabbitmq03}
    
    08:35:59.057 [error] Failed to create a per-user tracked connection table for node :rabbit@rabbitmq03: {:node_not_running, :rabbit@rabbitmq03}
    # 5.启动应用
    root@rabbitmq03:/# rabbitmqctl start_app
    RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
    Starting node rabbit@rabbitmq03 ...
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    1. 在主节点查看web管理界面

    在这里插入图片描述

    添加用户

    ### 在rabbitmq01添加用户
    [root@vinjcent rabbitmq]# docker exec -it rabbitmq01 /bin/bash
    # 创建一个账号、密码为"admin"的用户
    root@rabbitmq01:/# rabbitmqctl add_user admin admin
    # 设置用户身份
    root@rabbitmq01:/# rabbitmqctl set_user_tags admin administrator
    # 设置所有权限
    root@rabbitmq01:/# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    测试数据同步

    1. 主节点创建一个fanout类型交换机

    在这里插入图片描述

    查看从节点的交换机

    在这里插入图片描述

    1. 主节点创建一个队列

    在这里插入图片描述

    查看从节点的消息队列

    在这里插入图片描述

    1. 从节点中将交换机与队列进行绑定

    在这里插入图片描述

    查看主节点的消息队列绑定关系

    在这里插入图片描述

    小结

    如果采用的是多机部署的方式,需读取其中一个节点的cookie,并复制到其它节点(节点之间通过cookie确定相互是否可通信)

    cookie 存放位置:/var/lib/rabbitmq/.erlang.cookie

    例如:主机名分别为 rabbitmq01rabbitmq02rabbitmq03

    1、逐个启动节点

    2、配置个节点的hosts文件(vim /etc/hosts)

    ip1: rabbitmq01

    ip2: rabbitmq02

    ip3: rabbitmq03

    其它的步骤跟单机模式类似

    下一篇文章高级 - 分布式事务

  • 相关阅读:
    利用ICG-NH2/Amine进行DNA标记1686147-55-6星戈瑞
    论文投稿前需要检查下参考文献
    攻防世界—file_include
    Unity Game FrameWork—框架学习—ab打包流程解析
    Oracle内部表X$KFFXP为啥为空?
    51Sim核心参编!《中国智能网联汽车自动驾驶仿真测试白皮书》发布(附资源)
    React 快速上手
    DVWA靶场通关实战
    Linux系统编程02
    Gradle-JDK版本问题导致运行失败
  • 原文地址:https://blog.csdn.net/Wei_Naijia/article/details/126576353