Nginx 使用 Keepalived 搭建 nginx 高可用

06-01 1321阅读

一、环境准备

两台装有 nginx 的 CentOS 虚拟机。

Nginx 使用 Keepalived 搭建 nginx 高可用

[root@nginx1 ~]# echo "192.168.40.81 say Hello" > /usr/local/nginx/html/index.html
[root@nginx2 ~]# echo "192.168.40.82 say Hello" > /usr/local/nginx/html/index.html

二、原理

Nginx 使用 Keepalived 搭建 nginx 高可用

Keepalived 为我们后端服务器组虚拟出一组 VIP,该 VIP 只能由优先级最高的一台服务器持有。客户端访问,就只访问 VIP。

Nginx 使用 Keepalived 搭建 nginx 高可用

当主服务器挂掉之后,Keepalived 自动帮我们把 VIP 漂移到 BACKUP 服务器。以此来保证服务的高可用。

Keepalived 通过检测服务器上的 Keepalived 进程的存活状态,来判断服务器是否存活。

三、安装

1)安装 keepalived

# 在 nginx1 安装 keepalived
[root@nginx1 ~]# yum install -y keepalived
# 在 nginx2 安装 keepalived
[root@nginx2 ~]# yum install -y keepalived

  2)配置

使用 yum 安装后配置文件在 /etc/keepalived/keepalived.conf

# 备份 nginx1 keepalived 配置文件
[root@nginx1 keepalived]# cp keepalived.conf keepalived.conf.bak
# 备份 nginx2 keepalived 配置文件
[root@nginx2 keepalived]# cp keepalived.conf keepalived.conf.bak
  •  nginx1 上 keepalived.conf:
    ! Configuration File for keepalived
    global_defs {
       router_id lb1
    }
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.40.80
        }
    }
    • global_defs:全局配置标识。
    • router_id:路由器标识,一般不用改,也可以写成每个主机自己的主机名。
    • vrrp_instance:一个 vrrp_instance 就是定义一个虚拟路由器的,VI_1 是实例名称。
    • state:指定 keepalived 的角色,MASTER 表示此主机是主服务器,BACKUP 表示此主机是备服务器。
    • interface:指定检测网络的网卡接口。就比如下图的 ens33。

      Nginx 使用 Keepalived 搭建 nginx 高可用

      • virtual_router_id:虚拟路由标识,数字形式,同一个 VRRP 实例使用唯一的标识,即在同一个 vrrp_instance下,master 和 backup 必须一致。
      • priority:节点优先级,数字越大表示节点的优先级越高,在一个 VRRP 实例下,MASTER 的优先级必须要比 BACKUP 高,不然就会切换角色。
      • advert_int:用于设定 MASTER 与 BACKUP 之间同步检查的时间间隔,单位为秒。
      • auth_type:预共享密钥认证,同一个虚拟路由器的 keepalived 节点必须一样。
      • auth_pass:设置密钥。
      • virtual_ipaddress:设置虚拟IP地址,可以设置多种形式:
      • 10.0.0.100 不指定网卡,默认为 eth0,注意:不指定/prefix,默认为/32;
      • 10.0.0.101/24 dev eth1 指定 VIP 的网卡;
      • 10.0.0.102/24 dev eth2 label eth2:1 指定 VIP 的网卡 label。
        • nginx2 上 keepalived.conf:
          ! Configuration File for keepalived
          global_defs {
             router_id lb2
          }
          vrrp_instance VI_1 {
              state BACKUP
              interface ens33
              virtual_router_id 51
              priority 90
              advert_int 1
              authentication {
                  auth_type PASS
                  auth_pass 1111
              }
              virtual_ipaddress {
                  192.168.40.80
              }
          }

          3)启动

          # 启动 MASTER 服务器 keepalived 并设置为开机自启动
          [root@nginx1 keepalived]# systemctl enable keepalived --now
          [root@nginx1 keepalived]# systemctl status keepalived
          [root@nginx1 keepalived]# ip a

          Nginx 使用 Keepalived 搭建 nginx 高可用

          会发现 MASTER 服务器多出了 192.168.40.80 这个IP。

          # 启动 BACKUP 服务器 keepalived 并设置为开机自启动
          [root@nginx2 keepalived]# systemctl enable keepalived --now
          [root@nginx2 keepalived]# systemctl status keepalived
          [root@nginx2 keepalived]# ip a

          Nginx 使用 Keepalived 搭建 nginx 高可用

          备份服务器并不持有 VIP。

           4)访问

          此时访问 VIP,请求都是被打到 MASTER 上的 nginx。

          Nginx 使用 Keepalived 搭建 nginx 高可用

           5)故障测试

          # 停掉 MASTER
          [root@nginx1 ~]# init 0
          

          Nginx 使用 Keepalived 搭建 nginx 高可用

          Nginx 使用 Keepalived 搭建 nginx 高可用

           此时 VIP 飘移到 BACKUP。

          6)重启 MASTER

           此时 VIP 又漂移回来了。Nginx 使用 Keepalived 搭建 nginx 高可用

          Nginx 使用 Keepalived 搭建 nginx 高可用

          四、定制脚本

          Keepalived 通过检测服务器上的 Keepalived 进程的存活状态,来判断服务器是否存活。

          但如果此时,我们的服务器没有挂,但是我们希望 Keepalived 保活的服务(比如 nginx)挂了,由于 Keepalived 进程没有挂,这个时候,Keepalived 是不会帮我们主备切换的。

          # 停掉 MASTER
          [root@nginx1 ~]# systemctl stop nginx

          Nginx 使用 Keepalived 搭建 nginx 高可用

           这个时候 VIP 并没有迁移走。这个时候,我们就得自己写一个脚本,去检测 nginx 存活状态,如果 nginx 挂了,人为杀死 keepalived 进程,让 keepalived 帮我们主备切换。

          先重新启动 nginx

          [root@nginx1 ~]# systemctl start nginx

          1)修改 keepalived.conf

          •  nginx1 上 keepalived.onf:
            ! Configuration File for keepalived
            global_defs {
               router_id lb1
            }
            vrrp_script check_nginx {
                script "pgrep nginx"
                interval 2
                weight 50  # 当检查失败时,优先级会减去这个值
                fall 2
                rise 2
            }
            vrrp_instance VI_1 {
                state MASTER
                interface ens33
                virtual_router_id 51
                priority 100
                advert_int 1
                authentication {
                    auth_type PASS
                    auth_pass 1111
                }
                virtual_ipaddress {
                    192.168.40.80
                }
                track_script {
                    check_nginx
                } 
            }
            •  nginx2 上 keepalived.conf:
              ! Configuration File for keepalived
              global_defs {
                 router_id lb2
              }
              vrrp_script check_nginx {
                  script "pgrep nginx"
                  interval 2
                  weight 50  # 当检查失败时,优先级会减去这个值
                  fall 2
                  rise 2
              }
              vrrp_instance VI_1 {
                  state BACKUP
                  interface ens33
                  virtual_router_id 51
                  priority 90
                  advert_int 1
                  authentication {
                      auth_type PASS
                      auth_pass 1111
                  }
                  virtual_ipaddress {
                      192.168.40.80
                  }
                  track_script {
                      check_nginx
                  } 
              }

              2)重启 keepalived

              [root@nginx1 keepalived]# sudo systemctl restart keepalived
              [root@nginx2 keepalived]# sudo systemctl restart keepalived
              

              3)停掉 MASTER 

              # 停掉 MASTER
              [root@nginx1 ~]# systemctl stop nginx

              Nginx 使用 Keepalived 搭建 nginx 高可用

              Nginx 使用 Keepalived 搭建 nginx 高可用

               VIP 这次终于被迁移到 BACKUP。

              五、应用场景

              Keepalived + Nginx 的组合有很多应用场景:

              • 搭建 Nacos 高可用集群
              • 搭建 K8S Ingress 入口
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码