centos7 rabbitmq集群搭建+高可用

环境

整体架构:

centos7 rabbitmq集群搭建+高可用_第1张图片

角色 IP 组件
rabbitmq01 192.168.1.218 rabbitmq
rabbitmq02 192.168.1.219 rabbitmq + haproxy + keepalived
rabbitmq03 192.168.1.226 rabbitmq + haproxy + keepalived
环境准备

修改服务器名称(rabbitmq02 ,rabbitmq03相同操作)

[root@rabbitmq01 ~]# vim /etc/hostname

rabbitmq01
[root@rabbitmq01 ~]# hostname rabbitmq01
[root@rabbitmq01 ~]# exit  # 退出生效

设置hosts解析,所有节点配置相同

$ cat /etc/hosts
192.168.1.218  rabbitmq01
192.168.1.219  rabbitmq02
192.168.1.226  rabbitmq03
搭建(在所有节点执行)

添加EPEL源

[root@rabbitmq01 ~]# rpm -Uvh https://dl.Fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

添加Erlang

[root@rabbitmq01 ~]# rpm -Uvh http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm

安装RabbitMQ

[root@rabbitmq01 ~]# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm
[root@rabbitmq01 ~]# rpm --import https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
[root@rabbitmq01 ~]# yum install -y rabbitmq-server-3.6.6-1.el7.noarch.rpm

启动服务

[root@rabbitmq01 ~]# systemctl enable rabbitmq-server.service
[root@rabbitmq01 ~]# systemctl start rabbitmq-server.service

查看服务状态

[root@rabbitmq01 ~]# systemctl status rabbitmq-server 

查看端口监听状态 5672为集群间通信端口,15672为web端管理端口

[root@rabbitmq01 ~]# netstat -lnutp

查看配置路径

[root@rabbitmq01 ~]# cd /var/log/rabbitmq/

[root@rabbitmq01 rabbitmq]# vim rabbit\@rabbitmq02.log

=INFO REPORT==== 20-Aug-2017::08:03:11 ===
Starting RabbitMQ 3.6.12 on Erlang R16B03-1
Copyright (C) 2007-2017 Pivotal Software, Inc.
Licensed under the MPL. See http://www.rabbitmq.com/

=INFO REPORT==== 20-Aug-2017::08:03:11 ===
node : rabbit@rabbitmq02
home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config (not found)
cookie hash : vNIydXbvZSku+QwtRGImSQ==
log : /var/log/rabbitmq/[email protected]
sasl log : /var/log/rabbitmq/[email protected]
database dir : /var/lib/rabbitmq/mnesia/rabbit@rabbitmq02

根据上面的提示发现没有 rabbitmq.config 文件,可以自己创建

[root@rabbitmq01 rabbitmq]# cd /etc/rabbitmq/
[root@rabbitmq01 rabbitmq]# vim rabbitmq.config

编辑内容如下

[{rabbit, [{loopback_users, []}]}].

这里的意思是开放使用,rabbitmq默认创建的用户guest,密码也是guest,这个用户默认只能是本机访问,localhost或者127.0.0.1,从外部访问需要添加上面的配置

保存配置后重启服务

[root@rabbitmq01 rabbitmq]# systemctl restart rabbitmq-server

此时就可以从外部访问了,但此时再看log文件,发现内容还是原来的,还是显示没有找到配置文件

[root@rabbitmq01 rabbitmq]## vim rabbit\@rabbitmq.log

=INFO REPORT==== 20-Aug-2017::08:03:11 ===
Starting RabbitMQ 3.6.12 on Erlang R16B03-1
Copyright (C) 2007-2017 Pivotal Software, Inc.
Licensed under the MPL. See http://www.rabbitmq.com/

=INFO REPORT==== 20-Aug-2017::08:03:11 ===
node : rabbit@node2
home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config (not found)
cookie hash : vNIydXbvZSku+QwtRGImSQ==
log : /var/log/rabbitmq/[email protected]
sasl log : /var/log/rabbitmq/[email protected]
database dir : /var/lib/rabbitmq/mnesia/rabbit@rabbitmq02

手动删除这个文件再重启服务,不过这不影响使用

[root@rabbitmq01 rabbitmq]# rm rabbit\@rabbitmq02.log
[root@rabbitmq01 rabbitmq]# systemctl restart rabbitmq-server

在此查看log文件,OK了

[root@node1 rabbitmq]# vim rabbit\@rabbitmq02.log

=INFO REPORT==== 20-Aug-2017::08:26:56 ===
Starting RabbitMQ 3.6.12 on Erlang R16B03-1
Copyright (C) 2007-2017 Pivotal Software, Inc.
Licensed under the MPL. See http://www.rabbitmq.com/

=INFO REPORT==== 20-Aug-2017::08:26:56 ===
node : rabbit@node2
home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config
cookie hash : vNIydXbvZSku+QwtRGImSQ==
log : /var/log/rabbitmq/[email protected]
sasl log : /var/log/rabbitmq/[email protected]
database dir : /var/lib/rabbitmq/mnesia/rabbit@rabbitmq02

启用RabbitMQ Web插件

[root@rabbitmq01 ~]# rabbitmq-plugins enable rabbitmq_management

关闭Rabbitmq Web管理接口

[root@rabbitmq01 rabbitmq]# rabbitmq-plugins disable rabbitmq_management

RabbitMQ用户管理

添加用户为:root ,密码为:admin

[root@rabbitmq01 ~]# rabbitmqctl add_user admin admin

设置用户角色(设置admin用户为管理员角色)

[root@rabbitmq01 ~]# rabbitmqctl set_user_tags admin administrator

设置用户权限(设置admin用户配置、写、读的权限)

[root@rabbitmq01 ~]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

删除用户(删除guest用户)

[root@rabbitmq01 ~]# rabbitmqctl delete_user guest

如果配置防火墙,开启端口

[root@rabbitmq01 rabbitmq]# firewall-cmd --zone=public --add-port=15672/tcp --permanent
[root@rabbitmq01 rabbitmq]# firewall-cmd --reload

在Web输入服务器IP:端口

http://IP:15672

RabbitMQ集群配置

设置Erlang Cookie

RabbitMQ节点之间和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一组随机的数字+字母的字符串。当RabbitMQ服务器启动的时候,Erlang VM会自动创建一个随机内容的Cookie文件。如果是通过源安装RabbitMQ的话,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。如果是通过源码安装的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie。

修改node1改文件的权限

[root@rabbitmq01 ~]# chmod 777 /var/lib/rabbitmq/.erlang.cookie

# 将rabbitmq01上的.erlang.cookie文件分别拷贝到rabbitmq02、rabbitmq03服务器上

[root@rabbitmq01 ~]# scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/
[root@rabbitmq01 ~]# scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/

# 将rabbitmq01上的.erlang.cookie文件文件权限恢复过来
[root@rabbitmq01 ~]# chmod 400 /var/lib/rabbitmq/.erlang.cookie

rabbitmq02(rabbitmq03相同操作)

[root@rabbitmq02 ~]# cd /var/lib/rabbitmq
[root@rabbitmq02 rabbitmq]# chmod 400 .erlang.cookie
[root@rabbitmq02 rabbitmq]# ls -al
总用量 4620
drwxr-xr-x   3 rabbitmq rabbitmq      64 8月  13 16:43 .
drwxr-xr-x. 28 root     root        4096 8月  13 19:52 ..
-r--------   1 rabbitmq rabbitmq      20 8月  13 00:00 .erlang.cookie
-rw-r-----   1 rabbitmq rabbitmq 4720967 8月  13 15:52 erl_crash.dump
drwxr-x---   6 rabbitmq rabbitmq     240 8月  14 10:53 mnesia

查看三台机器上的 .erlang.cookie的值是一致的

[root@rabbitmq01 ~]# cat /var/lib/rabbitmq/.erlang.cookie 
CAWVPZYTTTUGFZTYNUHG
[root@rabbitmq02 ~]# cat /var/lib/rabbitmq/.erlang.cookie 
CAWVPZYTTTUGFZTYNUHG
[root@rabbitmq03 ~]# cat /var/lib/rabbitmq/.erlang.cookie 
CAWVPZYTTTUGFZTYNUHG

使用detached参数,在后台启动Rabbit Node,要先停止现有的Rabbitmq-server,再重新在后台执行

rabbitmq01
[root@rabbitmq01 ~]# rabbitmqctl stop
[root@rabbitmq01 ~]# rabbitmq-server -detached
[root@rabbitmq01 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq01 ...
[{nodes,[{disc,[rabbit@rabbitmq01]}]},
 {running_nodes,[rabbit@rabbitmq01]},
 {cluster_name,<<"rabbit@rabbitmq01">>},
 {partitions,[]},
 {alarms,[{rabbit@rabbitmq01,[]}]}]
将rabbitmq01、rabbitmq02、rabbitmq03组成集群

因为rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用并将节点设置为原始状态,然后就为加入集群准备好了。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。
rabbitmq02

[root@rabbitmq02 ~]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq02 ...
[root@rabbitmq02 ~]# rabbitmqctl join_cluster rabbit@rabbitmq01
Clustering node rabbit@rabbitmq02 with rabbit@rabbitmq03 ...
[root@rabbitmq02 ~]# rabbitmqctl start_app
Starting node rabbit@rabbitmq02 ...

rabbitmq03

[root@rabbitmq03 ~]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq03 ...
[root@rabbitmq03 ~]# rabbitmqctl join_cluster rabbit@rabbitmq01
Clustering node rabbit@rabbitmq03 with rabbit@rabbitmq03 ...
[root@rabbitmq03 ~]# rabbitmqctl start_app
Starting node rabbit@rabbitmq03 ...

此时 rabbitmq02 与 rabbitmq03 也会自动建立连接
如果要使用内存节点,则可以使用以下命令

[root@rabbitmq02 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq01

集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功

查看集群状态

[root@rabbitmq01 ~]# rabbitmq-server -detached
[root@rabbitmq01 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq01 ...
Basics

Cluster name: rabbit@rabbitmq02   # 集群名称

Disk Nodes # 磁盘节点

rabbit@rabbitmq01
rabbit@rabbitmq02
rabbit@rabbitmq03

Running Nodes # node节点

rabbit@rabbitmq01
rabbit@rabbitmq02
rabbit@rabbitmq03

Versions  # RabbitMQ 版本

rabbit@rabbitmq01: RabbitMQ 3.8.6 on Erlang 23.0.3
rabbit@rabbitmq02: RabbitMQ 3.8.6 on Erlang 23.0.3
rabbit@rabbitmq03: RabbitMQ 3.8.6 on Erlang 23.0.3

Alarms

(none)

Network Partitions

(none)

Listeners

Node: rabbit@rabbitmq01, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq01, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbitmq01, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmq02, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq02, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbitmq02, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmq03, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq03, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmq03, interface: [::], port: 15672, protocol: http, purpose: HTTP API

Feature flags

Flag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
Flag: implicit_default_bindings, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled

可以看到三个节点已经构建成了一个集群,但是有一个小问题,{disc,[rabbit@rabbitmq01,rabbit@rabbitmq02,rabbit@rabbitmq03]},所有的节点都是磁盘节点,和刚开始构想的不太一样,我们只需要一个磁盘节点,另外两个都是内存节点,这样我们在保证可用性的同时,还能提高集群的整体性能。

所以,我们需要将两台磁盘节点改成内存节点。

  • 将磁盘节点修改为内存节点
    将节点从集群中移除

rabbitmq02:

[root@rabbitmq02 ~]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq02 ...
[root@rabbitmq02 ~]# rabbitmqctl reset
Resetting node rabbit@rabbitmq02

rabbitmq03:

[root@rabbitmq03 ~]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq03 ...
[root@rabbitmq03 ~]# rabbitmqctl reset
Resetting node rabbit@rabbitmq03

这里关键的命令是 rabbitmqctl reset。reset 命令在节点为单机状态和是集群的一部分时行为有点不太一样。

节点单机状态时,reset 命令将清空节点的状态,并将其恢复到空白状态。当节点是集群的一部分时,该命令也会和集群中的磁盘节点通信,告诉他们该节点正在离开集群。

这很重要,不然,集群会认为该节点出了故障,并期望其最终能够恢复回来,在该节点回来之前,集群禁止新的节点加入。

  • 将节点重新加入集群

rabbitmq02

[root@rabbitmq02 ~]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq02 ...
[root@rabbitmq02 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq01
Clustering node rabbit@rabbitmq02 with rabbit@rabbitmq03 ...
[root@rabbitmq02 ~]# rabbitmqctl start_app
Starting node rabbit@rabbitmq02 ...

rabbitmq03

[root@rabbitmq03 ~]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq03 ...
[root@rabbitmq03 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq01
Clustering node rabbit@rabbitmq03 with rabbit@rabbitmq03 ...
[root@rabbitmq03 ~]# rabbitmqctl start_app
Starting node rabbit@rabbitmq03 ...

使用 HAProxy 做负载均衡

  • 下载 HAProxy 源码
[root@rabbitmq02 ~]# yum install -y haproxy

安装完以后,配置文件的目录在/etc/haproxy/haproxy.cfg,以下是我修改后的配置文件

[root@rabbitmq02 ~]# cd /etc/haproxy/
[root@rabbitmq02 haproxy]# vim haproxy.cfg 

现在你可以运行 haproxy --help 来看看它的配置选项。现在需要对 HAProxy 进行配置,这样它就可以 RabbitMQ 做负载均衡了。

  • 配置 HAProxy

HAProxy 使用单一配置文件来定义所有属性,包括从前端 IP 到后端服务器。下列清单展示了用于本地 Rabbit 集群负载均衡的配置。

配置文件参数解释:

###########全局配置#########
global
  log 127.0.0.1 local0 #[日志输出配置,所有日志都记录在本机,通过local0输出]
  log 127.0.0.1 local1 notice #定义haproxy 日志级别[error warringinfo debug]
  daemon #以后台形式运行harpoxy
  nbproc 1 #设置进程数量
  maxconn 4096 #默认最大连接数,需考虑ulimit-n限制
  #user haproxy #运行haproxy的用户
  #group haproxy #运行haproxy的用户所在的组
  #pidfile /var/run/haproxy.pid #haproxy 进程PID文件
  #ulimit-n 819200 #ulimit 的数量限制
  #chroot /usr/share/haproxy #chroot运行路径
  #debug #haproxy 调试级别,建议只在开启单进程的时候调试
  #quiet

########默认配置############
defaults
  log global
  mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
  option httplog #日志类别,采用httplog
  option dontlognull #不记录健康检查日志信息
  retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
  #option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
  option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
  #option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持
  option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
  maxconn 4096 #默认的最大连接数
  timeout connect 5000ms #连接超时
  timeout client 30000ms #客户端超时
  timeout server 30000ms #服务器超时
  #timeout check 2000 #心跳检测超时
  #timeout http-keep-alive10s #默认持久连接超时时间
  #timeout http-request 10s #默认http请求超时时间
  #timeout queue 1m #默认队列超时时间
  balance roundrobin #设置默认负载均衡方式,轮询方式
  #balance source #设置默认负载均衡方式,类似于nginx的ip_hash
  #balnace leastconn #设置默认负载均衡方式,最小连接数

########统计页面配置########
listen stats
  bind 0.0.0.0:1080 #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
  mode http #http的7层模式
  option httplog #采用http日志格式
  #log 127.0.0.1 local0 err #错误日志记录
  maxconn 10 #默认的最大连接数
  stats refresh 30s #统计页面自动刷新时间
  stats uri /stats #统计页面url
  stats realm XingCloud\ Haproxy #统计页面密码框上提示文本
  stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名
  stats auth Frank:Frank #设置监控页面的用户和密码:Frank
  stats hide-version #隐藏统计页面上HAProxy的版本信息
  stats admin if TRUE #设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本)

########设置haproxy 错误页面#####
#errorfile 403 /home/haproxy/haproxy/errorfiles/403.http
#errorfile 500 /home/haproxy/haproxy/errorfiles/500.http
#errorfile 502 /home/haproxy/haproxy/errorfiles/502.http
#errorfile 503 /home/haproxy/haproxy/errorfiles/503.http
#errorfile 504 /home/haproxy/haproxy/errorfiles/504.http

########frontend前端配置##############
frontend main
  bind *:80 #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。
  acl web hdr(host) -i www.abc.com  #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.abc.com这个域名,就触发web规则,。
  acl img hdr(host) -i img.abc.com  #如果访问img.abc.com这个域名,就触发img规则。
  use_backend webserver if web   #如果上面定义的web规则被触发,即访问www.abc.com,就将请求分发到webserver这个作用域。
  use_backend imgserver if img   #如果上面定义的img规则被触发,即访问img.abc.com,就将请求分发到imgserver这个作用域。
  default_backend dynamic #不满足则响应backend的默认页面

########backend后端配置##############
backend webserver #webserver作用域
  mode http
  balance roundrobin #balance roundrobin 负载轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数
  option httpchk /index.html HTTP/1.0 #健康检查, 检测文件,如果分发到后台index.html访问不到就不再分发给它
  server web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3
  server web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3
  #cookie 1表示serverid为1,check inter 1500 是检测心跳频率 
  #rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

backend imgserver
  mode http
  option httpchk /index.php
  balance roundrobin 
  server img01 192.168.137.101:80 check inter 2000 fall 3
  server img02 192.168.137.102:80 check inter 2000 fall 3

backend dynamic 
  balance roundrobin 
  server test1 192.168.1.23:80 check maxconn 2000 
  server test2 192.168.1.24:80 check maxconn 2000


listen tcptest 
  bind 0.0.0.0:5222 
  mode tcp 
  option tcplog #采用tcp日志格式 
  balance source 
  #log 127.0.0.1 local0 debug 
  server s1 192.168.100.204:7222 weight 1 
  server s2 192.168.100.208:7222 weight 1

我们的配置文件(/root/haproxy/haproxy.cnf)内容如下:

root@haproxy:~/haproxy# cat haproxy.cnf
global
    log     127.0.0.1  local0 info
    log     127.0.0.1  local1 notice
    daemon
    maxconn 4096

defaults
    log     global
    mode    tcp
    option  tcplog
    option  dontlognull
    retries 3
    option  abortonclose
    maxconn 4096
    timeout connect  5000ms
    timeout client  3000ms
    timeout server  3000ms
    balance roundrobin

listen private_monitoring
    bind    0.0.0.0:8100
    mode    http
    option  httplog
    stats   refresh  5s
    stats   uri  /stats
    stats   realm   Haproxy
    stats   auth  admin:admin

listen rabbitmq_admin
    bind    0.0.0.0:8102
    server  rabbitmq01 192.168.1.218:15672
    server  rabbitmq02 192.168.1.219:15672
    server  rabbitmq03 192.168.1.226:15672

listen rabbitmq_cluster
    bind    0.0.0.0:8101
    mode    tcp
    option  tcplog
    balance roundrobin
    server  rabbitmq01  192.168.1.218:5672  check  inter  5000  rise  2  fall  3
    server  rabbitmq02  192.168.1.219:5672  check  inter  5000  rise  2  fall  3
    server  rabbitmq03  192.168.1.226:5672  check  inter  5000  rise  2  fall  3
  • 运行 HAProxy

让我们用新的配置启动 HAProxy 并确保它能工作:

[root@rabbitmq02 haproxy]# haproxy -f haproxy.cnf

如果一切正常的话,你现在可以顺利的加载 http://192.168.1.219:8100/stats 页面,如果配置文件中配置了 auth 的话,你需要进行登录:admin admin(默认账户)
centos7 rabbitmq集群搭建+高可用_第2张图片
安装keepalived(node3相同操作 keepalived.conf 配置不同)
安装

[root@rabbitmq02 ~]# yum -y install keepalived

查看版本

[root@rabbitmq02 ~]# keepalived -v

配置 keepalived.conf (192.168.1.219)

[root@rabbitmq02 ~]# vim /etc/keepalived/keepalived.conf 

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id rabbitmq  #集群名称,相同集群名称必须相同
}

vrrp_instance VI_1 {
    state MASTER  #主从设置,这里设置为主
    interface eth0
    virtual_router_id 51
    priority 150  #定义访问优先级,数值越大优先级越高
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.227   #置虚拟IP,需在相同网段
    }
}

配置 192.168.1.226(备)

[root@rabbitmq03 ~]# vim /etc/keepalived/keepalived.conf 

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id rabbitmq   #集群名称,必须和web01设置相同
}

vrrp_instance VI_1 {
    state BACKUP   #主从设置,这里设置为从
    interface eth0
    virtual_router_id 51
    priority 100   #定义访问优先级,从要比主的数值小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.227  #设置虚拟IP,必须相同
    }
}

重启服务查看rabbitmq02(192.168.1.219)网卡上是否有 192.168.1.226 IP

[root@rabbitmq02 ~]# ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:e6:36:7b brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.219/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever

而此是rabbitmq03(192.168.1.226)的网卡上是没有192.168.1.227 IP

[root@rabbitmq03 ~]# ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:15:ba:84 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.226/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.1.227/32 scope global eth0
       valid_lft forever preferred_lft forever

可以关闭rabbitmq02(192.168.1.219)的keepalived 服务,查看IP是否转移到了rabbitmq03(192.168.1.226)上

rabbitmq02(192.168.1.219)上已经没有了192.168.1.227

[root@node1 ~]# systemctl stop  keepalived

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:e6:36:7b brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.219/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever

查看rabbitmq03(192.168.1.226)

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:15:ba:84 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.22/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.30/32 scope global eth0
       valid_lft forever preferred_lft forever

此时192.168.1.227 已经转移到了 192.168.1.226上

启动keepalived即可,192.168.1.227是对外提供的统一地址。

通过192.168.1.227:5672就可以访问rabbitmq服务

运行命令
启动
service keepalived start

停止
service keepalived stop

重启
service keepalived restart

注意:keepalived可能运行多个实例,比如redis和haproxy共存,在这种情况下,必须注意几点:
一、VIP必须各实例不同
二、virtual_router_id必须各实例不同

你可能感兴趣的:(MQ)