RabbitMQ 学习(九)-- RabbitMQ 集群

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、访问测试

启动容器成功后,访问

http://虚拟机IP:15673/#/

http://虚拟机IP:15674/#/

http://虚拟机IP:15675/#/

查看是否正常启动成功。默认账号/密码: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 , 记得防火墙打开 156765676 端口。

/home/rabbitmqcluster/nginx/nginx_rabbitmq2.conf , 记得防火墙打开 156775677 端口。

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博客

访问地址测试:

http://192.168.40.25:15676/

http://192.168.40.25:15677/

Nginx / LVS / HAProxy 的区别

(总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解 (ha97.com)

3、keepalive

keepalive_百度百科 (baidu.com)

keepalive 详解 - 知乎 (zhihu.com)

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

访问测试:

http://192.168.40.25:15678/

在这里插入图片描述

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

猜你喜欢

转载自blog.csdn.net/weixin_43989102/article/details/126634664