RabbitMQ 群集安装

栏目: Redis · 发布时间: 5年前

内容简介:rabbitMQ 是用 erlang 语言写的,所以需要先安装 erlang。注意:为 rabbitmq_server-3.7.5 目录创建软件链接时,rabbitmq_server-3.7.5 后面一定不要加上[root@node05 ~]# rabbitmqctl status escript: exception error: undefined function rabbitmqctl_escript:main/1 in function escript:run/2 (escript.erl, l
主机名 IP地址 操作系统版本 erlang 版本 rabbitmq 版本
192.168.2.23 node01 CentOS Linux release 7.4.1708 (Core) 20.3 3.7.5
192.168.2.24 node02 CentOS Linux release 7.4.1708 (Core) 20.3 3.7.5
192.168.2.25 node03 CentOS Linux release 7.4.1708 (Core) 20.3 3.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 端口

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

端口 用途
4369 empd(Erlang Port Mapper Daemon),是 Erlang 的端口/结点名称映射程序,用来跟踪节点名称监听地址,在集群中起到一个类似 DNS 的作用。
5672、5671 由 AMQP 0-9-1 和 1.0 客户端使用
15672 HTTP_API 端口,管理员用户才能访问,用于管理 RbbitMQ,需要启用 management 插件, rabbitmq-plugins enable rabbitmq_management ,访问 http://server-name:15672/
25672 Erlang 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"}'

五、群集移除节点

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

将 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

八、高可用配置

RabbitMQ 群集安装

利用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
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入浅出数据分析

深入浅出数据分析

Michael Milton / 李芳 / 电子工业出版社 / 2009 / 88.00元

《深入浅出数据分析》以类似“章回小说”的活泼形式,生动地向读者展现优秀的数据分析人员应知应会的技术:数据分析基本步骤、实验方法、最优化方法、假设检验方法、贝叶斯统计方法、主观概率法、启发法、直方图法、回归法、误差处理、相关数据库、数据整理技巧;正文以后,意犹未尽地以三篇附录介绍数据分析十大要务、R工具及ToolPak工具,在充分展现目标知识以外,为读者搭建了走向深入研究的桥梁。 本书构思跌宕......一起来看看 《深入浅出数据分析》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试