部署 LVS(nginx)+keepalived高可用负载均衡集群

目录

一、集群的概述

1、什么是集群

2、普通集群与负载均衡集群

[2.1 普通集群(Regular Cluster)](#2.1 普通集群(Regular Cluster))

[2.2 负载均衡集群(Load Balancing Cluster)](#2.2 负载均衡集群(Load Balancing Cluster))

[2.3 高可用集群(High Availability Cluster)](#2.3 高可用集群(High Availability Cluster))

[2.4 区别](#2.4 区别)

二、Keepalive基础概述

1、vrrp(虚拟路由冗余协议)技术

[1.1 vrrp协议概念](#1.1 vrrp协议概念)

[1.2 vrrp技术工作原理](#1.2 vrrp技术工作原理)

[1.3 vrrp状态机](#1.3 vrrp状态机)

[1.4 vrrp协议的抢占功能](#1.4 vrrp协议的抢占功能)

[2、keepalived 概述](#2、keepalived 概述)

[2.1 keepalived 作用](#2.1 keepalived 作用)

[2.2 Keepalived 架构](#2.2 Keepalived 架构)

[2.3 安装keepalived](#2.3 安装keepalived)

[2.4 keepalived的相关文件及组成](#2.4 keepalived的相关文件及组成)

[2.4.1 keepalived的相关文件](#2.4.1 keepalived的相关文件)

[2.4.2 主配置文件的组成](#2.4.2 主配置文件的组成)

[2.4.3 主配置文件的全局配置详解](#2.4.3 主配置文件的全局配置详解)

[2.4.4 主配置文件的vrrp_instance模块详解](#2.4.4 主配置文件的vrrp_instance模块详解)

[2.4.5 主配置文件的virtual_server模块详解](#2.4.5 主配置文件的virtual_server模块详解)

三、部署LVS+keepalived集群

1、部署master负载调度服务器

[1.1 修改主配置文件](#1.1 修改主配置文件)

[1.2 调整/proc响应参数](#1.2 调整/proc响应参数)

2、部署backup负载调度服务器

[2.1 修改主配置文件](#2.1 修改主配置文件)

[2.2 调整/proc响应参数](#2.2 调整/proc响应参数)

3、部署节点服务器1

[3.1 设置虚拟网卡(VIP)](#3.1 设置虚拟网卡(VIP))

[3.1.1 临时设置虚拟回环网卡](#3.1.1 临时设置虚拟回环网卡)

[3.1.2 永久设置虚拟回环网卡](#3.1.2 永久设置虚拟回环网卡)

[3.2 忽略ARP请求](#3.2 忽略ARP请求)

[3.2 安装并启动nginx软件](#3.2 安装并启动nginx软件)

[3.4 新建网页站点文件](#3.4 新建网页站点文件)

[3.5 关闭长连接](#3.5 关闭长连接)

4、部署节点服务器2

[4.1 设置虚拟网卡(VIP)](#4.1 设置虚拟网卡(VIP))

[4.1.1 临时设置虚拟回环网卡](#4.1.1 临时设置虚拟回环网卡)

[4.1.2 永久设置虚拟回环网卡](#4.1.2 永久设置虚拟回环网卡)

[4.2 忽略ARP请求](#4.2 忽略ARP请求)

[4.3 安装并启动nginx软件](#4.3 安装并启动nginx软件)

[4.4 新建网页站点文件](#4.4 新建网页站点文件)

[4.5 关闭长连接](#4.5 关闭长连接)

5、客户端测试

四、其他有用配置

1、主从抢占模式配置

[1.1 抢占模式(默认模式)](#1.1 抢占模式(默认模式))

[1.2 非抢占模式](#1.2 非抢占模式)

[1.3 延迟抢占模式](#1.3 延迟抢占模式)

2、组播/单播地址

[2.1 组播地址](#2.1 组播地址)

[2.2 单播地址](#2.2 单播地址)

3、通知脚本

[3.1 配置邮箱](#3.1 配置邮箱)

[3.2 编写脚本](#3.2 编写脚本)

[3.3 修改keepalived主配置文件](#3.3 修改keepalived主配置文件)

[3.4 测试](#3.4 测试)

4、日志功能

[4.1 修改keepalived日志配置文件](#4.1 修改keepalived日志配置文件)

[4.2 修改rsyslog主配置文件](#4.2 修改rsyslog主配置文件)

[五、实现其它应用的高可用性 VRRP Script](#五、实现其它应用的高可用性 VRRP Script)

[1、VRRP Script实现步骤](#1、VRRP Script实现步骤)

2、部署nginx+keepalived集群

[2.1 部署master调度服务器](#2.1 部署master调度服务器)

[2.1.1 修改nginx主配置文件](#2.1.1 修改nginx主配置文件)

[2.1.2 修改keepalived主配置文件](#2.1.2 修改keepalived主配置文件)

[2.2 部署backup调度服务器](#2.2 部署backup调度服务器)

六、高可用集群的脑裂问题

1、什么是脑裂

2、导致脑裂的原因

3、预防和解决脑裂问题

4、使用iptables规则模拟脑裂


一、集群的概述

1、什么是集群

在计算机科学中,集群(Cluster)是指一组相互连接的计算机(节点),这些计算机协同工作以完成共同的任务。集群可以通过网络相互通信和协作,从而形成一个整体系统

由多台主机构成,但对外只能表现为一个整体,只提供一个访问入口(域名或者ip地址),相当于一个大型计算机

集群通常被用于提高计算性能、可靠性和可扩展性

2、普通集群与负载均衡集群

2.1 普通集群(Regular Cluster)

普通的群集的部署是通过一台度器控制调配多台节点服务器进行业务请求的处理,但是仅仅是一台调度器,就会存在极大的单点故障风险,当该调度器的链路或则调度器本身出现故障时,就会导致整个业务的无法正常进行

2.2 负载均衡集群(Load Balancing Cluster)

负载均衡集群是一种普通集群的特殊形式,其中引入了负载均衡器(Load Balancer)来均衡各个节点之间的工作负载。负载均衡器可以根据不同的算法(如轮询、最小连接数等)将传入的请求分发到集群中的不同节点,以确保各个节点的负载大致均衡。负载均衡集群可以提高系统的性能和可靠性,同时还能更好地应对突发的高负载情况

2.3 高可用集群(High Availability Cluster)

高可用集群是由一台主调度器和一台或多台备用调度器。在主调度器能够正常运转时,由主调度器进行节点服务器业务的分配处理,其余备用调度器处于待机状态,不参与当前的集群运转。当主调度器出现故障无法运转时,此时备用调度器会由优先级最高的调度承担主调度器的工作,而出现故障的主调调度器便会退出当前工作,由人工维修后返回集群

2.4 区别

普通集群是基本形式,负载均衡集群在此基础上引入负载均衡器以提高性能,高可用集群则在此基础上更加注重系统的可用性和容错能力。根据具体的需求和场景,可以选择合适的集群形式来搭建系统以满足要求

二、Keepalive基础概述

1、vrrp(虚拟路由冗余协议)技术

1.1 vrrp协议概念

vrrp技术旨在提供网络设备的冗余和高可用性。它允许多台路由器或交换机共享一个虚拟 IP 地址,从而实现对外部网络的透明故障切换

VRRP 协议工作在 OSI 模型的网络层(第三层),其基本原理是将一组路由器配置为 VRRP 组,并选择其中一台路由器作为虚拟路由器的主节点,其他路由器则成为备用节点。主节点负责处理传入流量,而备用节点则处于待命状态

1.2 vrrp技术工作原理

VRRP(Virtual Router Redundancy Protocol)的工作模式基于主备模式。在这种模式下,多个路由器或交换机被组织成一个 VRRP 组,其中包括一个主节点和一个或多个备用节点。这些节点一起协作以提供冗余和高可用性

当主节点不可用时,备用节点中优先级最高的节点将接管虚拟 IP 地址,成为新的主节点,从而实现快速故障切换。这种模式确保了即使某个节点发生故障,整个系统仍能够继续提供服务,从而实现了网络设备的冗余和高可用性

  • VRRP 组:多个路由器被配置为一个 VRRP 组。每个组都有一个虚拟 IP 地址和一个虚拟 MAC 地址,用于代表整个组

  • 主节点:VRRP 组中具有最高优先级的节点会成为主节点,负责处理传入流量,并使用虚拟 IP 地址提供服务

  • 备用节点:其他节点则成为备用节点,处于待命状态。它们监视主节点的可达性,并准备接管虚拟 IP 地址,以确保服务的连续性

  • Hello 消息:VRRP 节点定期发送 Hello 消息以通知其它节点自己的存在。这些消息还可以用于检测对等节点的可达性

  • 虚拟路由器(Virtual Router):是一个逻辑实体,它由一组物理路由器(Physical Routers)共同提供服务。虚拟路由器的主要目的是提供冗余和高可用性,以防止单点故障

  • 虚拟路由器标识(Virtual Router Identifier,VRID):是VRRP协议中的一个重要参数,用于标识一个VRRP组。在一个VRRP组中,所有的路由器都需要配置相同的VRID,以便它们可以识别彼此,并协同工作。当一个路由器成为VRRP组的Master时,它会发送带有自己的VRID的VRRP包,以通知其他路由器它的存在

  • 虚拟 IP 地址 (VIP):这是由 VRRP 组共享的虚拟 IP 地址。它允许多个路由器共享一个 IP 地址,以提供冗余和高可用性。VIP 通常与 VRRP 组中的主节点相关联,并且在发生故障转移时会迁移到备用节点。

  • 虚拟 MAC 地址 (VMAC):VMAC 是与虚拟 IP 地址相关联的虚拟 MAC 地址。当 VIP 迁移到 VRRP 组中的另一台路由器时,VMAC 也会相应地切换到新的路由器,以确保网络设备可以正确地识别并路由流量到新的主节点(00-00-5e-00-01-VRID)

  • 故障切换:如果一个节点停止发送 Hello 消息,其他节点会认为该节点已经失效,触发故障转移。此时,备用节点中优先级最高的节点将接管虚拟 IP 地址,并成为新的主节点

  • 快速故障切换:VRRP 允许在几秒内完成主备节点之间的切换,从而减少服务中断时间

1.3 vrrp状态机

优先级:

  • 默认0 - 255
  • 0代表主路由器主动退出
  • 255代表有设备和虚拟ip冲突
  • 可手动配置1-254
  • 优先级相同再比较接口IP地址大小,IP地址大的优先
  • 优先级默认为100,缺省值是100

1.4 vrrp协议的抢占功能

  • 优先级:每个VRRP路由器都有一个优先级,优先级高的路由器会成为Master。当一个路由器的优先级超过当前Master的路由器,它会接管Master的角色
  • 预先抢占:在预先抢占模式下,当一个优先级更高的路由器重新上线或者其优先级超过当前Master的路由器,它会立即接管Master的角色,而不管当前Master的路由器是否正常工作
  • 非预先抢占:在非预先抢占模式下,当一个优先级更高的路由器重新上线或者其优先级超过当前Master的路由器,它不会立即接管Master的角色,而是等待当前Master的路由器失效后,才会接管Master的角色
  • 抢占延迟:抢占延迟是指在预先抢占模式下,当一个路由器的优先级超过当前Master的路由器,它需要等待一段时间(抢占延迟时间)后才能接管Master的角色。这是为了防止网络中频繁的Master切换
  • 抢占权重:抢占权重是指在预先抢占模式下,当一个路由器的优先级超过当前Master的路由器,它需要满足一定的抢占权重条件后才能接管Master的角色。这是为了防止网络中频繁的Master切换

2、keepalived 概述

2.1 keepalived 作用

keepalived 是一个用于实现高可用性的开源软件,它主要用于在Linux系统上实现负载均衡和故障转移

  • 基于vrrp协议keepalived 可以创建一个虚拟的IP地址,这个IP地址可以被多个服务器共享。当一个服务器出现故障时,keepalived 会自动将这个IP地址转移到其他正常的服务器,以保证服务的可用性

  • 配置简单:能为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)

  • 健康检查keepalived 可以定期检查后端真实服务器(RS)的健康状态,如果一个服务器出现故障,keepalived 会自动将这个服务器从负载均衡中移除,以避免将请求发送到故障的服务器。

  • 支持多种负载均衡算法keepalived 支持多种负载均衡算法,包括轮询、加权轮询、最小连接数等

  • 支持多种通信协议keepalived 支持多种通信协议,包括TCP、HTTP、SMTP

  • **基于脚本调用接口:**完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务

bash 复制代码
keepalived工具官网:http://keepalived.org/

2.2 Keepalived 架构

bash 复制代码
#官网文档
https://keepalived.org/doc/
http://keepalived.org/documentation.html
  • 用户空间核心组件:
  1. vrrp stack:VIP消息通告 虚拟ip

  2. checkers:监测real server(简单来说 就是监控后端真实服务器的服务)是否存活

  3. system call:实现 vrrp 协议状态转换时调用脚本的功能

  4. SMTP:邮件组件(报警邮件)

  5. IPVS wrapper:生成IPVS规则(直接生成ipvsadm)

  6. Netlink Reflector:网络接口(将虚拟地址ip(vip)地址飘动)

WatchDog:监控进程(整个架构是否有问题)

  • 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置

  • IO复用器:针对网络目的而优化的自己的线程抽象

  • 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限

2.3 安装keepalived

bash 复制代码
#yum安装keepalived软件
yum install -y keepalived.x86_64

2.4 keepalived的相关文件及组成

2.4.1 keepalived的相关文件
  • 软件包名:keepalived

  • 主程序文件:/usr/sbin/keepalived

  • 主配置文件:/etc/keepalived/keepalived.conf

  • 配置文件示例:/usr/share/doc/keepalived/

  • Unit File:/lib/systemd/system/keepalived.service

  • Unit File的环境配置文件:/etc/sysconfig/keepalived CentOS

2.4.2 主配置文件的组成

/etc/keepalived/keepalived.conf 配置组成

  • GLOBAL CONFIGURATION

Global definitions(全局配置):定义邮件配置,route_id,vrrp配置。组播地址等

  • VRRP CONFIGURATION

VRRP instance(s):定义vrrp协议中的每个vrrp虚拟路由器的规则,基本信息

  • LVS CONFIGURATION(lvs调度服务器的规则设置)

Virtual server group(s)

Virtual server(s):LVS集群的VS和RS

2.4.3 主配置文件的全局配置详解
bash 复制代码
[root@localhost ~]#vim /etc/keepalived/keepalived.conf
global_defs {
 notification_email {
 root@localhost
 #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
 root@localhost
  num@qq.com
 }
 notification_email_from keepalived@localhost  
 #发邮件的地址
 smtp_server 127.0.0.1     
 #邮件服务器地址
 smtp_connect_timeout 30   
 #邮件服务器连接timeout
 router_id R1
 #每个keepalived主机唯一标识,建议使用当前主机名,但多节点重名不影响
 vrrp_skip_check_adv_addr  
 #对所有通告报文都检查,会比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查
 vrrp_strict 
 #严格遵守VRRP协议,启用此项后以下状况将无法启动服务:1.无VIP地址 2.配置了单播邻居 3.在VRRP版本2中有IPv6地址,开启动此项并且没有配置vrrp_iptables时会自动开启iptables防火墙规则,默认导致VIP无法访问,建议不加此项配置。
 vrrp_garp_interval 0 
 #gratuitous ARP messages 免费ARP报文发送延迟,0表示不延迟
 vrrp_gna_interval 0 
 #unsolicited NA messages (不请自来)消息发送延迟
 vrrp_mcast_group4 224.0.0.18 
 #指定组播IP地址范围:224.0.0.0到239.255.255.255,默认值:224.0.0.18 
 vrrp_iptables        
 #此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置vrrp_strict项,则无需启用此项配置
}
2.4.4 主配置文件的vrrp_instance模块详解
bash 复制代码
[root@localhost ~]#vim /etc/keepalived/keepalived.conf
vrrp_instance <STRING> {
#<String>为vrrp的实例名,一般为业务名称
 配置参数
 ......
 }
#配置参数:
state MASTER|BACKUP
#当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP
interface IFACE_NAME 
#绑定为当前虚拟路由器使用的物理接口,如:eth0,bond0,br0,可以和VIP不在一个网卡
virtual_router_id VRID 
#每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一,否则服务无法启动,同属一个虚拟路由器的多个keepalived节点必须相同,务必要确认在同一网络中此值必须唯一
priority 100 
#当前物理节点在此虚拟路由器的优先级,范围:1-254,值越大优先级越高,每个keepalived主机节点此值不同

advert_int 1
#vrrp通告的时间间隔,默认1s

authentication { 
#认证机制
 auth_type AH|PASS   
 #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
 auth_pass <PASSWORD> 
 #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepalived节点必须一样
}
include    /etc/keealived/conf.d/*.conf
virtual_ipaddress { 
#虚拟IP,生产环境可能指定上百个IP地址
 <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
 172.16.12.10
 #指定VIP,不指定网卡,默认为,注意:不指定/prefix,默认为/32
 172.16.12.11/24 dev eth1   
 #指定VIP的网卡,建议和interface指令指定的岗卡不在一个网卡
 172.16.12.12/24 dev eth2 label eth2:1 
 #指定VIP的网卡label 
}
track_interface { 
#配置监控网络接口,一旦出现故障,则转为FAULT状态实现地址转移
 eth0
 eth1
 ...
}
2.4.5 主配置文件的virtual_server模块详解
bash 复制代码
[root@localhost ~]#vim /etc/keepalived/keepalived.conf
virtual_server 172.16.12.200 80 {
    delay_loop 6
    #健康间隔时间6秒
    lb_algo rr
    #调度算法轮询
    lb_kind DR
    #lvs模式为DR 
    persistence_timeout 0
    #连接保持时间改为0 否则 无法体现效果
    protocol TCP
    #采用协议
    
 real_server 172.16.12.12 80 {
        weight 1
        #45行删除
        #节点权重
        TCP_CHECK{
            connect_port 80
            #检查目标端口
            connect_timeout 3
            #连接超时 
            nb_get_retry 3
            #重试次数
            delay_before_retry 3
            #重试间隔时间
        }
    }
 real_server 172.16.12.13 80 {
        weight 1
        TCP_CHECK{
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

三、部署LVS+keepalived集群

前提:关闭所有设备的防火墙和核心防护

bash 复制代码
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0

1、部署master负载调度服务器

1.1 修改主配置文件

bash 复制代码
[root@localhost ~]#yum install -y keepalived.x86_64
#yum安装keepalived软件
[root@localhost ~]#systemctl start keepalived.service 
[root@localhost ~]#cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
#下面将修改主配置文件,为避免修改错误导致无法挽回的后果,建议备份原始主配置文件
bash 复制代码
[root@localhost ~]#vim /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_01
   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 {
        172.16.12.200
    }
}

virtual_server 172.16.12.200 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 172.16.12.12 80 {
        weight 1
          TCP_CHECK {
          connect_port 80
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
        }
    }

    real_server 172.16.12.13 80 {
        weight 1
          TCP_CHECK {
          connect_port 80
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
        }
    }
}
#下面其他多余的配置可删除

**注:**抓包能够得到同一热备组间master服务器与backup服务器之间通告的认证密码是明文传输的

bash 复制代码
[root@localhost ~]#systemctl restart keepalived.service 
[root@localhost ~]#ip a
bash 复制代码
[root@localhost ~]#yum install -y ipvsadm.x86_64
[root@localhost ~]#ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost ~]#systemctl start ipvsadm.service
[root@localhost ~]#systemctl restart keepalived.service 
[root@localhost ~]#ipvsadm -ln

1.2 调整/proc响应参数

bash 复制代码
[root@localhost ~]#vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@localhost ~]#sysctl -p

2、部署backup负载调度服务器

2.1 修改主配置文件

bash 复制代码
[root@localhost ~]#yum install -y keepalived.x86_64
#yum安装keepalived软件
[root@localhost ~]#systemctl start keepalived.service 
[root@localhost ~]#cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
#下面将修改主配置文件,为避免修改错误导致无法挽回的后果,建议备份原始主配置文件
bash 复制代码
#在master调度服务器上远程拷贝文件到backup调度服务器上
[root@localhost ~]#scp /etc/keepalived/keepalived.conf 172.16.12.11:/opt
bash 复制代码
[root@localhost ~]#cd /opt
[root@localhost opt]#mv keepalived.conf /etc/keepalived/

修改主配置文件:

bash 复制代码
[root@localhost ~]#systemctl restart keepalived.service 
[root@localhost ~]#ip a
bash 复制代码
[root@localhost ~]#yum install -y ipvsadm.x86_64
[root@localhost ~]#ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost ~]#systemctl start ipvsadm.service
[root@localhost ~]#systemctl restart keepalived.service 
[root@localhost ~]#ipvsadm -ln

2.2 调整/proc响应参数

bash 复制代码
[root@localhost ~]#vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@localhost ~]#sysctl -p

3、部署节点服务器1

3.1 设置虚拟网卡(VIP)

3.1.1 临时设置虚拟回环网卡
bash 复制代码
[root@localhost ~]#ifconfig lo:0 172.16.12.200/32
[root@localhost ~]#ip a
3.1.2 永久设置虚拟回环网卡
bash 复制代码
[root@localhost ~]#cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]#cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]#vim ifcfg-lo:0
#修改回环网卡名,IP地址,子网掩码
DEVICE=lo:0
IPADDR=172.16.12.200
NETMASK=255.255.255.255
NETWORK=127.0.0.0
[root@localhost network-scripts]#systemctl restart network
[root@localhost network-scripts]#ip a

3.2 忽略ARP请求

bash 复制代码
#添加系统只响应目的IP为本地IP的ARP请求
#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
[root@localhost ~]#vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@localhost ~]#sysctl -p

3.2 安装并启动nginx软件

bash 复制代码
[root@localhost ~]#yum install epel-release.noarch -y
[root@localhost ~]#yum install -y nginx
[root@localhost ~]#systemctl start nginx

3.4 新建网页站点文件

bash 复制代码
[root@localhost ~]#echo "welcome to web 1" > /usr/share/nginx/html/index.html
[root@localhost ~]#cat /usr/share/nginx/html/index.html

3.5 关闭长连接

4、部署节点服务器2

4.1 设置虚拟网卡(VIP)

4.1.1 临时设置虚拟回环网卡
bash 复制代码
[root@localhost ~]#ifconfig lo:0 172.16.12.200/32
[root@localhost ~]#ip a
4.1.2 永久设置虚拟回环网卡
bash 复制代码
[root@localhost ~]#cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]#cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]#vim ifcfg-lo:0
#修改回环网卡名,IP地址,子网掩码
DEVICE=lo:0
IPADDR=172.16.12.200
NETMASK=255.255.255.255
NETWORK=127.0.0.0
[root@localhost network-scripts]#systemctl restart network
[root@localhost network-scripts]#ip a

4.2 忽略ARP请求

bash 复制代码
#添加系统只响应目的IP为本地IP的ARP请求
#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
[root@localhost ~]#vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@localhost ~]#sysctl -p

4.3 安装并启动nginx软件

bash 复制代码
[root@localhost ~]#yum install epel-release.noarch -y
[root@localhost ~]#yum install -y nginx
[root@localhost ~]#systemctl start nginx

4.4 新建网页站点文件

bash 复制代码
[root@localhost ~]#echo "welcome to web 2" > /usr/share/nginx/html/index.html
[root@localhost ~]#cat /usr/share/nginx/html/index.html

4.5 关闭长连接

5、客户端测试

(1)客户端访问虚拟地址,可以看到负载均衡(1:1)

(2)关闭master负载调度服务器的keepalived服务,测试客户端能否访问到网页

(3)重新开启原来master服务器的keepalived服务,测试是否抢占虚拟地址

四、其他有用配置

1、主从抢占模式配置

1.1 抢占模式(默认模式)

当一个优先级更高的路由器重新上线或者其优先级超过当前Master的路由器,它会立即接管Master的角色,而不管当前Master的路由器是否正常工作

详细可参考上述的测试情况

1.2 非抢占模式

关闭默认的抢占模式,一定要将原master调度服务器主配置文件里的state修改成BACKUP,否则可能会不成功,再添加 nopreempt 即可,那么当原master重新上线,也不会抢占当前正在工作的服务器,它现在反而会变成了backup服务器

测试:

1.3 延迟抢占模式

bash 复制代码
preempt_delay  60       #指定抢占延迟时间为60s,默认延迟300s

测试:

2、组播/单播地址

2.1 组播地址

bash 复制代码
#两个调度服务器都需要配置
vrrp_mcast_group4 234.6.6.6
#组播地址范围:224~239

测试:

bash 复制代码
[root@localhost ~]#tcpdump -i ens33 -nn src host 172.16.12.10

2.2 单播地址

默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,即只有同一热备组master和backup调度服务器之间通告信息,减少网络流量

注意:启用 vrrp_strict 时,不能启用单播,在所有节点vrrp_instance语句块中设置对方主机的IP,建议设置为专用于对应心跳线网络的地址,而非使用业务网络

bash 复制代码
unicast_src_ip 172.16.12.11
        unicast_peer {
        172.16.12.10 
        }

测试:

bash 复制代码
[root@localhost ~]#tcpdump -i ens33 -nn src host 172.16.12.10

3、通知脚本

通知脚本(notification script)是用来在状态转换发生时通知管理员或执行特定操作的脚本。当Keepalived监测到故障或状态变化时,例如主服务器故障或切换到备用服务器,它会触发通知脚本。记录状态变化和事件日志,并发送电子邮件或短信通知给管理员或运维团队等操作

(1)当前节点成为主节点时触发的脚本

bash 复制代码
notify_master <STRING>|<QUOTED-STRING>

(2)当前节点转为备节点时触发的脚本

bash 复制代码
notify_backup <STRING>|<QUOTED-STRING>

(3)当前节点转为"失败"状态时触发的脚本

bash 复制代码
notify_fault <STRING>|<QUOTED-STRING>

(4)通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知

bash 复制代码
notify <STRING>|<QUOTED-STRING>

(5)当停止VRRP时触发的脚本

bash 复制代码
notify_stop <STRING>|<QUOTED-STRING>

3.1 配置邮箱

bash 复制代码
#非必要
[root@localhost ~]# vim /etc/mail.rc
set from=num@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=num5@qq.com
set smtp-auth-password=*******   #POP3/IMAP/SMTP/Exchange/CardDAV 授权码

3.2 编写脚本

bash 复制代码
[root@localhost ~]#cd /opt
[root@localhost opt]#vim keepalive.sh
#!/bin/bash
contact='num@qq.com'   #qq邮箱
notify() {
 mailsubject="$(hostname) to be $1, vip floating"
 mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
 echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
 notify master
 ;;
backup)
 notify backup
 ;;
fault)
 notify fault
 ;;
*)
 echo "Usage: $(basename $0) {master|backup|fault}"
 exit 1
 ;;
esac
[root@localhost opt]#chmod +x keepalived.sh 

3.3 修改keepalived主配置文件

bash 复制代码
[root@localhost opt]#vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
  ......
   notify_master "/opt/keepalive.sh master"
   notify_backup "/opt/keepalive.sh backup"
   notify_fault "/opt/keepalive.sh fault"
}
[root@localhost opt]#systemctl restart keepalived.service 

3.4 测试

模拟master调度服务器宕机

bash 复制代码
[root@localhost opt]#systemctl restart keepalived.service 
[root@localhost opt]#killall keepalived

4、日志功能

开启keepalived单独日志功能

4.1 修改keepalived日志配置文件

bash 复制代码
[root@localhost opt]# vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
[root@localhost opt]#systemctl restart keepalived.service

4.2 修改rsyslog主配置文件

bash 复制代码
[root@localhost opt]#vim /etc/rsyslog.conf
local6.*                                                /var/log/keepalive.log
[root@localhost opt]#systemctl restart rsyslog.service

测试:

bash 复制代码
[root@localhost opt]#systemctl restart keepalived.service 
[root@localhost opt]#find /var/log/ -name "keepalive*"    #查看是否生成独立的keepalived日志文件
/var/log/keepalive.log
[root@localhost opt]#cat /var/log/keepalive.log     #查看日志

五、实现其它应用的高可用性 VRRP Script

1、VRRP Script实现步骤

keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能

VRRP Script 技术,分以下两步实现

(1)定义脚本

vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点

bash 复制代码
vrrp_script <SCRIPT_NAME> {
 script <STRING>|<QUOTED-STRING>   #此脚本返回值为非0时,会触发下面OPTIONS执行
 OPTIONS 
}
bash 复制代码
vrrp_script <SCRIPT_NAME> { 				#定义一个检测脚本,在global_defs 之外配置
     script <STRING>|<QUOTED-STRING> 		#shell命令或脚本路径(注意执行权限)
     interval <INTEGER> 					#间隔时间,单位为秒,默认1秒
     timeout <INTEGER> 						#超时时间
     weight  <INTEGER:-254..254> 			#默认为0,如果设置此值为负数,当上面脚本返回值为非0时,会将此值与本节点权重相加可以降低本节点权重,即表示fall. 如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重,即表示 rise.通常使用负值
     fall <INTEGER>       					#执行脚本连续几次都失败,则转换为失败,建议设为2以上
     rise <INTEGER>       					#执行脚本连续几次都成功,把服务器从失败标记为成功
     user USERNAME [GROUPNAME] 				#执行监测脚本的用户或组      
     init_fail         						#设置默认标记为失败状态,监测成功之后再转换为成功状态
}

(2) 调用脚本

track_script:调用vrrp_script定义的脚本去监控资源,定义在VRRP实例之内,调用事先定义的vrrp_script

bash 复制代码
track_script {
 SCRIPT_NAME_1
 SCRIPT_NAME_2
}

2、部署nginx+keepalived集群

前提:两个调度服务器都需要安装并开启nginx软件,关闭ipvsadm软件

bash 复制代码
[root@localhost ~]#yum install epel-release.noarch -y
[root@localhost ~]#yum install -y nginx
[root@localhost ~]#systemctl start nginx
bash 复制代码
[root@localhost log]#systemctl stop ipvsadm

两个调度服务器都要备份nginx主配置文件

bash 复制代码
[root@localhost ~]#cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
#下面将修改nginx主配置文件,为避免修改错误导致无法挽回的后果,建议备份原始主配置文件

2.1 部署master调度服务器

2.1.1 修改nginx主配置文件
bash 复制代码
[root@localhost ~]#vim /etc/nginx/nginx.conf
#在http模块下配置
 upstream web {
        server 172.16.12.12;
        server 172.16.12.13;
        }

#在server模块下配置
   location / {
         proxy_pass http://web;
         }
[root@localhost ~]#systemctl restart nginx
2.1.2 修改keepalived主配置文件

先编写脚本:

bash 复制代码
[root@localhost ~]#vim /etc/keepalived/ng.sh
#!/bin/bash
killall -0 nginx
[root@localhost ~]#chmod +x /etc/keepalived/ng.sh

修改keepalived主配置文件:

bash 复制代码
[root@localhost ~]#vim /etc/keepalived/keepalived.conf
vrrp_script check_down {
        script  "/etc/keepalived/ng.sh"
        interval 1
        weight -30
        fall  3
        rise 2
        timeout 2
}


track_script {
        check_down
        }
[root@localhost ~]#systemctl restart keepalived.service

2.2 部署backup调度服务器

其实,backup调度服务器的nginx配置文件和keepalived配置文件其实一样的,只需要master调度服务器将配置文件远程拷贝并替换到backup调度服务器的配置文件即可

bash 复制代码
[root@localhost ~]#scp /etc/nginx/nginx.conf 172.16.12.11:/etc/nginx/
[root@localhost ~]#scp /etc/keepalived/keepalived.conf 172.16.12.11:/etc/keepalived/keepalived.conf
[root@localhost ~]#scp /etc/keepalived/ng.sh 172.16.12.11:/etc/keepalived/ng.sh
bash 复制代码
[root@localhost log]#systemctl restart nginx
[root@localhost log]#systemctl restart keepalived.service 

至于节点服务器1和节点服务器2的配置和之前的一样就行

**测试:**此时master调度服务器正在工作,客户端能访问到

关闭master负载调度服务器的nginx服务,测试客户端能否访问到网页

此时当master调度服务器的nginx服务故障后,backup调度服务器会顶上进行工作

六、高可用集群的脑裂问题

1、什么是脑裂

  • 在高可用(HA)系统中,当联系2个节点的"心跳线"断开时,本来为一整体、动作协调的HA系统就分裂成为2个独立的个体
  • 由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像"裂脑人"一样,争抢"共享资源"、争起"应用服务",就会发生严重后果。共享资源被瓜分、两边"服务"都起不来了;或者两边"服务"都起来了,但同时读写"共享存储",导致数据损坏

2、导致脑裂的原因

硬件原因:

  • 高可用服务器各节点之间心跳线链路发生故障,导致无法正常通信
  • 因心跳线坏了(包括断了,老化)
  • 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)
  • 因心跳线间连接的设备故障(网卡及交换机)
  • 因仲裁的机器出问题(采用仲裁的方案)。

运用配置原因:

  • 高可用服务器上开启了 iptables 防火墙阻挡了心跳消息传输
  • 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
  • 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等
  • Keepalived 配置里同一VRRP实例如果 virtual_router_id 两端参数配置不一致也会导致裂脑问题发生

3、预防和解决脑裂问题

  • 同时使用串行电缆和以太网电缆连接、同时使用两条心跳线路,这样一条线路断了,另外一条还是好的,依然能传送心跳消息
  • 当检查脑裂时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith、fence)相当于备节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源
  • 建立完善的监控系统,实时监测集群的状态和健康状况,及时发现潜在的问题并采取相应的措施

4、使用iptables规则模拟脑裂

bash 复制代码
#在backup调度服务器上配置iptables规则,拒绝接受来自master调度服务器的数据包
[root@localhost ~]#iptables -A INPUT -s 172.16.12.10 -j REJECT 

这样就有整个集群就会有两个调度服务器在工作,争抢"共享资源"、争起"应用服务",导致发生严重后果

相关推荐
韩楚风2 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学2 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO2 小时前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu73 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我3 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
追风赶月、3 小时前
【Linux】进程地址空间(初步了解)
linux
栎栎学编程3 小时前
Linux中环境变量
linux
我是哈哈hh3 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
郭二哈3 小时前
C++——模板进阶、继承
java·服务器·c++
挥剑决浮云 -3 小时前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记