nginx 主备+keepalived实现服务高可用

176 阅读4分钟

keepalived 实现高可用

前言: 互联网行业的三高

高可用 高性能 高并发 所以基于第一点,高可用。nginx作为高性能的,反向代理服务器。如果只有一个节点就无法做到高可用,假如就一个节点。 如果这个时候因为一些特殊情况,这个节点挂了。导致我们后端和前台提供的服务用户不可用。这个时候无论我们后端架构和前端架构做的在优秀也于事无补,因为用户根本访问不到。 所以基本上部署两个节点,主节点和备用节点。这个时候问题就来了。就算部署了两个节点,前端访问的时候,总不可能让前端调用两个地址把!所以基于这一点,使用keepalived的 vrrp 协议进行设置 虚拟ip。然后前端只需要知道这个虚拟ip即可,具体使用的是哪个nginx,完全由keepalived决定。

环境准备

  1. 两台2核心2G的虚拟机 ,系统 centos 8

    1. master 主节点虚拟机
    2. slave 备用节点虚拟机
  2. ip

    1. master 192.168.96.124
    2. slave 192.168.96.122
    3. vip 192.168.96.250 // 虚拟ip,用于访问nginx 使用
  3. 软件环境

    1. nginx
    2. keepalived

安装nginx

  1. 修改yum 镜像源

    vim /etc/yum.repos.d/nginx.repo

    ​
    ​
    # nginx.repo(删除原理的镜像源,把下面的复制进去)[nginx]
    name=nginx
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=0
    enabled=1
  2. 更新镜像源

    yum update
    

安装nginx-master

install

yum install nginx -y

启动

systemctl start nginx

image-20221001153613519

安装nginx-Slave

install

yum install nginx -y

启动

systemctl start nginx

image-20221001153629318

默认配置文件位置:(主,备配置文件一致,都是在下面这个位置)

  1. 可执行文件:/usr/sbin/nginx
  2. 配置文件nginx.conf:/etc/nginx
  3. 用户自定义配置文件:/etc/nginx/conf.d
  4. 默认主页:/usr/share/nginx/html

安装keepalived

Master(主)

install

yum -y install keepalived

启动

systemctl start keepalived

image-20221001153816101

config(修改配置)

  1. keepalived.conf(默认抢占式)

    1 查询网卡名称
    ip addr
    2 vim /etc/keepalived/keepalived.conf
    ​
    3 添加nginx 状态检查脚本
     vrrp_script chk_http_ port {
        script "/usr/local/src/nginx_check.sh"   #检测脚本,这个脚本在下面第二步进行创建
        interval 1   # (检测脚本执行的间隔)1s
        weight -21  #权重,如果这个脚本检测为真,服务器权重+2
    }
    ​
    4 修改 varrp_instance_VI_1的内容,为下面内容
    vrrp_instance VI_1 {
        state MASTER # 主节点MASTER
        interface ens33 # ip addr 查询到的网卡信息
        virtual_router_id 51
        priority 100 # 权重信息默认
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.96.250 # 设置虚拟ip
        }
        # 监听nginx 脚本
       track_script {
          chk_http_ port
        }
    }
    ​
    
  2. 检查nginx状态配置

    1 cd /usr/local/src  //切换到src目录下,执行下面vim 创建脚本
      vim nginx_check.sh
    # 复制如下内容到 nginx_check.sh 里面
    A=`ps -C nginx --no-header |wc -l`
    ​
    if [ $A -eq 0 ];then
          # 当nginx 关闭,就立刻关闭 keepalived,用于转移虚拟ip到备用机上。
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
    ​
          systemctl stop keepalived
    ​
        fifi
    ​
    2 更改 nginx_check.sh 执行权限 
     chmod +x nginx_check.sh
    

    重启keepalived

    systemctl restart keepalived
    ​
    

Slave(备)

install

yum -y install keepalived

启动

systemctl start keepalived

image-20221001153816101

config(修改配置)

  1. keepalived.conf(默认抢占式)

    1 询网卡名称
    ip addr
    2vim /etc/keepalived/keepalived.conf
    3 添加nginx 状态检查脚本
     vrrp_script chk_http_ port {
        script "/usr/local/src/nginx_check.sh"   #检测脚本,这个脚本和master 一样。参考下面步骤 5 把文件复制到当前机器
        interval 1   # (检测脚本执行的间隔)1s
        weight -21  #权重,如果这个脚本检测为真,服务器权重+2
    }
    ​
    4 修改 varrp_instance_VI_1的内容,为下面内容
    vrrp_instance VI_1 {
        state BACKUP # 备节点 BACKUP
        interface ens33 # ip addr 查询到的网卡信息
        virtual_router_id 51
        priority 90 # 降低权重
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.96.250 # 设置虚拟ip
        }
        # 监听nginx 脚本
       track_script {
          chk_http_ port
        }
    }
    5 从新登录mast机器上,切到如下目录
    cd /usr/local/src/
    执行如下命令,进行把当前目录下的检查nginx 状态脚本复制到备用机器上
    scp ./nginx_check.sh root@192.168.96.124:/usr/local/src/
    6 改 nginx_check.sh 执行权限 
     chmod +x nginx_check.sh
    

    重启keepalived

    systemctl restart keepalived
    

效果

正常访问虚拟ip

161224-174962[1].png

Master 宕机访问

关闭maser nginx

systemctl stop nginx

image-20221001161331979

自动切换到备用机上

161354-307525[2].png

Master 恢复,访问再次被抢回(这就是抢占式)

  1. 启动nginx

    systemctl start nginx
    

  1. 启动keepalived

    systemctl start keepalived
    

再次访问nginx-已经切回master节点

image-20221001161834515

感谢阅读~本次关于nginx+keepalived(抢占式)实现服务高可用,总结到此结束。