1. 闲不住的人首页
  2. 其它服务

CentOS7配置RabbitMQ集群

本章记录了如何配置一个 RabbitMQ 集群,并使用 haproxy 提供集群的高可用和负载均衡功能。

1. 环境说明

IP主机名硬件配置角色
10.100.4.181node14核4G内存HAProxy
10.100.4.182node24核4G内存RabbieMQ Master
10.100.4.183node34核4G内存RabbieMQ Slave

拓扑图如下:

CentOS7配置RabbitMQ集群
RabbitMQ 集群拓扑图

生产环境中 HAProxy 也要做高可用,网络上常见的高可用方案是 HAProxy + Keepalived 组合的方式。

2. 修改主机名配置 hosts 解析

RabbitMQ 集群内所有主机节点使用短主机名,并配置好 hosts 能解析。

# node2 节点修改
$ hostnamectl set-hostname node2
$ vim /etc/hosts
10.100.4.182 node2
10.100.4.183 node3
# node3 节点修改
$ hostnamectl set-hostname node3
$ vim /etc/hosts
10.100.4.182 node2
10.100.4.183 node3

3. 安装 RabbitMQ 并启用管理插件

以下操作在两台需要安装 RabbitMQ 的服务器上进行操作;

$ yum -y install rabbitmq-server
$ systemctl start rabbitmq-server
$ rabbitmq-plugins enable rabbitmq_management

4. 复制 erlang.cookie 到 Slave

复制 RabbitMQ Master 节点上的 .erlang.cookie 到 RabbitMQ Slave 节点上。

root@node2:~ # scp -p -P 59120 /var/lib/rabbitmq/.erlang.cookie root@10.100.4.183:/var/lib/rabbitmq/
```
**重启 RabbitMQ Slave 节点上的 rabbitmq-server 服务**

```bash
root@node3:~ # systemctl stop rabbitmq-server
root@node3:~ # systemctl start rabbitmq-server

5. 查看所有节点的 cluster_name

看所有节点的 cluster_name 确保名称为类似 rabbit@node2 这样的名字

# Master 节点
root@node2:~ # rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2]}]},
 {running_nodes,[rabbit@node2]},
 {cluster_name,<<"rabbit@node2">>},
 {partitions,[]}]
...done.

# Slave 节点
root@node3:~ # rabbitmqctl cluster_status     
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node3]}]},
 {running_nodes,[rabbit@node3]},
 {cluster_name,<<"rabbit@node3">>},
 {partitions,[]}]
...done.

6. 停止应用

在 slave 节点上执行 rabbitmqctl stop_app

root@node3:~ # rabbitmqctl stop_app
Stopping node rabbit@node3 ...
...done.

7. 配置 slave 节点加入指定的 cluster_name 中

在刚刚查看所有节点的 cluster_name 一步中 Master 节点的 cluster_name 是 rabbit@node2 所以在 Slave 节点就要加入到这个集群名字中;

root@node3:~ # rabbitmqctl join_cluster rabbit@node2
Clustering node rabbit@node3 with rabbit@node2 ...
...done.

刚刚我们在 slave 执行了 rabbitmqctl stop_app 现在我们在启动应用

root@node3:~ # rabbitmqctl start_app
Starting node rabbit@node3 ...
...done.

8. 查看集群状态

在 Slave 节点上查看状态可以看到以下信息

root@node3:~ # rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node2,rabbit@node3]}]}, # 集群内的两个节点
 {running_nodes,[rabbit@node2,rabbit@node3]}, # 看到两个节点
 {cluster_name,<<"rabbit@node2">>}, # 已经加入到 node2 集群中
 {partitions,[]}]
...done.

在 Master 节点也可以查看一下状态信息

root@node2:~ # rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2,rabbit@node3]}]},
 {running_nodes,[rabbit@node3,rabbit@node2]},
 {cluster_name,<<"rabbit@node2">>},
 {partitions,[]}]
...done.

9. 安装 HAProxy

在 node1 节点上安装 haproxy

root@node1:~ # yum -y install haproxy

9.1 修改 haproxy 配置文件

root@node1:~ # cat /etc/haproxy/haproxy.cfg    
#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
        #应用全局的日志配置
        log global
        #默认的模式mode{tcp|http|health}
        #tcp是4层,http是7层,health只返回OK
        mode tcp
        #日志类别tcplog
        option tcplog
        #不记录健康检查日志信息
        option dontlognull
        #3次失败则认为服务不可用
        retries 3
        #每个进程可用的最大连接数
        maxconn 2000
        #连接超时
        timeout connect 5s
        #客户端超时
        timeout client 120s
        #服务端超时
        timeout server 120s
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
listen stats
  bind    *:9000
  mode    http
  stats   enable
  stats   hide-version
  stats   uri       /stats
  stats   refresh   30s
  stats   realm     Haproxy\ Statistics
  stats   auth      Admin:Password # HAProxy 状态页的认证用户

listen rabbitmq :5672
  mode tcp
  stats enable
  balance roundrobin
  server rabbitmq01 10.100.4.182:5672 check inter 5000 rise 2 fall 3 weight 1 
  server rabbitmq02 10.100.4.183:5672 check inter 5000 rise 2 fall 3 weight 1 

在上面的配置中 listen rabbitmq :5672 这里定义了客户端连接 IP 地址和端口号。这里配置的负载均衡算法是 roundrobin,注意这里的roundrobin 是加权轮询。和 RabbitMQ 最相关的是 server rabbitmq01 10.100.4.182:5672 check inter 5000 rise 2 fall 3 weight 1这种,它定义了 RabbitMQ 服务,每个 RabbitMQ 服务定义指令包含6个部分:

  • server :定义 RabbitMQ 服务的内部标示,注意这里的“rabbitmq01”是指包含有含义的字符串名称,不是指 RabbitMQ 的节点名称。
  • ip:port:定义 RabbitMQ 服务的连接的 IP 地址和端口号。
  • check inter :定义了每隔多少毫秒检查 RabbitMQ 服务是否可用。
  • rise :定义了 RabbitMQ 服务在发生故障之后,需要多少次健康检查才能被再次确认可用。
  • fall :定义需要经历多少次失败的健康检查之后,HAProxy 才会停止使用此 RabbitMQ 服务。
  • weight :定义了当前 RabbitMQ 服务的权重。

listen stats 一段配置定义的是 HAProxy 的数据统计页面。数据统计页面包含各个服务节点的状态、连接、负载等信息。

运行 HAProxy 之后可以在浏览器上输入http://10.100.4.181:9000/stats 来加载相关的页面,如下图所示:

Haproxy 控制台

原创文章,作者:恩志,如若转载,请注明出处:https://www.xbzdr.com/165.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

在线咨询:点击这里给我发消息

邮件:510749025@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code