• nginx两台负载均衡服务器之间使用keepalived实现高可用


    高可用HA

    单点故障:某个重要的功能只有一份,如果他出现问题,会导致全局不能使用

    高可用性”(High Availability,缩写为HA)用于描述系统或服务在面临故障、硬件或软件问题时能够继续正常运行的能力。高可用性的目标是最大程度地减少系统中断或停机时间,确保用户可以随时访问服务或应用程序。

    三个经典的高可用软件:hearbeat、keepalived、HAproxy

    keepalived实现高可用

    keepalived两大核心功能:
    1、loadbalance 负载均衡:ipvs -> LVS软件在Linux内核里已经安装
    2、high-avaliability 高可用:vrrp协议(虚拟路由冗余协议)

    keepalived启动之后会有三个进程:
    父进程: 内存管理,子进程管理等
    子进程: VRRP子进程
    子进程: healthchecker子进程,查看各自服务器的健康状况

    出错了可以看日志:/var/log/messages

    两台负载均衡器上都需要安装nginx,使用nginx做七层负载均衡,

    VRRP协议

    virtual router redundancy protocol 虚拟路由冗余协议
    一组路由器协同工作,担任不同工作,担任不同角色,有master角色,也有backup角色
    master角色的路由器(的接口)承担实际的数量流量转发任务
    backup路由器监听master路由器的状态,并在master路由器发生故障时,接替其工作,从而保证业务流量的平滑切换

    vrrp协议工作在网络层
    vrrp协议使用固定的组播地址224.0.0.18进行发送
    帧的组播地址:目的地址 - 01:00:5E:00:00:12
    第8位为1,代表这个mac地址是一个广播地址

    vrrp协议的工作原理:

    1. 所有的路由器或服务器发生vrrp宣告报文,进行选举,必须是相同vrid和认证密码,优先级高的服务器或路由器会被选举为master
    2. master定时发生vrrp通告报文,以便向backup路由器告知自己的存活情况,默认时间间隔是1秒
    3. 接收master设备发送的vrrp通告报文,判断master设备的状态是否正常。如果超过1秒没有收到vrrp报文,就认为master挂了,开始重新选举新的master,vip会飘移到新的master上

    单VIP架构

    LB2:192.168.232.165

    1. 在两台LB上安装keepalived

      yum install keepalived -y
      
      • 1
    2. 修改主LB的配置文件

      cd /etc/keepalived/
      vim keepalived.conf
      
      ! Configuration File for keepalived
      
      global_defs {
         notification_email {
           acassen@firewall.loc
           failover@firewall.loc
           sysadmin@firewall.loc
         }
         notification_email_from Alexandre.Cassen@firewall.loc
         smtp_server 192.168.200.1
         smtp_connect_timeout 30
         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    # 主LB
          interface ens33
          virtual_router_id 58    # 虚拟路由器id
          priority 120    # 优先级(0~255)
          advert_int 1    # 宣告消息的间隔事件为1秒
          authentication {    # 认证
              auth_type PASS
              auth_pass 1111
          }
          virtual_ipaddress {    # VIP
              192.168.232.111
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
    3. 修改从LB的配置文件

      cd /etc/keepalived/
      vim keepalived.conf
      
      ! Configuration File for keepalived
      
      global_defs {
         notification_email {
           acassen@firewall.loc
           failover@firewall.loc
           sysadmin@firewall.loc
         }
         notification_email_from Alexandre.Cassen@firewall.loc
         smtp_server 192.168.200.1
         smtp_connect_timeout 30
         router_id LVS_DEVEL
         vrrp_skip_check_adv_addr
         #vrrp_strict
         vrrp_garp_interval 0
         vrrp_gna_interval 0
      }
      
      vrrp_instance VI_1 {
          state BACKUP    # 从LB
          interface ens33
          virtual_router_id 58
          priority 100    # 优先级要比主LB小
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          virtual_ipaddress {
              192.168.232.111
          }
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
    4. 配置完成之后刷新服务

      service keepalived restart 
      
      • 1

      这个时候就可以在主LB服务器上看到VIP,而从LB服务器上没有这个VIP。VIP在哪一个服务器上,就由哪一个服务器对外提供服务

    VIP飘移

    master挂了(或keepalived服务关闭),VIP就会飘移到slave上,这个时候就可以在从LB上看到这个VIP。如果master恢复,VIP就会飘会主LB上(优先级更高)

    脑裂

    多台机器出现同一个VIP

    脑裂出现的原因:
    1、vrid(虚拟路由id)不一样
    2、网络通信有问题(防火墙组织了vrrp报文的通信)
    3、认证密码不一样

    双VIP架构(互为主从)

    双VIP的架构可以实现负载均衡

    只要将以下代码加入主LB的配置文件,作为第二个VIP的从服务器

    vrrp_instance VI_2 {
        state BACKUP
        interface ens33
        virtual_router_id 59
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.232.112
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    将以下代码加入从LB的配置文件,作为第二个VIP的主服务器

    vrrp_instance VI_2 {
        state BACKUP
        interface ens33
        virtual_router_id 59
        priority 120
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.232.112
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这个时候就可以在主LB上看到192.168.232.111这个VIP,在从LB上看到192.168.232.112

    完成高可用之后就可以在DNS服务器里添加这两个IP的记录了

    keepalived监控 、执行脚本

    Keepalived 可以通过检查状态来了解当前主服务器和备用服务器的状态

    keepalived的基础是nginx服务,nginx服务停止了,就会检测为状态异常

    实例:监控本机的nginx进程是否运行,如果nginx进程不运行就立马将优先级降低30

    如何判断nginx是否运行
    1、pidof nginx
    2、查看kiilall -0 nginx这条命令的返回值

    1. 编写监控nginx脚本,授予可执行权限,也可以直接写在keepalived里

      mkdir /nginx
      cd /nginx
      vim check_nginx.sh
      
      #!/bin/bash
      if /usr/sbin/pidof nginx &>/dev/null ;then
      	exit 0
      else
      	exit 1
      fi
      
      chmod +x check_nginx.sh
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    2. 在keepalived里定义并调用监控脚本

      # 在global_defts部分后面加:
      # 定义监控脚本chk_nginx
      # 当脚本执行返回值为1时才会执行下面权重值-30的操作
      vrrp_script chk_nginx {
      	script "/nginx/check_nginx.sh"
      	interval 1    # 每隔一秒执行
      	weight -30    # 返回值为0时就把优先级-30
      }
      
      #主LB在vrrp_instance VI_1中添加,从在VI_2中添加:
      # 调用监控脚本
      track_script {
      	chk_nginx
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

      是master的那个vrrp实例调用vrrp监控脚本

    notify

    notify脚本是当本节点服务器成为某个角色的时候,就会去执行某个脚本

    # 状态改变为master后执行的脚本
    notify_master "/mail/master.sh"
    
    # 状态改变为backup后执行的脚本
    notify_backup "/mail/backup.sh"
    
    # vrrp停止后执行的脚本
    notify_stop "/mail/stop.sh"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单
    开发高性能知识付费平台:关键技术策略
    基于写时复制技术的并发集合———CopyOnWriteArrayList源码分析
    传统制造企业进行数字化转型,是翻身还是翻船?
    小程序开发.微信小程序.组件.视图容器
    @Transactional 事务注解运用
    Docker 问题记录
    C++智能指针简介
    1.1 测控系统对测控电路的要求、测控电路中的重要指标
    Python使用模拟退火(Simulated Annealing)算法构建优化器获取机器学习模型最优超参数组合(hyperparameter)实战+代码
  • 原文地址:https://blog.csdn.net/qq_45742976/article/details/132666585