RabbitMQ使用docker搭建集群并使用Haproxy实现负载均衡(多机镜像模式)

简介: RabbitMQ使用docker搭建集群并使用Haproxy实现负载均衡(多机镜像模式)

RabbitMQ使用docker搭建集群并使用Haproxy实现负载均衡(多机)

=======================================================

准备工作

  • 服务器准备,当前是使用两台阿里云服务器(系统版本:CentOS Linux release 7.6.1810),使用相同地区的服务器,相互通讯可以使用阿里云内网。
  • 服务器安装docker,可自行查找安装资料。Docker官网安装教程:Docker官网安装教程
  • Docker创建RabbitMQ镜像
    使用docker pull指令拉取镜像:docker pull rabbitmq:management
    这里为拉取的最新版本rabbitmq,management版本内置可视化插件,若非management版,需在安装后执行rabbitmq-plugins enable rabbitmq_management 安装可视化组件,否则,无法通过浏览器访问管理页面。
    若想指定版本可以在冒号后添加相应版本号。
    例:docker pull rabbitmq:3.9.22-management-alpine

运行RabbitMQ

第一台服务器(ip1)

  • 用docker run指令创建rabbitMQ容器,此台服务器作为主节点。
    docker run  -d --hostname rabbitmq1 \
    --restart unless-stopped \
    --name rabbitmq1 \
    -p 4369:4369 \
    -p 25672:25672 \
    -p 8172:15672 \
    -p 8072:5672 \
    -e RABBITMQ_ERLANG_COOKIE='tuhugc_cookie_220921' \
    -v /mnt/data/rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
    rabbitmq:management

创建后可通过ip1:8172来访问后台管理界面如图:
1663809814654.jpg

第二台服务器(ip2)

  • 创建容器,此服务器作为从节点。

      docker run  -d --hostname rabbitmq2 \
      --add-host rabbitmq1:xxxx \
      --restart unless-stopped \
      --name rabbitmq2 \
      -p 4369:4369 \
      -p 25672:25672 \
      -p 8172:15672 \
      -p 8072:5672 \
      -e RABBITMQ_ERLANG_COOKIE='tuhugc_cookie_220921' \
      -v /mnt/data/rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
      rabbitmq:management

    创建后后台界面和第一台服务器一样,此时就启动了两台单体的服务器。

  • 上面docker run指令中的参数简要说明如下

      -d 容器后台运行
      --hostname rabbitmq1 容器的主机名为 rabbitmq1
      --add-host rabbitmq2:xxxx  修改容器内部的hosts,添加的集群服务器都需要添加进来
      --restart=unless-stopped docker 容器重启后重启MQ
      --name rabbitmq1 容器名为rabbitma1,在宿主机上运行“docker ps”命令时显示的名称
      -p 8072:5672 消息通讯端口
      -p 8172:15672 后台管理端口
      -p 4369:4369 在 Erlang 集群中相当于 dns 的作用,绑定在4369端口上
      -p 25672:25672 25672端口用于节点间和CLI工具通信(Erlang分发服务器端口)
      -e RABBITMQ_ERLANG_COOKIE='xxxxxxxxx' 设置Erlang Cookie 值,此值必须相同,也就是一个集群内 RABBITMQ_ERLANG_COOKIE 参数的值必须相同。
      因为 RabbitMQ 是用Erlang实现的,Erlang Cookie 相当于不同节点之间通讯的密钥,Erlang节点通过交换 Erlang Cookie 获得认证。
      -v /mnt/data/rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf 挂载rabbitmq的配置文件
    • 简单基础配置文件如下,其他配置请根据实际情况增删
      loopback_users.guest = false   允许其他主机访问RabbitMQ的控制页面
      listeners.tcp.default = 5672   声明通讯端口
      default_pass = defalt_password  设置默认管理员密码
      default_user = default_user     设置默认管理员账号
      default_vhost = default_vhost  创建一个默认的Virtual Hosts,用于账号和服务隔离
      management.tcp.port = 15672    声明后台管理页面端口

配置集群

  • 第一台服务器重启为主节点

      docker exec -it rabbitmq1 /bin/bash
      rabbitmqctl stop_app
      rabbitmqctl reset
      rabbitmqctl start_app
      exit
  • 第二台服务器加入到主节点

    docker exec -it rabbit3 bash
    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl join_cluster --ram rabbit@rabbitmq1
    rabbitmqctl start_app
    exit
  • 注意事项

    1. 在执行rabbitmqctl相关指令时,可能会出现

    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.
    这里是指RABBITMQ_ERLANG_COOKIE环境变量支持已弃用,在未来版本中将被删除。一般是因为使用的rabbitmq版本较高导致的,可以降低版本或者根据提示使用新版的配置方式,
    来避免这条提示。当然,不管它接着执行其余指令也可以,不会影响操作(以后完全弃用后就不能使用了)。顺便说一句,这个RABBITMQ_ERLANG_COOKIE是在docker启动的时候使用的。

    1. 若在执行rabbitmqctl指令时,一般是join_cluster时出现

    unable to connect to epmd (port 4369) on xxxx: timeout (timed out)
    这里就要检查一下主节点所在服务器是否开启了4369端口,或者docker run的时候是否将4369端口映射成了其他的端口。在docker run的时候尽量将4369端口不做修改的映射到宿主机,即-p 4369:4369

    1. 运行时的配置说明
      -ram 表示设置为内存节点,忽略此参数默认为磁盘节点。
      一般节点会配置3个或3个以上,本示例只是简单的一个demo,只配置了两个节点,一个磁盘节点(主节点),一个内存节点。
      若想修改节点类型可通过下面的指令进行切换:

      rabbitmqctl stop_app
      rabbitmqctl change_cluster_node_type dist
      rabbitmqctl change_cluster_node_type ram
      rabbitmqctl start_app

执行完成后通过15672端口(这里通过docker映射为8172)访问管理页面,如下图:
1111.jpg

其中节点类型等信息都展示。当前为普通集群模式,可以自行测试一下。在一台服务器上创建交换器和队列,并绑定。在另一台上可以看到已经同步,发送消息发现两台服务器都存在。
在一个节点中消费了该消息,其他节点中将不会存在该消息。

将集群配置为镜像集群

镜像模式可以通过指令进行配置,也可以通过管理页面进行配置。

这里简单演示一下管理页面的配置方式:
mirrors.jpg

以admin身份进入管理页面后,在Admin中,点击右侧的Policies,之后点击Add / update a policy 来添加策略。
其中的参数说明:

  Name:policy的名称

  Pattern: queue的匹配模式(正则表达式)

  priority:可选参数,policy的优先级

  Definition:镜像定义,包括三个部分ha-mode、ha-params、ha-sync-mode

    ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes

      all:表示在集群中所有的节点上进行镜像

      exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定

      nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定

    ha-params:ha-mode模式需要用到的参数

    ha-sync-mode:进行队列中消息的同步方式,有效值为automatic(自动)和manual(手动)

相应的填入值即可配置成功,之后可通过队列查看。如下配置即为,匹配所有以test_开头的队列,并设置所有节点都参与镜像。
addPolicies.jpg

设置好后,可以在队列中查看镜像情况,其中以test_开头的队列,皆以镜像模式集群。可自行进行测试。

注意事项

上面简单说明了如何搭建rabbitmq集群。要注意的是在镜像模式中,集群的开启与关闭要有顺序的,因为没有一个指令可以统一关闭和开启集群,
所以只能一个个节点进行关闭和开启。这里要最后关闭磁盘存储的节点,以保证数据不会丢失。同时要注意,关闭顺序和启动顺序要相反。
即关闭时为1、2、3,则开启顺序为3、2、1。

集群的简单搭建大概就是这样了,虽然镜像模式可以算是"高可用",真实项目中,还是要搭配Nginx或者HaProxy等搭建负载均衡体系。

搭建Haproxy实现负载均衡

docker部署Haproxy

  • 使用docker拉取官方镜像
    docker pull haproxy
  • 创建haproxy.cfg配置文件
    在宿主机上创建haproxy.cfg

    mkdir haproxy   
    vi haproxy.cfg

    配置内容如下:

    global
      daemon
      maxconn 10000
      #日志输出配置,所有日志都记录在本机,以local0的日志级别(系统不可用)输出
      #local0~local7
      # emerg 0-系统不可用      alert 1-必须马上采取行动的事件
      # crit 2-关键的事件       err 3-错误事件
      # warning 4-警告事件      notice 5-普通但重要的事件
      # info 6-有用的信息       debug 7-调试信息
     log 127.0.0.1 local0 info
    
    defaults
      mode http
      #应用全局的日志配置
      log global
      #超时配置
      timeout connect 5000ms
      timeout client 5000ms
      timeout server 5000ms
      timeout check 2000ms
    
    #负载均衡的名字(自定义)
    #监听8066端口并转发到rabbitmq服务
    listen rabbitmq_cluster
      bind 0.0.0.0:8066#对外提供的虚拟的端口
      option tcplog
      mode tcp
      #负载均衡算法为轮询
      balance roundrobin
      #对后端服务器的健康状况检查间隔为5000毫秒,
      #连续2次健康检查成功,则认为是有效的,连续3次健康检查失败,则认为服务器宕机
      server rabbit1 xxx.xxx.xxx.xxx:8072 check inter 5000ms rise 2 fall 3
      server rabbit2 xxx.xxx.xxx.xxx:8072 check inter 5000ms rise 2 fall 3
      
    #haproxy的客户页面
    listen http_front 
      bind 0.0.0.0:8266
      stats uri /haproxy #页面地址
      #页面的用户名和密码,建议主备设为不同,方便确定抢占到VIP的服务器是主机还是备机
      stats auth root:tuhugc20221008 
      stats admin if TRUE #管理界面,成功登陆后可通过webui管理节点
    
    #rabbit管理页面,监听8166端口转发到rabbitmq的客户端
    listen rabbitmq_admin 
      bind 0.0.0.0:8166
      server rabbit1 xxx.xxx.xxx.xxx:8172 check inter 5000ms rise 2 fall 3
      server rabbit2 xxx.xxx.xxx.xxx:8172 check inter 5000ms rise 2 fall 3

    其中xxx.xxx.xxx.xxx 替换为对应的rabbitmq所在服务器的IP地址。8072为rabbitmq宿主机映射的5672端口,8172为15672端口。这里自行根据实际情况更改。

  • 运行haproxy容器

    #-v 中的参数:ro表示read only,宿主文件为只读。如果不加此参数默认为rw,即允许容器对宿主文件的读写   
    #一定要添加--privileged参数,使用该参数,container内的root拥有真正的root权限。   
    #否则,container内的root只是外部的一个普通用户权限(无法创建网卡)   
    docker run -d --name haproxy-rabbitmq --privileged --net host --restart=unless-stopped --log-opt max-size=200m --log-opt max-file=3 -v /root/docker/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy

    此时通过ip:8266/haproxy可访问haproxy后台监控界面。ip:8166可访问rabbitmq管理界面。

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
9月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
8月前
|
消息中间件 监控 Docker
Docker环境下快速部署RabbitMQ教程。
就这样,你成功地用魔法召唤出了RabbitMQ,还把它和你的应用程序连接了起来。现在,消息会像小溪流水一样,在你的系统中自由流淌。别忘了,兔子们不喜欢孤独,他们需要你细心的关怀,不时地监控它们,确保他们的世界运转得井井有条。
533 18
|
12月前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
1644 91
|
9月前
|
负载均衡 前端开发 JavaScript
LVS-DR模式、keepalived、Nginx与Tomcat合作,打造动静分离,高效负载均衡与高可用性
为了采用这样的架构,你需要对LVS-DR、Keepalived、Nginx与Tomcat有一定的理解和掌握,同时也需要投入一些时间去研究和配置,但是一旦你把它运行起来,你将会发现,这一切都是值得的。
370 11
|
消息中间件
RabbitMQ的 RPC 消息模式你会了吗?
【9月更文挑战第11天】RabbitMQ 的 RPC(远程过程调用)消息模式允许客户端向服务器发送请求并接收响应。其基本原理包括:1) 客户端发送请求,创建回调队列并设置关联标识符;2) 服务器接收请求并发送响应至回调队列;3) 客户端根据关联标识符接收并匹配响应。实现步骤涵盖客户端和服务器的连接、信道创建及请求处理。注意事项包括关联标识符唯一性、回调队列管理、错误处理及性能考虑。RPC 模式适用于构建可靠的分布式应用程序,但需根据需求调整优化。
476 3
|
10月前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
负载均衡 IDE Java
SpringBoot整合XXL-JOB【04】- 以GLUE模式运行与执行器负载均衡策略
在本节中,我们将介绍XXL-JOB的GLUE模式和集群模式下的路由策略。GLUE模式允许直接在线上改造方法为定时任务,无需重新部署。通过一个测试方法,展示了如何在调度中心配置并使用GLUE模式执行定时任务。接着,我们探讨了多实例环境下的负载均衡策略,确保任务不会重复执行,并可通过修改路由策略(如轮训)实现任务在多个实例间的均衡分配。最后,总结了GLUE模式和负载均衡策略的应用,帮助读者更深入理解XXL-JOB的使用。
788 9
SpringBoot整合XXL-JOB【04】-  以GLUE模式运行与执行器负载均衡策略
|
消息中间件 网络协议 RocketMQ
RocketMQ Controller 模式 始终更新成本机ip
ontrollerAddr=192.168.24.241:8878 但是日志输出Update controller leader address to 127.0.0.1:8878。导致访问失败
302 3
|
消息中间件 编解码 Docker
【Docker项目实战】Docker部署RabbitMQ消息中间件
【10月更文挑战第8天】Docker部署RabbitMQ消息中间件
755 2
【Docker项目实战】Docker部署RabbitMQ消息中间件
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo