RabbitMQ 集群
最开始我们介绍了如何安装及运行 RabbitMQ 服务,不过这些是单机版的,无法满足目前真实应用的要求。如果 RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等情况,该怎么办?单台 RabbitMQ 服务器可以满足每秒 1000 条消息的吞吐量,那么如果应用需要 RabbitMQ 服务满足每秒 10 万条消息的吞吐量呢?购买昂贵的服务器来增强单机 RabbitMQ 务的性能显得捉襟见肘,搭建一个 RabbitMQ 集群才是解决实际问题的关键.
1、环境准备
1.1、虚拟机
1.2、Docker
安装步骤:Linux CentOS 7 环境安装_稻草人0.0的博客-CSDN博客_centos7安装包
2、集群搭建
【实践】docker简易搭建RabbitMQ集群 - 腾讯云开发者社区-腾讯云 (tencent.com)
基于 Docker
RabbitMQ 有 2 种集群模式,分别是普通集群模式和镜像集群模式。
- 普通集群模式
RabbitMQ 集群同步的指是复制队列,元数据信息的同步,即同步的是数据存储信息。
消息的存放只会存储在创建该消息队列的那个节点上,并非在所有节点上都存储一个完整的数据。
在通过非数据所在节点获取数据时,通过元数据信息,路由转发到存储数据节点上,从而得到数据 。
- 镜像集群模式
与普通集群模式区别主要是消息实体会主动在镜像节点间同步数据,而不是只存储数据元信息。
故普通集群模式但凡数据节点挂了,容易造成数据丢失但镜像集群模式可以保证集群只要不全部挂掉,数据就不会丢失。
但相对于性能来说,镜像集群模式会比普通集群模式多出消耗数据的传输。故取决于业务场景进行取舍。
2.1、下载镜像
$ docker pull rabbitmq:3.10
2.2、创建自定义网络
# 网络模式
# 子网
# 网关
# docker 网络名称
$ docker network create \
--driver bridge \
--subnet 192.170.0.0/16 \
--gateway 192.170.0.1 \
rabbitmqClusterNet
# 查看 docker 网络
$ docker network ls
2.3、创建映射数据卷目录
cd /home
mkdir rabbitmqcluster
cd rabbitmqcluste/
mkdir rabbitmq01 rabbitmq02 rabbitmq03
2.4、启动 RabbitMQ 容器
注:
--hostname
设置容器的主机名RABBITMQ_ERLANG_COOKIE
节点认证作用,部署集成时需要同步该值(即rabbit@主机名
)
$ docker run -d
# 容器主机名
--hostname rabbitmq01 \
# 为容器分配名称
--name rabbitmqCluster01 \
# 绑定挂载卷
-v /home/rabbitmq/rabbitmqcluster/rabbitmq01:/var/lib/rabbitmq \
# 容器的端口与主机端口的映射
-p 15673:15672 -p 5673:5672 \
# 设置环境变量
# RABBITMQ_DEFAULT_VHOST:默认虚拟机名
# RABBITMQ_DEFAULT_USER: 默认的用户名
# RABBITMQ_DEFAULT_PASS: 默认用户名的密码
-e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' \
# 使用的自定义网络
--net rabbitmqClusterNet \
# 重启策略,当docker服务重启后,容器也会自动启动
--restart=always \
# RabbitMQ 版本
rabbitmq:3.10-management
# -----------------------------------------------------------------------------
$ docker run -d --hostname rabbitmq02 --name rabbitmqCluster02 \
-v /home/rabbitmq/rabbitmqcluster/rabbitmq02:/var/lib/rabbitmq \
-p 15674:15672 -p 5674:5672 \
-e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' \
--net rabbitmqClusterNet \
--restart=always \
rabbitmq:3.10-management
# -----------------------------------------------------------------------------
$ docker run -d --hostname rabbitmq03 --name rabbitmqCluster03 \
-v /home/rabbitmq/rabbitmqcluster/rabbitmq03:/var/lib/rabbitmq \
-p 15675:15672 -p 5675:5672 \
-e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' \
--net rabbitmqClusterNet \
--restart=always \
rabbitmq:3.10-management
-e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie'
必须设置为相同,因为 Erlang节点间是通过认证 Erlang cookie 的方式来允许互相通信的。
2.5、防火墙开启端口
# 批量开放端口
firewall-cmd --zone=public --add-port=15673-15675/tcp --permanent
firewall-cmd --zone=public --add-port=5673-5675/tcp --permanent
# 重新载入一下防火墙设置,使设置生效
firewall-cmd --reload
# 查看系统所有开放的端口
firewall-cmd --zone=public --list-ports
2.6、访问测试
启动容器成功后,访问
查看是否正常启动成功。默认账号/密码:guest / guest。
2.7、RabbitMQ 集群配置
1)进入第一个 RabbitMQ 节点容器,执行命令:
$ docker exec -it rabbitmqCluster01 /bin/bash
# rabbitmqctl stop 会将 Erlang 虚拟机关闭
# abbitmqctl stop_app 只关闭 RabbitMQ 服务
rabbitmqctl stop_app
rabbitmqctl reset
# 只启动应用服务
rabbitmqctl start_app
exit
2)进入第二个 RabbitMQ 节点容器,执行命令:
$ docker exec -it rabbitmqCluster02 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit
3)进入第二个 RabbitMQ 节点容器,执行命令:
$ docker exec -it rabbitmqCluster03 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit
这个命令执行前需要停止 RabbitMQ 应用并重置节点。参数 --ram
表示同步 rabbit@rabbitmq01
的内存节点,忽略次参数默认为磁盘节点。
# 将节点加入指定集群中。
rabbitmqctl join_cluster {cluster_node} [–ram]
# 解除集群节点
rabbitmqctl forget_cluster_node {cluster_node}
以上实现的是普通集群模式
4)最后,实现镜像模式集群。进入 rabbitmqCluster01 容器中
$ docker exec -it rabbitmqCluster01 /bin/bash
rabbitmqctl set_policy -p / ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
这行命令在 vhost 名称为 / 创建了一个策略,策略名称为 ha-all,策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为 “^” 表示所有匹配所有队列名称。
RabbitMQ 镜像策略 set_policy
vhosts 的操作
rabbitmqctl add_vhost <vhost>
rabbitmqctl delete_vhost <vhost>
rabbitmqctl list_vhosts [<vhostinfoitem> ...]
参数设置格式:
# 设置
rabbitmqctl set_policy <name> <pattern> <definition> [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>]
# 清除
rabbitmqctl clear_policy [-p <vhost>] <name>
# 查看
rabbitmqctl list_policies [-p <vhost>]
参数
-
ha-mode:策略键
-
all
: 队列镜像在群集中的所有节点上。当新节点添加到群集时,队列将镜像到该节点 。 -
exactly
: 集群中的队列实例数。 -
nodes
: 队列镜像到节点名称中列出的节点。
-
-
ha-sync-mode:队列同步
manual
: 手动(默认模式)。 新的队列镜像将不会收到现有的消息,它只会接收新的消息。automatic
自动同步。当一个新镜像加入时,队列会自动同步。队列同步是一个阻塞操作。
2.8、查看集群的状态
rabbitmqctl cluster_status
2.9、创建用户
# 进入容器
$ docker exec -it rabbitmqCluster01 /bin/bash
# 创建账号
$ rabbitmqctl add_user admin admin
# 设置用户角色
$ rabbitmqctl set_user_tags admin administrator
# 设置用户权限
# 该命令使用户 admin 具有 / 这个 virtual host 中所有资源的配置、写、读权限以便管理其中的资源
$ rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
$ exit
2.10、负载均衡设置
有了集群之后设置负载均,为了防止出现对单一节点造成高负载的情况。
/home/rabbitmqcluster/nginx/nginx_rabbitmq1.conf , 记得防火墙打开 15676
和 5676
端口。
/home/rabbitmqcluster/nginx/nginx_rabbitmq2.conf , 记得防火墙打开 15677
和 5677
端口。
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
# tcp_nopush on;
keepalive_timeout 65;
# gzip on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
# rabbitmq 管理界面
upstream rabbitManage {
server 192.168.40.25:15673;
server 192.168.40.25:15674;
server 192.168.40.25:15675;
}
server {
listen 15676; # 15677;
server_name 192.168.40.25;
location / {
proxy_pass http://rabbitManage;
index index.html index.htm;
}
}
}
# rabbitmq 通信
stream{
upstream rabbitTcp{
server 192.168.40.25:5673;
server 192.168.40.25:5674;
server 192.168.40.25:5675;
}
server {
listen 5676; # 5677;
proxy_pass rabbitTcp;
}
}
docker 启动 Nginx
docker run -it -d --name nginxRabbitmq1 \
-v /home/rabbitmqcluster/nginx/nginx_rabbitmq1.conf:/etc/nginx/nginx.conf \
--privileged --net=host \
--restart=always \
nginx
docker run -it -d --name nginxRabbitmq2 \
-v /home/rabbitmqcluster/nginx/nginx_rabbitmq2.conf:/etc/nginx/nginx.conf \
--privileged --net=host \
--restart=always \
nginx
# -v /data/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
# -v /data/docker/nginx/html:/usr/share/nginx/html \
# -v /data/docker/nginx/logs:/var/log/nginx \
Docker 学习笔记(十一)-- Docker 网络_稻草人0.0的博客-CSDN博客
访问地址测试:
Nginx / LVS / HAProxy 的区别
(总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解 (ha97.com)
3、keepalive
3.1、keepalive 是什么
keepalive 是在 TCP 中一个可以检测死连接的机制。
Keepalive 是Linux下一个轻量级别的高可用解决方案(存活检测机制)。
起初针对 LVS 进行研发,专门用来监控集群系统中各个服务节点的状态。它根据 TCP/IP 参考模型的第三、四、五层(网络层,传输层和应用层)交换机制检测每个服务节点的状态,如果某个服务器节点出现异常或故障,Keepalived 将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
3.2、VRRP 协议
VRRP 协议又叫虚拟路由冗余协议。
VRRP 是一种容错协议,它通过把几台路由设备联合组成一台虚拟的路由设备,并通过一定的机制来保证当主机的下一跳设备出现故障时,可以及时将业务切换到其它设备,从而保持通讯的连续性和可靠性。
VRRP 将局域网内的一组路由器划分在一起,称为一个备份组。备份组由一个 Master 路由器和多个 Backup 路由器组成,功能上相当于一台虚拟路由器。局域网内的主机只需要知道这个虚拟路由器的 IP 地址,并不需知道具体某台设备的 IP 地址,将网络内主机的缺省网关设置为该虚拟路由器的 IP 地址,主机就可以利用该虚拟网关与外部网络进行通信。
VRRP 将该虚拟路由器动态关联到承担传输业务的物理路由器上,当该物理路由器出现故障时,再次选择新路由器来接替业务传输工作,整个过程对用户完全透明,实现了内部网络和外部网络不间断通信。
3.3、keepalive 原理
TCP会在空闲了一定时间后发送数据给对方:
1、如果主机可达,对方就会响应 ACK 应答,就认为是存活的。
2、如果主机可达,但应用程序退出,对方就发 FIN 应答,发送 TCP 撤消连接。
3、如果主机可达,但应用程序崩溃,对方就发 RST 消息。
4、如果对方主机不响应 ACK 或 RST,继续发送直到超时,就撤消连接。这个时间就是默认的二个小时。
-
Initialize 模式
- 设备启动时进入此状态,当收到接口Startup的消息,将转入Backup或Master状态(IP地址拥有者的接口优先级为255,直接转为Master)。在此状态时,不会对VRRP报文做任何处理。
-
Master 模式
- 定期发送 VRRP 报文
- 以虚拟 MAC 地址响应对虚拟 IP 地址的 ARP 请求
- 转发目的标MAC 地址为虚拟 MAC 地址的 IP 报文
- 如果它是这个虚拟 IP 地址的拥有者,则接收目的 IP 地址为这个虚拟 IP 地址的 IP 报文。否则,丢弃这个 IP 报文
- 如果收到比自己优先级大的报文则转为 Backup 状态
- 如果收到优先级和自己相同的报文,并且发送端的 IP 地址比自己的 IP 地址大,则转为 Backup 状态
- 当接收到接口的 Shutdown 事件时,转为Initialize(初始状态)
-
Backup 模式
- 接收 Master 发送的 VRRP 报文,判断 Master 的状态是否正常
- 对虚拟 IP 地址的 ARP 请求,不做响应
- 丢弃目的 MAC 地址为虚拟 MAC 地址的 IP 报文
- 丢弃目的 IP 地址为虚拟 IP 地址的IP报文
- Backup 状态下如果收到比自己优先级小的报文时,丢弃报文,立即切换为 Master( 仅在抢占模式下生效 )
- 如果收到优先级和自己相同或者比自己高的报文,则重置定时器,不进一步比较 IP 地址
- 当接收到接口的 Shutdown 事件时,转为 Initialize
- 如果 MASTER_DOWN_INTERVAL 定时器超时,则切换为 Master
3.4、keepalive 的各项功能
-
后端节点健康状态检测
- 目的:搭配 LVS 使用,当后端节点出现故障时。主动剔除出集群,使集群后端节点出现故障时用户可以较为畅通的访问相应的资源。
-
脚本调用
-
脚本所在目录:
/etc/keepalive/script/
-
服务检测脚本:
-
当keepalive对其他服务(非LVS)进行高可用时,使服务器出现故障时可迅速切换至从节点,使用户仍可以正常访问后端真实服务器
-
切换至主节点脚本:当从节点承当负载调度器的角色时,需获取一些资源,比如目录的挂载
-
切换至关闭状态脚本:当该服务器需要关闭时,需释放一些资源,以免多台调度器同时写入某文件以致文件损坏
-
-
-
非抢占模式
-
在主节点和备份节点性能相差不大时采用非抢占模式,可减少资源的浪费和提升用户体验(减少用户不能使用的时间)
-
在非抢占模式中,配置文件中应都为备份模式
-
3.5、keepalive 的安装
- yum方式安装
yum -y install keepalived
# 查看安装路径
rpm -ql keepalived
- 源码安装
# 1、安装依赖
yum -y install gcc openssl-devel libnfnetlink-devel
# 2、下载源码
wget https://www.keepalived.org/software/keepalived-1.4.5.tar.gz
# 3、解压
tar -zxvf keepalived-1.4.5.tar.gz -C /usr/src
# 4、编译安装
cd /usr/src/keepalived-1.4.5/
./configure && make -j 4 && make install
3.6、keepalive 配置文件
keepalived安装及配置文件详解 - 知乎 (zhihu.com)
Keepalived部署与配置详解 - 昀溪 - 博客园 (cnblogs.com)
Keepalived 主配置文件 : /etc/keepalived/keepalived.conf
安装 lrzsz 包。执行命令:
yum install lrzsz
sz 命令的优点是不用再开一个 sftp 工具登录上去上传下载文件,sz 可以直接将将选定的文件发送(send)到本地机器。
# 全局定义块
global_defs {
# email 通知,用于服务有故障时发送邮件报警。可选项,不建议用。
# 需系统开启 sendmail 服务,建议用第三方独立监控服务,如使用 nagios 监控代替。
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
# 指定发件人,可选配置。
notification_email_from Alexandre.Cassen@firewall.loc
# 指定发送邮件的 smtp 服务器地址,可选配置。
smtp_server 192.168.200.1
# 指定连接 smtp 的超时时间,可选配置。
smtp_connect_timeout 30
# 用户标识本节点的名称,通常为 hostname 路由器标志
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 定义检测脚本名
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx_rabbitmq.sh" # 检测脚本执行状态
interval 1 # 检测脚本状态间隔时间
weight -2 # 权重值,脚本检测失败,优先级会减去2。
}
# VRRP 实例定义块 vrrp 协议相关配置(vip地址设置)
vrrp_instance VI_1 { # 定义一个 vrrp_install 实例,名称为 VI_1
state MASTER # 表示该实例的角色状态,有 MASTER 和 BACKUP 两种主备状态。
interface eth0 # 对外提供服务的网络接口,如 eth0,ens33;监控本机上的哪个网卡,网卡一旦故障则需要把VIP转移出去
virtual_router_id 51 # 虚拟路由 ID 标识,主备服务器配置中相同实例的 ID 必须一致,否则将出现脑裂问题。
priority 100 # priority 表示实例优先级。数字越大,优先级越高。0-255
advert_int 1 # advert_int 为同步通知间隔。主备之间通信检查的时间间隔,默认为1秒。
authentication { # 权限认证配置。 主备主机之间通讯认证机制 心跳认证方式,明文,SHA,不认证三种
auth_type PASS # 采用明文认证机制
auth_pass 1111 # 编写明文密码(用于主备认证)
}
# 虚拟IP地址 可以配置多个IP,每个IP占一行。 VRRP VIP地址
# 注意,这里的IP就是在工作中需要和域名绑定的ip,即可配置的高可用服务监听的ip保持一致。
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
nopreempt # 非抢占模式
unicast_src_ip 192.168.64.133 # 使用单播发送心跳信号,本地作为单播源IP
unicast_peer { # 单播目的IP,另外一台节点
192.168.64.130
}
track_script { # 探测脚本执行
chk_nginx
}
# 定义在状态进行转换时的通知脚本。
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
# 虚拟服务器定义块
# virtual_server:定义一个虚拟服务器。
# 这个 ip 是 virtual_address 中定义的其中一个。语法格式:ip+空格+服务端口
virtual_server 10.10.10.2 1358 {
delay_loop 6 # service polling 的 delay 时间,即服务轮询的时间间隔(健康检查时间间隔)
lb_algo rr # 负载均衡调度算法,互联网应用常用方式为 wlc 或 rr (LVS调度算法)
lb_kind NAT # 负载均衡转发规则,包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。(LVS集群模式)
persistence_timeout 50 # http服务会话保持时间,单位:秒 即以用户在50秒内被分配到同一个后端realserver
protocol TCP # 转发协议,分为TCP和UDP两种,健康检查用的是TCP还是UDP
sorry_server 192.168.200.200 1358
# 真实服务器IP和端口,可以定义多个
real_server 192.168.200.2 1358 {
weight 1 # 负载权重,值越大,转发的优先级越高 0表示失效(不知给他转发请求知道他恢复正常),默认是1
# 使用HTTP_GET方法去检查
HTTP_GET {
# 检测URL
url {
path /testurl/test.jsp # 具体检测哪一个URL
digest 640205b7b0fc66c1ea91c463fac6334d # 检测内容的哈希值
# 除了检测哈希值还可以检测状态码,比如HTTP的200 表示正常,两种方法二选一即可
status_code 200
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3 # 服务连接超时时长,单位:秒
nb_get_retry 3 # 服务连接失败重试次数
delay_before_retry 3 # 重试连接间隔,单位:秒
}
}
real_server 192.168.200.3 1358 {
# 应用服务器UP或者DOWN,就执行那个脚本
notify_up "/usr/local/notify.sh up"
notify_down "/usr/local/notify.sh down"
}
}
4、RabbitMQ 集群使用 keepalived
Rabbitmq+Nginx+keepalived高可用热备 - 王翊辰 - 博客园 (cnblogs.com)
Rabbitmq集群及使用keepalived实现rabbitmq高可用性集群_dayi_123的博客-CSDN博客
docker+nginx+keepalived部署实现nginx高可用_Lacloud的博客-CSDN博客
4.1、Nginx 容器
两个 nginx 容器分别安装 keepalived,并编写 keepalived 配置文件以及启动 keepalived。
# Nginx1
$ docker exec -it nginxRabbitmq1 /bin/bash
apt-get -y update
apt-get -y install vim
apt-get -y install keepalived
vim /etc/keepalived/keepalived.conf
# Nginx2
$ docker exec -it nginxRabbitmq2 /bin/bash
apt-get -y update
apt-get -y install vim
apt-get -y install keepalived
vim /etc/keepalived/keepalived.conf
# 将虚拟机上的文件拷贝到容器中
$ docker cp keepalived.conf [容器ID]:/etc/keepalived/
nginx 使用的 docker 网络是 host,网卡共用虚拟机的网卡:
注意 : 有的是
eth0
或者eth33
keepalived.conf 配置文件:
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 # 需要绑定虚拟 ip 的网卡 (host模式 和虚拟机共用IP)
virtual_router_id 51
priority 100 # 备份服务上将100改为小于100,可配置成50
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.40.25 # 虚拟ip,有多个vip可在下面继续增加
}
}
virtual_server 192.168.40.25 15678 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.40.25 15676 {
weight 1
}
# real_server 192.168.40.25 15677 { # 备份服务器上
# weight 1
# }
}
virtual_server 192.168.40.25 5678 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.40.25 5676 {
weight 1
}
# real_server 192.168.40.25 5677 { # 备份服务器上
# weight 1
# }
}
启动 Keepalived:
service keepalived start
4.2、虚拟机
主机上安装 keepalived 并启动
kdir -p /home/keepalived/bak/
mv /etc/keepalived/keepalived.conf /home/keepalived/bak/keepalived.conf
vim /etc/keepalived/keepalived.conf
keepalived.conf 配置文件:
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.40.25
}
}
virtual_server 192.168.40.25 15678 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.40.25 15676 {
weight 1
}
real_server 192.168.40.25 15677 {
weight 1
}
}
virtual_server 192.168.40.25 5678 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.40.25 5676 {
weight 1
}
real_server 192.168.40.25 5677 {
weight 1
}
}
启动 Keepalived:
service keepalived start
4.3、测试
防火墙开启端口:
firewall-cmd --zone=public --add-port=15678/tcp --permanent
firewall-cmd --zone=public --add-port=5678/tcp --firewall-cmd --reload
firewall-cmd --reload
访问测试:
1)停止 nginxRabbitmq1 测试能否还能访问
$ docker stop nginxRabbitmq1
2)停止 nginxRabbitmq2 测试能否还能访问
$ docker start nginxRabbitmq1
$ docker stop nginxRabbitmq2
出现的问题
不知道为什么当停止 2)执行完成之后需要等几分钟才能访问到登录界面。
这时间存在问题,太久了。按理说应该没啥时间间隙才对。
建议使用多个虚拟机或者 docker centos 来进行测试学习,感觉比较正常一点。
配置 firewalld 防火墙允许 vrrp 协议
VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.40.25" protocol value="vrrp" accept"
firewall-cmd --reload