角色 | 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
添加用户为: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
设置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,再重新在后台执行
[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,[]}]}]
因为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 做负载均衡
[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 使用单一配置文件来定义所有属性,包括从前端 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 并确保它能工作:
[root@rabbitmq02 haproxy]# haproxy -f haproxy.cnf
如果一切正常的话,你现在可以顺利的加载 http://192.168.1.219:8100/stats 页面,如果配置文件中配置了 auth 的话,你需要进行登录:admin admin(默认账户)
安装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必须各实例不同