189 8069 5689

如何搭建高可用RabbitMQ集群和HAProxy软负载

小编给大家分享一下如何搭建高可用RabbitMQ集群和HAProxy软负载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

创新互联建站是一家专注于成都网站制作、成都做网站与策划设计,郸城网站建设哪家好?创新互联建站做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:郸城等地区。郸城做网站价格咨询:13518219792

RabbitMQ 高可用集群架构

如何搭建高可用RabbitMQ集群和HAProxy软负载

将两个 RabbitMQ 磁盘节点和一个 RabbitMQ 内存节点组成一个内建集群,之所以要用两个磁盘节点是防止,唯一的磁盘节点挂掉后,不能重建队列,交换器。用 HAProxy 作为 RabbitMQ 集群的负载均衡。为了防止 HAProxy 单点故障,用 Keepalived 将两个 HAProxy 节点做成一主一备。应用使用 VIP(虚拟IP) 访问 HAProxy 服务时,默认连接主机(Master)的 HAProxy,当主机(Master)上的 HAProxy 故障时,VIP 会漂移到备机(Backup)上,就会连接备机(Backup)上的 HAProxy 服务。

准备工作

服务器安装 docker,docker-compose,准备离线镜像 rabbitmq.tar,haproxy.tar。

服务器节点间可以相互 ping 通。

RabbitMQ 集群

使用 RabbitMQ 内建集群,持久化队列无法在队列节点崩溃时,自动连接别的节点创建队列,非持久化队列可以自动连接可用节点创建队列。我们的项目使用的非持久化队列。

至少保证有两个磁盘节点,否则在唯一磁盘节点崩溃时,无法在集群中创建队列,交换器等元数据。

服务分布情况

192.168.1.213 服务器部署 RabbitMQ Disc Node1。  192.168.1.203 服务器部署 RabbitMQ Disc Node2。  192.168.1.212 服务器部署 RabbitMQ RAM Node3。

创建第一个 RabbitMQ 节点

登录服务器,创建目录 /app/mcst/rabbitmq。

将镜像 tar 包 rabbitmq.tar,服务编排文件 mcst-rabbitmq-node1.yaml 通过 sftp 上传到刚创建的目录下。

导入镜像

$ docker load -i rabbitmq.tar  $ docker images # 查看是否导入成功

查看服务编排文件 mcst-rabbitmq-node1.yaml

version: '3'  services:    rabbitmq:      container_name: mcst-rabbitmq      image: rabbitmq:3-management      restart: always      ports:        - 4369:4369        - 5671:5671        - 5672:5672        - 15672:15672        - 25672:25672      environment:        - TZ=Asia/Shanghai        - RABBITMQ_ERLANG_COOKIE=iweru238roseire        - RABBITMQ_DEFAULT_USER=mcst_admin        - RABBITMQ_DEFAULT_PASS=mcst_admin_123        - RABBITMQ_DEFAULT_VHOST=mcst_vhost      hostname: rabbitmq1      extra_hosts:        - rabbitmq1:192.168.1.213        - rabbitmq2:192.168.1.203        - rabbitmq3:192.168.1.212      volumes:        - ./data:/var/lib/rabbitmq

部署命令

$ docker-compose -f mcst-rabbitmq-node1.yaml up -d

注意:三个节点 RABBITMQ_ERLANG_COOKIE 保持一致。一定要有 extra_hosts 配置,否则在搭建集群的过程中会连接不到其他 rabbitmq 节点服务。此节点作为集群根节点。

部署第二个 RabbitMQ 节点

方法同上,上传 rabbitmq.sh 脚本到 volumes 配置的 ./rabbitmq.sh 路径。查看 mcst-rabbitmq-node2.yaml

version: '3'  services:    rabbitmq:      container_name: mcst-rabbitmq      image: rabbitmq:3-management      restart: always      ports:        - 4369:4369        - 5671:5671        - 5672:5672        - 15672:15672        - 25672:25672      environment:        - TZ=Asia/Shanghai        - RABBITMQ_ERLANG_COOKIE=iweru238roseire        - RABBITMQ_DEFAULT_USER=mcst_admin        - RABBITMQ_DEFAULT_PASS=mcst_admin_123        - RABBITMQ_DEFAULT_VHOST=mcst_vhost      hostname: rabbitmq2      extra_hosts:        - rabbitmq1:192.168.1.213        - rabbitmq2:192.168.1.203        - rabbitmq3:192.168.1.212      volumes:        - ./rabbitmq.sh:/home/rabbitmq.sh        - ./data:/var/lib/rabbitmq

部署命令

$ docker-compose -f mcst-rabbitmq-node2.yaml up -d

节点启动完成后,通过命令进入 rabbitmq2 节点的容器中,执行 /home/rabbitmq.sh 脚本。如果报权限错误,则在容器内执行 chmod +x /home/rabbitmq.sh 赋权,然后 bash /home/rabbitmq.sh 执行脚本添加到集群中。

进入容器的命令:

$ docker exec -it mcst-rabbitmq /bin/bash

脚本内容如下(磁盘节点):

rabbitmqctl stop_app  rabbitmqctl reset  rabbitmqctl join_cluster rabbit@rabbitmq1 rabbitmqctl start_app

部署第三个 RabbitMQ 节点

方法同上,查看 mcst-rabbitmq-node3.yaml

version: '3'  services:    rabbitmq:      container_name: mcst-rabbitmq      image: rabbitmq:3-management      restart: always      ports:        - 4369:4369        - 5671:5671        - 5672:5672        - 15672:15672        - 25672:25672      environment:        - TZ=Asia/Shanghai        - RABBITMQ_ERLANG_COOKIE=iweru238roseire        - RABBITMQ_DEFAULT_USER=mcst_admin        - RABBITMQ_DEFAULT_PASS=mcst_admin_123        - RABBITMQ_DEFAULT_VHOST=mcst_vhost      hostname: rabbitmq3      extra_hosts:        - rabbitmq1:192.168.1.213        - rabbitmq2:192.168.1.203        - rabbitmq3:192.168.1.212      volumes:        - ./rabbitmq-ram.sh:/home/rabbitmq-ram.sh        - ./data:/var/lib/rabbitmq

部署命令

$ docker-compose -f mcst-rabbitmq-node3.yaml up -d

在启动 rabbitmq3 节点,启动后,进入容器内部,执行 bash /home/rabbitmq-ram.sh 脚本添加内存节点到集群中。

脚本内容:

rabbitmqctl stop_app  rabbitmqctl reset  rabbitmqctl join_cluster --ram rabbit@rabbitmq1  rabbitmqctl start_app

在容器内部使用命令查看集群状态:rabbitmqctl cluster_status。

Cluster status of node rabbit@rabbitmq1 ...  [{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2]},{ram,[rabbit@rabbitmq3]}]},   {running_nodes,[rabbit@rabbitmq2,rabbit@rabbitmq3,rabbit@rabbitmq1]},   {cluster_name,<<"rabbit@rabbitmq2">>},   {partitions,[]},   {alarms,[{rabbit@rabbitmq2,[]},{rabbit@rabbitmq3,[]},{rabbit@rabbitmq1,[]}]}]

也可以通过 http://192.168.1.213:15672 进入管理端查看集群状态。

如何搭建高可用RabbitMQ集群和HAProxy软负载

HAProxy 负载均衡

创建目录 /app/mcst/haproxy,将镜像 tar 包,haproxy 配置文件,docker 服务编排文件上传到该目录。

导入镜像方法同上。

查看服务编排文件内容:

version: '3'  services:    haproxy:      container_name: mcst-haproxy      image: haproxy:2.1      restart: always      ports:        - 8100:8100        - 15670:5670      environment:        - TZ=Asia/Shanghai      extra_hosts:        - rabbitmq1:192.168.1.213        - rabbitmq2:192.168.1.203        - rabbitmq3:192.168.1.212      volumes:        - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro

重点是设置 extra_hosts(rabbitmq 集群节点 ip) 和 volumes(使用自定义的配置文件)。

haproxy 配置文件内容:

global      log 127.0.0.1 local0 info      maxconn 4096  defaults      log     global      mode    tcp      option  tcplog      retries 3      option  redispatch      maxconn 2000      timeout connect 5s      timeout client 120s      timeout server 120s  # ssl for rabbitmq  # frontend ssl_rabbitmq      # bind *:5673 ssl crt /root/rmqha_proxy/rmqha.pem      # mode tcp      # default_backend rabbitmq  # web 管理界面  listen stats      bind *:8100      mode http      stats enable      stats realm Haproxy\ Statistics      stats uri /      stats auth admin:admin123  # 配置负载均衡  listen rabbitmq      bind *:5670      mode tcp      balance roundrobin      server  rabbitmq1 rabbitmq1:5672  check inter 5s rise 2 fall 3      server  rabbitmq2 rabbitmq2:5672  check inter 5s rise 2 fall 3      server  rabbitmq3 rabbitmq3:5672  check inter 5s rise 2 fall 3

部署命令

$ docker-compose -f mcst-haproxy.yaml up -d

服务分布情况

192.168.1.212 服务器部署 HAProxy Master。  192.168.1.203 服务器部署 HAProxy Backup。

分别在以上两个节点起好 HAProxy 服务。

登录 HAProxy 的管理端查看集群状态:http://192.168.1.212:8100/。

如何搭建高可用RabbitMQ集群和HAProxy软负载

使用 Keepalived 给 HAProxy 做主备

准备工作

申请一个和服务节点同一局域网的 ip 地址,该 ip 不能被占用,作为 VIP(虚拟ip)。

安装 Keepalived

到 Keepalived 官网下载最新版本包,本次安装使用的是 2.0.20 版本。

下载好后的文件是:keepalived-2.0.20.tar.gz。

上传到服务器,对 tar 包解压缩。

$ tar -xf keepalived-2.0.20.tar.gz

检查依赖

$ cd keepalived-2.0.20  $ ./configure

Keepalived 的安装需要以下依赖 gcc,openssl-devel。

安装命令

$ yum install -y gcc  $ yum install -y openssl-devel

因为是内网服务器不能使用外网的 yum 源,所以需要更改用本地 yum 源。

将 linux 的安装光盘镜像上传到 /mnt/iso 目录下,并 mount 到 /mnt/cdrom 目录下,作为 yum 的一个安装源。

$ mkdir /mnt/iso  $ mkdir /mnt/cdrom   $ mv /ftp/rhel-server-7.3-x86_64-dvd.iso /mnt/iso

挂载光盘镜像

$ mount -ro loop /mnt/iso/rhel-server-7.3-x86_64-dvd.iso /mnt/cdrom   $ mv /ftp/myself.repo /etc/yum.repos.d  $ yum clean all   $ yum makecache   $ yum update

附:myself.repo文件内容:

[base]  name= Red Hat  Enterprise Linux $releasever  -  $basearch  -  Source  baseurl=file:///mnt/cdrom  enabled=1  gpgcheck=1  gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release

更改完成后,以后每次需要 linux 安装盘安装软件包时,只需要执行 mount 命令,将光盘 ISO 文件加载即可。

$ mount -ro loop /mnt/iso/rhel-server-7.3-x86_64-dvd.iso /mnt/cdrom

这时使用 yum 安装 gcc,openssl-devel就没问题了。

如果使用本地 yum 源的条件也不具备,那么可以使用 yum 的 downloadonly 插件。

要在能连接外网和系统版本一致的机器上将需要的依赖下载下来,到目标内网机器上本地安装。

还是推荐使用本地 yum 源的方式

安装完 gcc,openssl-devel 后,再次执行 ./configure 会报一个警告。

“this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.”

安装如下依赖解决

$ yum install -y libnl libnl-devel

安装完成后再次 ./configure 就没问题了。

然后执行 make 编译

最后执行 make install 安装

安装完成后执行 keepalived --version,输出版本号即为安装成功。

创建 Keepalived 配置文件

创建配置文件 /etc/keepalived/keepalived.conf

Master 节点配置:

vrrp_script chk_haproxy {      script "killall -0 haproxy"  # verify haproxy's pid existance      interval 5                   # check every 2 seconds      weight -2                    # if check failed, priority will minus 2  }  vrrp_instance VI_1 {      # 主机: MASTER      # 备机: BACKUP      state MASTER      # 实例绑定的网卡, 用ip a命令查看网卡编号      interface ens192      # 虚拟路由标识,这个标识是一个数字(1-255),在一个VRRP实例中主备服务器ID必须一样      virtual_router_id 51      # 优先级,数字越大优先级越高,在一个实例中主服务器优先级要高于备服务器      priority 101      # 虚拟IP地址,可以有多个,每行一个      virtual_ipaddress {          192.168.1.110      }      track_script {               # Scripts state we monitor          chk_haproxy                    }  }

ens192 是网卡名,ifconfig 命令查看服务器网卡,找到和本机服务 ip 对应的网卡,virtual_router_id 的值要和 backup 节点上的配置保持一致。killall \-0 haproxy 命令的意思是,如果 haproxy 服务存在执行该命令,什么都不会发生,如果服务不存在,执行该命令会报找不到进程 haproxy: no process found。

# 网卡信息  ens192: flags=4163  mtu 1500          inet 192.168.1.203  netmask 255.255.255.0  broadcast 192.168.1.255          inet6 fe80::250:56ff:fe94:bceb  prefixlen 64  scopeid 0x20          ether 00:50:56:94:bc:eb  txqueuelen 1000  (Ethernet)          RX packets 88711011  bytes 12324982140 (11.4 GiB)          RX errors 0  dropped 272  overruns 0  frame 0          TX packets 88438149  bytes 10760989492 (10.0 GiB)          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0  # haproxy 服务不存在  [root@localhost ~]# killall -0 haproxy  haproxy: no process found

master 节点的 priority 在减去 weight 后要比 backup 节点的 priority 低才行,否则主备切换不成功。

Backup节点配置:

vrrp_script chk_haproxy {      script "killall -0 haproxy"  # verify haproxy's pid existance      interval 5                   # check every 2 seconds      weight -2                    # if check failed, priority will minus 2 }  vrrp_instance VI_1 {      # 主机: MASTER      # 备机: BACKUP      state BACKUP      # 实例绑定的网卡, 用ip a命令查看网卡编号      interface ens192      # 虚拟路由标识,这个标识是一个数字(1-255),在一个VRRP实例中主备服务器ID必须一样      virtual_router_id 51      # 优先级,数字越大优先级越高,在一个实例中主服务器优先级要高于备服务器      priority 100      # 虚拟IP地址,可以有多个,每行一个      virtual_ipaddress {          192.168.1.110      }      track_script {               # Scripts state we monitor          chk_haproxy                    }  }

创建完配置,启动 keepalived。

$ systemctl restart keepalived

测试 Keepalived

在 Master,Backup 节点上,使用 ip addr 命令看下 vip 在哪台机器的 ens192 网卡上。

2: ens192:  mtu 1500 qdisc mq state UP qlen 1000      link/ether 00:50:56:94:c1:79 brd ff:ff:ff:ff:ff:ff      inet 192.168.1.212/24 brd 192.168.1.255 scope global ens192         valid_lft forever preferred_lft forever      inet 192.168.1.110/32 scope global ens192         valid_lft forever preferred_lft forever      inet6 fe80::250:56ff:fe94:c179/64 scope link          valid_lft forever preferred_lft forever

默认在 master 主机上,停掉 master 主机的 haproxy 服务,然后在用 ip addr 查看虚拟 ip 在哪个机器上,如果漂移到备份主机上则代表热备生效。

在开启 master 主机的 haproxy 服务,ip addr 查看虚拟ip应该重新漂移回 master 主机上。

测试服务,使用虚拟 ip 加服务端口号访问 HAProxy 服务。

以上是“如何搭建高可用RabbitMQ集群和HAProxy软负载”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!


分享标题:如何搭建高可用RabbitMQ集群和HAProxy软负载
当前网址:http://cdxtjz.cn/article/jipieo.html

其他资讯