RabbitMQ镜像集群搭建

RabbitMQ镜像集群搭建

本文主要记录RabbitMQ镜像集群的搭建方法。

RabbitMQ集群架构模式

  1. 主备模式(Warren)
    实现RabbitMQ的高可用集群,一般在并发和数据量不高的情况下,这种模型非常的好用且简单。简单来说就是集群至少有两台RabbitMQ服务器,这两台服务器一台在工作一台在闲置,当工作的服务器出现故障则切换到备份的服务器,以此来实现高可用。但是主备模式有其弊端,那就是负载不均衡,一台忙的忙死,一台没事儿干。在实际开发中,一般不使用主备模式,这会造成MQ资源的浪费。

  2. 镜像模式(Mirror)
    集群模式非常经典的就是Mirror镜像模式,保证100%数据不丢失(夸张了),在实际工作中也是用的最多的,并且实现集群非常简单。简单来说就是集群中所有的节点即每一台MQ的服务器数据都是同步的,并且所有的服务器都在工作,我们在集群的前面使用一个TCP代理(nginx/haproxy)来做负载均衡,如果一台MQ服务器出异常了,集群中其他的MQ服务器立马顶上。

  3. 远程模式(Shovel)
    远程模式是可以实现双活的一种模式,简称Shovel模式,所谓Shovel就是我们可以把消息进行不同数据中心的复制工作,我们可以跨地域的让两个MQ集群互联,该模式要求比较高,配置也比较复杂。在实际的开发中,基本不用,如果要搭建多个数据中心的集群一般使用第四种方式。

  4. 多活模式(Federation)
    这种模式也是实现异地数据复制的主流模式,因为Shovel模式配置比较复杂,所以一般来说实现异地集群都是使用双活或者多活模型来实现。简单来说双活模式就是一种可以容灾的机制,比如我们在北京和成都分别搭建两个MQ的集群,这两个集群数据都是同步的,当两个集群都可以访问的时候,可以采用距离或者响应速度选择最优的一个集群访问,当一个地方的集群出现宕机可以立马切换到另一个地方的集群。这种模型需要依赖RabbitMQ和Federation插件,可以实现持续可靠的AMQP数据通信,多活模式在实际配置与应用中都非常简单。

使用环境

  1. 两台腾讯云服务器,分别安装Centos7的Linux系统;
  2. 两台服务器均提前安装RabbitMQ服务器,具体安装教程看这里

Mirror集群搭建

  1. 修改两台服务器的hostname
    第一台:
    vim /etc/hostname
    mq1
    第二台:
    vim /etc/hostname
    mq2
    注意:
    如果两台服务器的主机名本身就不一致也可以不修改,例如腾讯云服务器的主机名VM_x_x_centos便可以不用修改。

  2. 在两台服务器的主机列表中加入两台主机
    两台做同样的操作:
    vim /etc/hosts
    192.168.132.137 mq1
    192.268.132.139 mq2
    注意:
    如果是腾讯云服务器,cat /etc/hosts查看hosts文件,发现大致如下:
    127.0.0.1 VM_0_14_centos VM_0_14_centos
    127.0.0.1 localhost.localdomain localhost
    127.0.0.1 localhost4.localdomain4 localhost4
    ::1 VM_0_14_centos VM_0_14_centos
    ::1 localhost.localdomain localhost
    ::1 localhost6.localdomain6 localhost6

    删除第一行和第四行,然后将两台主机加入hosts文件中,注意自己设置的hostname
    172.27.0.14 VM_0_14_centos
    172.27.0.13 VM_0_13_centos

  3. 检查hosts添加是否有用
    ping mq1
    ping mq2

  4. 关闭防火墙,或者防火墙开放端口
    Centos7关闭防火墙:
    firewall-cmd --state,查看防火墙状态
    systemctl stop firewalld.service,停止防火墙
    systemctl disable firewalld.service,禁止防火墙开机启动
    Centos7防火墙开放端口:
    RabbitMQ需要开放4369/5672/15672/25672端口。4369是erlang主机的发现端口,通过该端口来发现RabbitMQ服务是否存在;5672是RabbitMQ操作的端口号;15672是RabbitMQ后台管理系统的端口号;25672是erlang底层进行消息分配和发送的端口。
    firewall-cmd --zone=public --add-port=4368/tcp --permanent,permanent表示永久生效
    firewall-cmd --zone=public --add-port=4368/tcp --permanent
    firewall-cmd --zone=public --add-port=4368/tcp --permanent
    firewall-cmd --zone=public --add-port=4368/tcp --permanent
    一般设置防火墙以后,保险起见需要重启电脑reboot,腾讯云服务器Centos7系统默认防火墙是关闭的。

  5. 复制.erlang.cookie
    .erlang.cookie是erlang分布式的token文件,集群内所有设备要持有相同的.erlang.cookie文件才允许彼此通信。
    find / -name .erlang.cookie,查询该文件的位置,一般在/var/lib/rabbitmq目录下
    scp /var/lib/rabbitmq/.erlang.cookie 192.268.132.139:/var/lib/rabbitmq,远程复制

  6. 对两台电脑上的.erlang.cookie文件进行授权
    chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/,对/var/lib/rabbitmq/路径授权
    chmod 400 /var/lib/rabbitmq/.erlang.cookie,对文件进行授权

  7. 启动两台服务器
    rabbitmq-server --detached

  8. 在mq2服务器上,执行下面的命令,与mq1服务器进行镜像复制
    rabbitmqctl stop_app,暂停服务
    rabbitmqctl join_cluster rabbit@mq1,将mq2加入到mq1的集群
    rabbitmqctl stop_app,启动服务
    rabbitmqctl cluster_status,验证集群结果

  9. 查看集群
    通过15672端口访问两台RabbitMQ服务器的后台管理系统,发现都在mq1的集群下面,在overview节点一栏也会发现有两个节点,同时在两台服务器上操作数据都是同步的。
    注意:
    如果是使用云服务器,想要外网访问15672端口,需要安全策略开启该tcp端口;如果想要guest用户登录后台管理系统也需要做RabbitMQ的设置。

配置MQ镜像集群负载均衡

做MQ镜像集群的负载均衡有很多的选择,最常见的是使用haproxy来完成,当然你也可以使用nginx,如果你使用的是腾讯云的服务器来搭建的MQ镜像集群也可以使用腾讯云的负载均衡产品。
我们之所以要给MQ的镜像集群设置TCP代理来完成负载均衡是因为我们的集群中有多台MQ服务器,我们可以通过连接任意一台服务器来完成消息的处理,但是我们人为并不能让服务器比较均衡的处理我们的消息,我们每次到底应该连接那一台服务器我们也不好处理,所以在MQ镜像集群的前面增加一个TCP代理服务器,我们只需要和TCP代理服务器打交道,TCP代理服务器可以根据我们的策略设置,例如轮询的方式,来将我们的请求分发到具体的节点即MQ服务器中去,达到负载均衡的目的。

HAProxy

  1. HAProxy简介
    HAProxy是一款提供高可用、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,他是免费、快速并且可靠的一种解决方案。
    RabbitMQ集群镜像模式中,HAProxy用于做TCP代理,提供节点负载均衡与故障发现。

  2. Centos7安装HAProxy
    yum install haproxy,安装haproxy
    目前仓库里的版本,不是最新的版本,但是是一个经典稳定的版本。
    rpm -ql haproxy,查看安装文件

  3. HAProxy配置
    HAProxy核心配置文件为:/etc/haproxy/haproxy.cfg
    备份一下源文件:cp haproxy.cfg haproxy.cfg.bak
    编写配置文件:vim haproxy.cfg
    删除default项后面的所有部分,保留default部分

  4. 对MQ集群进行监听配置

# 对MQ集群进行监听
listen rabbitmq_cluster
    # 通过5672对代理的node进行映射
    bind 0.0.0.0:5672
    # 记录tcp连接的状态和时间
    option tcplog
    # 第四层的协议代理,即对TCP协议转发
    mode tcp
    # 开启TCP长连接模式
    option clitcpka
    # 针对TCP长连接的一些超市设置
    # haproxy与mq监理连接的超时时间
    timeout connect 10s
    # 客户端与haproxy最大空闲时间
    timeout client 30s
    # haproxy与服务器最大空闲时间
    timeout server 30s
    # 采用轮训转发消息
    balance roundrobin
    # 每5秒发送一次心跳包,如果连续两次有响应则代表状态良好
    # 如果连续三次没有响应,则视为故障服务,该节点将被剔除
    server node1 192.168.132.137:5672 check inter 5s rise 2 fall 3
    server node2 192.168.132.139:5672 check inter 5s rise 2 fall 3
  1. 开启haproxy监控服务
# 开启haproxy监控服务
listen http_front
    # 监听端口
    bind 0.0.0.0:1080
    # 统计页面自动刷新时间
    stats refresh 30s
    # 统计页面url
    stats uri /haproxy?stats
    # 统计页面用户名和密码设置
    stats auth guest:guest
  1. 启动HAProxy
    haproxy -f /etc/haproxy/haproxy.cfg
    上面的配置启动时会报一个警告信息,不用管。

  2. 访问HAProxy监控平台
    http://ip:1080/haproxy?stats,登录以后可以查看到RabbitMQ集群的信息。

  3. 注意事项
    云服务器上,如果需要访问HAProxy的监控页面,需要安全策略开启响应的端口;
    如果访问过程中出现网络问题可以注意防火墙以及iptables,HAProxy一般会使用下面的端口1080、60866和监听的端口

腾讯云负载均衡LB

  1. 在腾讯云负载均衡的监听器管理中,建立TCP监听器在这里插入图片描述
  2. 新建TCP监听,监听TCP:5672端口,开启健康检查,设置回话保持,保持时间可以自己设置在这里插入图片描述
  3. 绑定RabbitMQ所在的服务器,以及MQ服务的端口在这里插入图片描述在这里插入图片描述
  4. 集群中节点状态查看,如果端口状态出现异常,需要及时排查服务是否宕机,或者其他原因在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/z_junyu/article/details/88842139