RabbitMQ 群集安装

本文详细介绍RabbitMQ集群的搭建过程,包括环境配置、安装步骤、集群配置及优化等核心内容。此外还提供了高可用配置方案,帮助读者更好地理解和掌握RabbitMQ集群的相关知识。

一、环境描述

1、操作系统

主机名IP地址操作系统版本erlang 版本rabbitmq 版本
192.168.2.23node01CentOS Linux release 7.4.1708 (Core)20.33.7.5
192.168.2.24node02CentOS Linux release 7.4.1708 (Core)20.33.7.5
192.168.2.25node03CentOS Linux release 7.4.1708 (Core)20.33.7.5

2 、/etc/hosts 文件配置

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.23	node01
192.168.2.24	node02
192.168.2.25	node03
复制代码

二、安装

1、安装环境依赖包

# yum install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel xmlto unixODBC-devel -y
复制代码

2、安装 erlang

rabbitMQ 是用 erlang 语言写的,所以需要先安装 erlang。

a. 解压源码包
# tar xvf otp_src_20.3.tar.gz 

b. 进入源码目录
# cd otp_src_20.3

c. 配置安装选项
# ./configure --prefix=/usr/local/erlang --without-javac
... ... 省略 ... ...
*********************************************************************
**********************  APPLICATIONS DISABLED  ********************** # 只需要注意此处提示
*********************************************************************

jinterface     : Java compiler disabled by user # 因为没有安装 jdk 所以报这个错,可以忽略

*********************************************************************
*********************************************************************
**********************  APPLICATIONS INFORMATION  *******************
*********************************************************************

wx             : wxWidgets not found, wx will NOT be usable

*********************************************************************
*********************************************************************
**********************  DOCUMENTATION INFORMATION  ******************
*********************************************************************

documentation  : 
                 fop is missing.
                 Using fakefop to generate placeholder PDF files.

*********************************************************************

d. 编译及安装
# make && make install

e. 设置 erlang 环境变量
# vim /etc/profile.d/erlang.sh
内容如下:
# set erlang environment
export PATH=$PATH:/usr/local/erlang/bin
# . /etc/profile.d/erlang.sh

f. 测试 erlang
# erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V9.3  (abort with ^G) # 出现这个命令提示符说明 erlang 安装成功
1>erlang:halt().   # 退出 erlang,注意 halt() 后面有个 点
复制代码

3、安装 rabbitmq

a. 解压二进制包,解压即可用
# tar xvf rabbitmq-server-generic-unix-3.7.5.tar.xz -C /usr/local/

b. 创建一个软件链接方便管理
# ln -sv rabbitmq_server-3.7.5 rabbitmq
‘rabbitmq’ -> ‘rabbitmq_server-3.7.5’

c. 设置 rabbitmq 环境变量
# vim /etc/profile.d/rabbitmq.sh
内容如下:
# set rabbitmq environment
export PATH=$PATH:/usr/local/rabbitmq/sbin
# . /etc/profile.d/rabbitmq.sh
复制代码

注意:为 rabbitmq_server-3.7.5 目录创建软件链接时,rabbitmq_server-3.7.5 后面一定不要加上 / ,一般习惯用 TAB 键来补全命令的,都会自动把 / 给补上去。这样后面使用 rabbitmqctl 等命令时就会报错:

[root@node05 ~]# rabbitmqctl status escript: exception error: undefined function rabbitmqctl_escript:main/1 in function escript:run/2 (escript.erl, line 759) in call from escript:start/1 (escript.erl, line 277) in call from init:start_em/1 in call from init:do_boot/3

三、设置 rabbitMQ

1、开启 rabbitMQ web 页面访问

# rabbitmq-plugins enable rabbitmq_management
也可以直接将开启的插件配置写入配置文件
# echo "[rabbitmq_management]." > /usr/local/rabbitmq/etc/rabbitmq/enabled_plugins
复制代码

2、启动 rabbitmq-server

# rabbitmq-server start    # 前台启动

  ##  ##
  ##  ##      RabbitMQ 3.7.5. Copyright (C) 2007-2018 Pivotal Software, Inc.
  ##########  Licensed under the MPL.  See http://www.rabbitmq.com/
  ######  ##
  ##########  Logs: /usr/local/rabbitmq/var/log/rabbitmq/rabbit@node03.log
                    /usr/local/rabbitmq/var/log/rabbitmq/rabbit@node03_upgrade.log

              Starting broker...
 completed with 3 plugins.    # 说明 web 管理插件已经启动


# rabbitmq-server  -detached    # 后台启动,不占用终端,推荐
Warning: PID file not written; -detached was passed.
复制代码

3、 rabbitMQ 端口

确保防火墙打开了以下端口:

端口用途
4369empd(Erlang Port Mapper Daemon),是 Erlang 的端口/结点名称映射程序,用来跟踪节点名称监听地址,在集群中起到一个类似 DNS 的作用。
5672、5671由 AMQP 0-9-1 和 1.0 客户端使用
15672HTTP_API 端口,管理员用户才能访问,用于管理 RbbitMQ,需要启用 management 插件,rabbitmq-plugins enable rabbitmq_management,访问http://server-name:15672/
25672Erlang distribution,和4369配合
61613、61614当STOMP插件启用的时候打开,作为STOMP客户端端口(根据是否使用TLS选择)
1883、8883当MQTT插件启用的时候打开,作为MQTT客户端端口(根据是否使用TLS选择)
15674基于WebSocket的STOMP客户端端口(当插件Web STOMP启用的时候打开)
15675基于WebSocket的MQTT客户端端口(当插件Web MQTT启用的时候打开)

四、群集配置

集群管理:没有明显的主从,主要是 disk 和 ram 节点的区别

集群要求:不支持跨网段(erlang 限制)

集群类型:精通集群、镜像集群

  • 普通集群:结构同步,消息实体只存在一个节点中,但 consumer 在非消息节点获取时,节点间存在消息拉取,易产生性能瓶颈。
  • 镜像集群:集群中一个 master,负责调试,处理消息实体,其他节点保存一份数据到本地;性能主要靠 master 承载。

持久化,分两部分:

  • Rabbitmq 服务器配置持久化:默认的就是持久化(disc类型);
  • 代码持久化:默认情况下,代码创建的消息队列和存放在队列里的消息都是非持久化的,需要在建产队列时指定

在配置群集前,必须保证各节点之间的主机名能够相互解析

RabbitMQ 节点使用域名相互寻址,因此所有群集成员的主机名必须能够从所有群集节点解析,可以修改 /etc/hosts 文件或者使用 DNS 解析

如果要使用节点名称的完整主机名(RabbitMQ 默认为短名称),并且可以使用DNS解析完整的主机名,则可能需要调查设置环境变量  RABBITMQ_USE_LONGNAME = true

一个群集的组成可以动态改变,所有的 RabbitMQ 开始作为单个节点运行,这些节点可以加入到群集,然后也可以再次脱离群集转加单节点。

RabbitMQ 群集可以容忍单个节点的故障。节点可以随意启动和停止,只要它们在关闭时能和群集成员节点联系。

节点可以是 Disk 节点或 RAM 节点

RAM 节点将内部数据库表存储在 RAM 中。这不包括消息,消息存储索引,队列索引和其他节点状态,在 90% 以上的情况下,您希望所有节点都是磁盘节点;

RAM 节点是一种特殊情况,可用于改善高排队,交换或绑定流失的性能集群。RAM 节点不提供有意义的更高的消息速率。

由于 RAM 节点仅将内部数据库表存储在 RAM 中,因此它们必须在启动时从对等节点同步它们。这意味着群集必须至少包含一个磁盘节点。因此无法手动删除集群中剩余的最后一个磁盘节点

1、设置节点相互信任:Erlang Cookie

RabbitMQ 节点和 CLI 工具(例如 rabbitmqctl )使用 cookie 来确定它们是否被允许相互通信,要使两个节点能够通信,它们必须具有相同的共享密钥,称为 Erlang Cookie。 Cookie 只是一个字符串,最多可以有 255 个字符。它通常存储在本地文件中。该文件必须只能由所有者访问(400 权限)。每个集群节点必须具有相同的 cookie,文件位置(rpm 安装) /var/lib/rabbitmq/.erlang.cookie,如果是源码安装的 .erlang.cookie 文件在启动用户的家目录中。把 rabbit2、rabbit3 设置成和 rabbit1 一样的即可,权限是 400 ,或者直接复制一份过去即可。

这里采用复制的方式
采用源码安装的 rabbitmq .erlang.cookie 文件在 /root 目录下
# scp /var/lib/rabbitmq/.erlang.cookie node02:/root/
root@node02's password: 
.erlang.cookie   100%   20     2.3KB/s   00:00    
# scp /var/lib/rabbitmq/.erlang.cookie node03:/root/
root@node03's password: 
.erlang.cookie   100%   20     7.5KB/s   00:00 
复制代码

2、正常方式启动所有节点

# rabbitmq-server -detached   # 在所有节点上启动 rabbitmq-server
复制代码

3、查看群集状态

# nod01 上
# rabbitmqctl cluster_status
Cluster status of node rabbit@node01 ...
[{nodes,[{disc,[rabbit@node01]}]},
 {running_nodes,[rabbit@node01]},
 {cluster_name,<<"rabbit@node01">>},
 {partitions,[]},
 {alarms,[{rabbit@node01,[]}]}]
 
 # node02 上
 # ./rabbitmqctl cluster_status
Cluster status of node rabbit@node02 ...
[{nodes,[{disc,[rabbit@node02]}]},
 {running_nodes,[rabbit@node02]},
 {cluster_name,<<"rabbit@node02">>},
 {partitions,[]},
 {alarms,[{rabbit@node02,[]}]}]
 
 # node03 上
 # ./rabbitmqctl cluster_status
Cluster status of node rabbit@node03 ...
[{nodes,[{disc,[rabbit@node03]}]},
 {running_nodes,[rabbit@node03]},
 {cluster_name,<<"rabbit@node03">>},
 {partitions,[]},
 {alarms,[{rabbit@node03,[]}]}]
复制代码

4、将 node02、node03 加入 rabbit@node01 群集

a. 停止 node02 的 rabbitmq 应用程序
# 在其余 2 个节点上操作
# ./rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node02 ...
复制代码
b. 加入 rabbit@node01 群集1
# 在其余 2 个节点上操作
# ./rabbitmqctl join_cluster rabbit@node01    # 如果这一步报错的话,请在所有节点打开相应的端口,打开 4369 端口
Clustering node rabbit@node02 with rabbit@node01
复制代码
c. 启动 rabbitMQ 程序
# 在其余 2 个节点上操作
# ./rabbitmqctl start_app
Starting node rabbit@node02 ...
 completed with 3 plugins.
复制代码
b. 查看群集状态
在群集任何一个节点上都可以查看到群集的状态
# rabbitmqctl cluster_status
Cluster status of node rabbit@node01 ...
[{nodes,[{disc,[rabbit@node01,rabbit@node02,rabbit@node03]}]},
 {running_nodes,[rabbit@node03,rabbit@node02,rabbit@node01]},
 {cluster_name,<<"rabbit@node01">>},
 {partitions,[]},
 {alarms,[{rabbit@node03,[]},{rabbit@node02,[]},{rabbit@node01,[]}]}]
复制代码

通过上面的步骤,我们可以在群集运行的同时随时向群集添加新节点

已加入群集的节点可以随时停止,也可以崩溃。在这两种情况下,群集的其余部分都会继续运行,并且节点在再次启动时,会自动 ”跟上“(同步)其它群集节点。

注意:

当整个集群关闭时,最后一个关闭的节点必须是第一个启动的节点,如果不是这样,节点会等待 30s 等待最后的磁盘节点恢复状态,然后失败。如果最后下线的节点不能上线,可以使用 forget_cluster_node 命令将其从群集中删除。如果所有的节点不受控制的同时宕机,比如掉电,会进入所有的节点都会认为其他节点比自己宕机的要晚,即自己先宕机,这种情况下可以使用 force_boot 指令来启动一个节点。

d. 设置群集模式为"镜像队列"模式
# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
复制代码

ha-sync-mode: 如果此节点不进行设置,在其中一台服务器宕机再启动后 会报  Unsynchronised Mirrors XXXX  错误。这时候在队列详细信息页面需要手动点击同步队列,或者用命令行执行命令 rabbitmqctl sync_queue name

五、群集移除节点

当节点不再是节点的一部分时,需要从群集中明确地删除节点。

将 rabbit@node02 从群集中删除,回到独立模式:

在 rabbit@node02 上操作:
1、停止 RabbitMQ 应用程序。
# ./rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node02 ...

2、重置节点。
# ./rabbitmqctl reset
Resetting node rabbit@node02 ...

3、重新启动 RabbitMQ 应用程序。
# ./rabbitmqctl start_app
Starting node rabbit@node02 ...
 completed with 3 plugins.
 
4、在节点上运行 cluster_status 命令,确认 rabbit@node02 现在已经不再是群集的一部分,并独立运行
# ./rabbitmqctl cluster_status
Cluster status of node rabbit@node02 ...
[{nodes,[{disc,[rabbit@node02]}]},
 {running_nodes,[rabbit@node02]},
 {cluster_name,<<"rabbit@node02">>},
 {partitions,[]},
 {alarms,[{rabbit@node02,[]}]}]
复制代码

也可以远程删除节点,例如,在处理无响应的节点时,这很有用。

例如,在节点 rabbit@node01 上把 rabbit@node03 从群集中移除

1、先在 rabbit@node03 上将 RabbitMQ 应用停掉
# ./rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node03 ...

2、在 rabbit@node01 上远程将 rabbit@node03 删除
# rabbitmqctl forget_cluster_node rabbit@node03
Removing node rabbit@node03 from the cluster

3、请注意,这时,rabbit@node03 仍然认为它还在 rabbit@node01 的群集里面,并试图启动它,这将会导致错误。我们需要将 rabbit@node03 重新设置才能重新启动它。(在 rabbit@node03 上操作)
# ./rabbitmqctl reset
Resetting node rabbit@node03 ...

4、重新启动 rabbit@node03
# ./rabbitmqctl start_app
Starting node rabbit@node03 ...
 completed with 3 plugins.
复制代码

现在,三个节点都是作为独立的节点在运行。

注意:此时,rabbit@node01 保留了簇的剩余状态,而 rabbit@node02 和 rabbit@node03 是刚刚初始化的 RabbitMQ。如果想重新初始化 rabbit@node01 的话,需要按照与其它节点相同的步骤进行即可:

1、停止 RabbitMQ 应用程序

2、 重置 RabbitMQ

3、启动 RabbitMQ 应用程序

六、RabbitMQ 管理

1、主机名更改

RabbitMQ 节点使用主机名相互通信。因此,所有节点名称必须能够解析所有群集对应的名称。像 rabbitmqctl 这样的工具也是如此。除此之外,**默认情况下 RabbitMQ 使用系统的当前主机名来命名数据库目录。如果主机名更改,则会创建一个新的空数据库。**为了避免数据丢失,建立一个固定和可解析的主机名至关重要。每当主机名更改时,应该重新启动 RabbitMQ。如果要使用节点名称的完整主机名(RabbitMQ 默认为短名称),并且可以使用 DNS 解析完整的主机名,则需要修改设置环境变量 RABBITMQ_USE_LONGNAME=true

2、RAM 节点的群集

RAM 节点只将其元数据保存在内存中。 只有 RAM 节点的集群是脆弱的, 如果群集停止,将无法再次启动, 并将丢失所有数据。

创建 RAM 节点

我们可以在首次加入集群时将节点声明为 RAM 节点。像之前一样,我们使用 rabbitmqctl join_cluster 来完成此 操作,但传递 --ram 标志

[root@node03 escript]# ./rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node03 ...

[root@node03 escript]# ./rabbitmqctl join_cluster --ram rabbit@node01
Clustering node rabbit@node03 with rabbit@node01

[root@node03 escript]# ./rabbitmqctl start_app
Starting node rabbit@node03 ...
 completed with 3 plugins.
 
[root@node03 escript]# ./rabbitmqctl cluster_status
Cluster status of node rabbit@node03 ...
[{nodes,[{disc,[rabbit@node01]},{ram,[rabbit@node03]}]},
 {running_nodes,[rabbit@node01,rabbit@node03]},
 {cluster_name,<<"rabbit@node01">>},
 {partitions,[]},
 {alarms,[{rabbit@node01,[]},{rabbit@node03,[]}]}]
复制代码

更改节点类型

可以将节点的类型 RAM 更改为 disc,反之亦然。

使用 change_cluster_node_type 命令。

[root@node03 escript]# ./rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node03 ...

[root@node03 escript]# ./rabbitmqctl change_cluster_node_type disc
Turning rabbit@node03 into a disc node

[root@node03 escript]# ./rabbitmqctl start_app
Starting node rabbit@node03 ...
 completed with 3 plugins.
 
[root@node03 escript]# ./rabbitmqctl cluster_status
Cluster status of node rabbit@node03 ...
[{nodes,[{disc,[rabbit@node01,rabbit@node03]}]},
 {running_nodes,[rabbit@node01,rabbit@node03]},
 {cluster_name,<<"rabbit@node01">>},
 {partitions,[]},
 {alarms,[{rabbit@node01,[]},{rabbit@node03,[]}]}]
复制代码

常用管理命令

  • 用户权限管理

    RabbitMQ 有一个默认的用户'guest',密码也是"guest",这个用户默认只能通过本机访问,如:http://localhost:15672,在通过 http 访问之前记得启用 management 插件。

    要让其他机器可以访问,需要创建一个新用户,并为其分配权限。

    1. 用户管理

      rabbitmqctl list_users # 列出所有用户

      rabbitmqctl add_user {username} {password} # 添加用户

      rabbitmqctl delete_user {username} # 删除用户

      rabbitmqctl change_password {username} {newpassword} # 修改密码

      rabbitmqctl authenticate_user {username} {password} # 用户认证

      rabbitmqctl clear_password {username} # 删除密码,密码删除后就不能访问了。

      rabbitmqctl set_user_tags {username} {tag ...} # 为用户设置角色,tag 可以是 0 个,一个,或多个。如:rabbitmqctl set_user_tags chris administrator,设置为管理员;rabbitmqctl set_user_tags chris ,清除 chris 与角色的关联。

    2. 权限管理

      RabbitMQ 客户端连接到一个服务端的时候,在它的操作指令中指定了一个虚拟主机。服务端首先检查是否有访问该虚拟主机的权限,没有权限的会拒绝连接。

      对于 exchanges 和 queues 等资源,位于某个虚拟主机内;不同虚拟主机内即便名称相同也代表不同的资源。当特定操作在资源上执行时第二级访问控制开始生效。

      RabbitMQ 在某个资源上区分了配置、写和读操作。配置操作创建或者销毁资源,或者更改资源的行为。写操作将消息注入进资源之中。读操作从资源中获取消息。

      要执行特定操作用户必须授予合适的权限。

      rabbitmqctl list_vhosts [vhost info item ...] # 获取 vhosts 列表

      rabbitmqctl add_vhost {vhost} # 添加 vhosts

      rabbitmqctl delete_vhost {hosts} # 删除 vhosts

      rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read} # 给用户分配对应的 vhost 上分配相应的权限。如:rabbitmqctl set_permissions -p /myvhost chris "^chris-.*" ".*" ".*"

      rabbitmqctl clear_permissions [-p vhost] {username} # 清除权限

      rabbitmqctl list_permissions [-p vhost] # 清除权限列表

      rabbitmqctl list_user_permissions {username} # user 权限列表

      rabbitmqctl set_permissions -p / chris ".*" ".*" ".*" 此时用户chris才有访问队列资源的权限

七、优化

运行生产工作负载的 RabbitMQ 安装可能需要系统限制和内核参数调整,以便处理体面的并发连接和队列。需要调整的主要设置是打开文件的最大数量,也称为 ulimit -n 。建议在生产环境中为用户 rabbitmq 至少允许 65536个文件描述符。4096 对于大多数开发工作量来说应该是足够的。

有两个限制操作系统内核允许的最大打开文件数(fs.file-max)和每用户限制(ulimit -n)。前者必须高于后者

fs.file-max 设置,在 /etc/sysctl.conf 文件中添加:

fs.file-max = 65535
# sysctl -p
复制代码

用户限制(ulimit -n)

# vim /etc/security/limits.conf
在最后一行添加如下内容
root    soft    nofile  65535
root    hard    nofile  65535
*       soft    nofile  65535
*       hard    nofile  65535
重启系统后才能生效,如果想立即生效,可以先使用如下命令:
# ulimit -SHn 65535
复制代码

ulimit 命令详解

ulimit用于shell启动进程所占用的资源,是shell内建命令。

参数介绍: -H 设置硬件资源限制. -S 设置软件资源限制. -a 显示当前所有的资源限制. -c size:设置core文件的最大值.单位:blocks -d size:设置数据段的最大值.单位:kbytes -f size:设置创建文件的最大值.单位:blocks -l size:设置在内存中锁定进程的最大值.单位:kbytes -m size:设置可以使用的常驻内存的最大值.单位:kbytes -n size:设置内核可以同时打开的文件描述符的最大值.单位:n -p size:设置管道缓冲区的最大值.单位:kbytes -s size:设置堆栈的最大值.单位:kbytes -t size:设置CPU使用时间的最大上限.单位:seconds -v size:设置虚拟内存的最大值.单位:kbytesLinux

修改 rabbitmq 配置

如果是 RPM 包安装的 RabbitMQ,修改 /usr/lib/systemd/system/rabbitmq-server.service
在 [Service] 中,增加 LimitNOFILE=30000(具体数值根据需要而定)
执行 systemctl daemon-reload
重启 rabbitmq 服务

rabbitmqctl status 可以查看修改后的 limit 限制,如:
{file_descriptors,
     [{total_limit,924},{total_used,2},{sockets_limit,829},{sockets_used,0}]},
复制代码

日志

默认的情况下,日志位于/var/log/rabbitmq 目录中(RPM 包安装的),源码安装的在 /usr/local/rabbitmq/var/log/rabbitmq 目录中,服务器的输出被发送到 RABBITMQ_NODENAME.log 文件。其它日志数据定入 RABBITMQ_NODENAME-sasl.log

八、高可用配置

利用haproxy做负载均衡   在192.168.1.1和192.168.1.2节点上   安装haproxy   # yum install haproxy

  vi /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
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
#frontend  main *:5000
#    acl url_static       path_beg       -i /static /images /javascript /stylesheets
#    acl url_static       path_end       -i .jpg .gif .png .css .js

#    use_backend static          if url_static
#    default_backend             app

#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
#backend static
#    balance     roundrobin
#    server      static 127.0.0.1:4331 check

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
# backend app
#    balance     roundrobin
#    server  app1 127.0.0.1:5001 check
#    server  app2 127.0.0.1:5002 check
#    server  app3 127.0.0.1:5003 check
#    server  app4 127.0.0.1:5004 check

listen admin_stats
    bind 0.0.0.0:8100
    stats enable
    mode http
    log global
    stats uri /stats
    stats realm Haproxy\ Statistics
    stats auth admin:admin
    stats admin if TRUE
    stats refresh 30s

listen rabbitmq_cluster
    bind 0.0.0.0:56720
    mode tcp
    option tcplog
    balance roundrobin
    server node05 192.168.2.75:5672 check inter 2000 rise 2 fall 3
    server node06 192.168.2.76:5672 check inter 2000 rise 2 fall 3

listen rabbitmq_cluster_web
    bind 0.0.0.0:15673
    mode tcp
    option tcplog
    balance roundrobin
    server node05 192.168.2.75:15672 check inter 2000 rise 2 fall 3
    server node06 192.168.2.76:15672 check inter 2000 rise 2 fall 3
复制代码

keepalived 配置:

! Configuration File for keepalived
global_defs {
  router_id node05
  vrrp_skip_check_adv_addr
  vrrp_strict
  vrrp_garp_interval 0
  vrrp_gna_interval 0
}


vrrp_script chk_haproxy {
    script "/opt/scripts/chk_haproxy.sh"
    interval 1
    weight -10
}

 vrrp_instance HA {
    state MASTER                                                        # Keepalived 的角色。Master 表示主服务器,从服务器设置为 BACKUP
    interface ens33                                                      # 指定监测网卡
    virtual_router_id 75                                                # 虚拟路由 ID,主备相同
    nopreempt
    priority 100								# 优先级,BACKUP 机器上的优先级要小于这个值
    advert_int 1                                                            # 设置主备之间的检查时间,单位为s
    authentication {                                                      # 定义验证类型和密码
        auth_type PASS                                                  # 主备节点必须一致
        auth_pass 1111                                                   # 主备节点必须一致
    }
    virtual_ipaddress {
        192.168.2.100/32 dev ens33 lebel ens33:0
    }
    track_script {
        chk_haproxy
    }
}
复制代码

转载于:https://juejin.im/post/5b3dff6c51882519a42661ca

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值