• Keepalived介绍及LVS+Keepalived+NFS集群部署


    文章目录


    一、Keepalived概述

    Keepalived是一款专为LVS和HA设计的一款健康检查工具;支持故障自动切换、支持节点健康状态检查

    • Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群中各个服务节点的状态,后来又加入了可实现高可用VRRP功能。因此,Keepalived除了能够管理LVS集群外,还可以为其他服务(例如:Nginx、Haproxy、MySQL等)实现高可用
    • Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRP出现的目的就是为了解决静态路由单点故障的问题,它能够保证当个别节点宕机时,整个网络可以不间断的运行
      Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用

    二、Keepalived工作原理

    • Keepalived时一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题
    • 在一个LVS服务集群中通常由主服务器(master)和备用服务器(backup)两种角色的服务器,但是对外表现为虚拟IP,主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性
    • 在Keepalived服务之间,只有作为主服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒

    三、Keepalived体系主要模块及其作用

    Keepalived体系架构中主要有三个模块,分别是core、check和vrrp
    **core模块:**为Keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析
    **vrrp模块:**来实现VRRP协议的
    **check模块:**负责健康检查,常见的方式有端口及URL检查


    四、Keepalived服务的主要功能

    1.管理LVS负载均衡软件

    Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置及控制服务的启动,停止功能

    2.支持故障自动切换(Failover)

    Keepalived可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡,Nginx反向代理这样的服务器

    Keepalived高可用功能实现的简单原理为:
    两台主机同时安装好Keepalived软件并启动服务,开始正常工作时,由角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作为Master主机的热备;当角色为Master的主机失效或出现故障时,角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为Master的主机故障修复后,又会自动接管回它原来处理的工作,角色为Backup的主机则同时释放Master主机失效时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态

    3.实现LVS集群中节点的健康检查(Health Checking)

    Keepalived可以通过在自身的Keepalived.conf文件里配置LVS的节点IP和相关参数实现对LVS的直接管理;除此之外,当LVS集群中的某一个甚至是几个节点服务器同时发生故障无法提供服务时,Keepalived服务会自动将失效的节点服务器从LVS的正常转发队列中清除出去,并将请求调度到别的正常节点服务器上,从而保证用户的访问不受影响;当故障的阶段服务器被修复以后,Keepalived服务又会自动地把它们加入到正常转发队列中,对客户提供服务。

    4.实现LVS负载调度器、节点服务器地高可用性(HA)

    一般企业集群需要满足的三个特点:负载均衡、健康检查、故障切换、使用LVS+Keepalived完全可以满足需求


    五、Keepalived高可用故障切换转移原理

    Keepalived高可用服务对集群之间的故障切换转移,是通过VRRP来实现的
    在Keepalived服务正常工作时,主(Master)节点会不断地向备(Backup)节点发送(多播的方式)心跳信息,用以告诉备节点自己还或者,当主节点发生故障时,就无法发送心跳信息,备节点也就因此无法继续检测到来自主节点的心跳了,于是调用自身的接管程序,接管主节点的IP资源及服务。当主节点回复是,备节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色


    六、VRRP通信原理

    • VRRP也就是虚拟路由冗余协议,它的出现就是为了解决静态路由的单点故障
    • VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的
    • VRRP用IP多播的方式(默认多播地址224.0.0.18)实现高可用之间通信
    • 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对
    • VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码

    七、Keepalived脑裂及解决办法

    1.Keepalived脑裂

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

    2.脑裂的原因

    1、高可用服务器对之间心跳线链路发生故障,导致无法正常通信。如心跳线坏了(包括断了,老化)
    2、因网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)
    3、因心跳线间连接的设备故障(网卡及交换机)
    4、因仲裁的机器出问题(采用仲裁的方案)
    5、高可用服务器上开启了iptables防火墙阻挡了心跳信息传输
    6、Keepalived配置里同一VRRP实例如果Virtual_router_id两端参数配置不一致也会导致脑裂问题发生
    7、vrrp实例名字不一致,优先级一致

    3.应对策略

    1、添加冗余的心跳线,例如:双线条线(心跳线也HA),尽量减少"脑裂"发生几率
    2、启动磁盘锁。正在服务一方锁住共享磁盘,“脑裂"发生时,让对方完全"抢不走"共享磁盘资源。但使用磁盘锁也会有一个不小的问题,如果占用共享盘的一方不主动"解锁”,另一方就永远得不到共享磁盘。现实中加入服务器节点突然死机或崩溃,就不可能执行解锁命令。后背节点也就接管不了共享资源和应用服务。于是有人在HA中设计了"智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
    3、设置仲裁机制。例如设置参考IP(如网关IP),当心跳线完全断开时,两个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅"心跳"、还兼对外"服务"的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源
    4、利用脚本检测、报警


    八、部署LVS+Keepalived+NFS

    1.实验准备

    LVS-DR服务器:主-192.168.100.11
    LVS-DR服务器:备-192.168.100.10
    web01:192.168.100.12
    web02:192.168.100.13
    vip(虚拟回环):192.168.100.100
    NFS服务器:192.168.100.14
    客户端:192.168.100.110

    2.环境准备

    部署前关闭所有机器防火墙及核心防护

    systemctl stop firewalld
    systemctl disable firewalld
    setenforce 0
    
    • 1
    • 2
    • 3

    在内网的服务器无法直接通过yum下载,需要配置本地yum仓库,在机器中执行以下脚本

    #!/bin/bash
    mount /dev/cdrom /mnt
    mkdir /etc/yum.repos.d/bak
    mv /etc/yum.repos.d/*.repo  /etc/yum.repos.d/bak
    touch /etc/yum.repos.d/local.repo
    echo "
    [local]
    name=local
    baseurl=file:///mnt
    enabled=1
    gpgcheck=0
    " > /etc/yum.repos.d/local.repo
    yum cleam all
    yum makecache
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3.配置负载调度器(主:192.168.100.11 备:192.168.100.10)

    3.1安装ipvsadm工具

    yum -y install ipvsadm
    
    • 1

    在这里插入图片描述

    3.2配置虚拟IP地址(VIP:192.168.100.100)

    cd /etc/sysconfig/network-scripts/
    cp ifcfg-ens33 ifcfg-ens33:0
    vim ifcfg-ens33:0
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    ifup ens33:0     #启动虚拟IP
    ifconfig
    
    • 1
    • 2

    启动成功
    在这里插入图片描述

    3.3调整内核(proc)响应参数

    由于LVS负载均衡器和各个节点需要共用vip地址,应该关闭Linux内核的重定向响应参数,不充当路由器,这样当DS收到客户端发来的数据包时,就不会立马转发给后台RS服务器,而是转发给自己的虚拟子接口。

    vim /etc/sysctl.conf     #编辑内核proc参数
    修改以下内容
    net.ipv4.ip_forward = 0  #关闭路由转发功能
    net.ipv4.conf.all.send_redirects = 0        #关闭所有send重定向
    net.ipv4.conf.default.send_redirects = 0    #关闭默认重定向
    net.ipv4.conf.ens33.send_redirects = 0     #关闭网卡重定向
    sysctl -p   #查看内核参数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    在这里插入图片描述

    3.4配置负载分配策略

    ipvsadm -C     #清空规则
    ipvsadm -A -t 192.168.100.100:80 -s rr    #创建虚拟主机,指定ip地址,并指定分流模式为轮询
    ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.12:80 -g 
    #添加真实服务器ip地址,并指定负载均衡模式为DR
    ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.13:80 -g
    #添加真实服务器ip地址,并指定负载均衡模式为DR
    ipvsadm   #启动策略
    ipvsadm-save > /etc/sysconfig/ipvsadm    #保存策略
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    LVS2(备:192.168.100.10)与LVS相同配置,重复执行以上操作

    4.部署共享存储NFS(192.168.100.14)

    4.1安装nfs和rpcbind

    yum -y install nfs-utils rpcbind
    systemctl start nfs
    systemctl start rpcbind
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    4.2创建共享目录,并设置权限

    mkdir /opt/web01 /opt/web02
    chmod 777 /opt/web01 /opt/web02
    
    • 1
    • 2

    在这里插入图片描述

    4.3输入网页内容

    echo "this is web01" > /opt/web01/index.html
    echo "this is web02" > /opt/web02/index.html
    
    • 1
    • 2

    在这里插入图片描述

    4.4设置共享目录并发布共享

    vim /etc/exports
    添加以下内容
    /opt/web01 192.168.100.0/24(rw,sync)
    /opt/web02 192.168.100.0/24(rw,sync)
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    4.5发布共享

    exportfs -rv
    
    • 1

    在这里插入图片描述

    4.6查看共享

    showmount -e localhost
    
    • 1

    在这里插入图片描述

    5.配置节点服务器(web01 和 web02)

    以下步骤web01和web02都要配置

    5.1配置虚拟IP地址(vip:192.168.100.100)

    此地址仅作为发送web响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发),因此使用虚拟接口lo:0来承载VIP,并为本机添加一条路由记录,并将访问的VIP的数据限制在本地,以免通信紊乱

    cd /etc/sysconfig/network-scripts/
    cp ifcfg-lo ifcfg-lo:0
    vim ifcfg-lo:0
    编写以下内容
    DEVICE=lo:0
    ONBOOT=yes
    IPADDR=192.168.100.100
    NETMASK=255.255.255.255
    
    ifup lo:0    #启动环回网卡
    ifconfig lo:0    #查看环回网卡
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    5.2添加vip本地访问路由,设置系统自动识别,并设置执行权限

    route add -host 192.168.100.100 dev lo:0
    或者下面方式,都可实现路由禁锢,下面为永久添加
    vim /etc/rc.local      #Linux在开机启动时,会加载的内容
    /sbin/route add -host 192.168.100.100 dev lo:0
    chmod +x /etc/rc.d/rc/local
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    5.3调整内核的ARP响应参数以阻止更新vip的MAC地址,避免冲突

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    sysctl -p     #立即生效
    
    • 1

    在这里插入图片描述

    5.4安装nfs、rpcbind和httpd服务

    yum -y install nfs-utils rpcbind httpd
    
    • 1

    在这里插入图片描述
    以上步骤 web01 和 web02 一样

    5.5开启相关服务,并挂载共享目录

    web01

    systemctl start nfs
    systemctl start rpcbind
    systemctl start httpd
    mount.nfs 192.168.100.14:/opt/web01 /var/www/html
    df -hT
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    web02

    systemctl start nfs
    systemctl start rpcbind
    systemctl start httpd
    mount.nfs 192.168.100.14:/opt/web02 /var/www/html
    df -hT
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    6.部署Keepalived(主LVS 和备LVS2)

    6.1安装Keepalived(主:192.168.100.11)

    yum -y install keepalived
    
    • 1

    在这里插入图片描述

    6.2配置keepalived(主:192.168.100.11)

    cd /etc/keepalived/
    cp keepalived.conf keepalived.conf.bak
    vim keepalived.conf
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    修改配置文件

      1 ! Configuration File for keepalived
      2 
      3 global_defs {     #定义全局参数
      4    notification_email {
      5      acassen@firewall.loc
      6      failover@firewall.loc
      7      sysadmin@firewall.loc
      8    }
      9    notification_email_from Alexandre.Cassen@firewall.loc
     10    smtp_server 127.0.0.1     #邮件服务指向位置,修改为本地
     11    smtp_connect_timeout 30
     12    router_id LVS_01     #指定服务器名称,主备服务器不能相同
     13    vrrp_skip_check_adv_addr
     14    #vrrp_strict      #注释,取消严格遵守VRRP协议功能,否则VIP无法被连接
     15    vrrp_garp_interval 0
     16    vrrp_gna_interval 0
     17 }
     18 
     19 vrrp_instance VI_1 {      #定义VRRP热备份实力参数
     20     state MASTER          #指定热备状态,主为MASTER,备为BACKUP
     21     interface ens33       #指定承载的VIP地址的物理接口
     22     virtual_router_id 51  #指定虚拟路由器的ID号,每个热备组保持一致
     23     priority 100          #指定优先级,数值越大,优先级越高
     24     advert_int 1          #通告间隔秒数(心跳频率)
     25     authentication {      #定义认证信息,每个热备组保持一致
     26         auth_type PASS    #认证类型
     27         auth_pass 1111    #指定验证密码,主备服务器保持一致
     28     }
     29     virtual_ipaddress {   #指定集群VIP
     30     192.168.100.100
     31     }
     32 }
     33 
     34 virtual_server 192.168.100.100 80 {    #指定虚拟服务器地址(VIP)、端口、定义虚拟服务器和web服务器池参数
     35     delay_loop 6    #健康检查的间隔
     36     lb_algo rr      #指定调度算法:轮询(rr)
     37     lb_kind DR      #指定集群工作模式,直接路由(DR)
     38     persistence_timeout 50     #连续保持时间
     39     protocol TCP              #应用服务采用的TCP协议
    
     41     real_server 192.168.100.12 80 {  #指定第一个web节点的地址、端口
     42         weight 1         #节点权重
     43         TCP_CHECK {      #添加健康检查方式
     44             connect_port 80    #添加检查的端口
     45             connect_timeout 3   #添加连接超时时间
     46             nb_get_retry 3       #添加重试次数
     47             delay_before_retry 3  #添加重试间隔
     48         }
     49     }
     50     real_server 192.168.100.13 80 {  #指定第二个web节点的地址、端口
     51         weight 1      #节点权重
     52         TCP_CHECK {    #健康检查方式
     53             connect_port 80   #检查的端口
     54             connect_timeout 3   #连接超时时间
     55             nb_get_retry 3      #重试次数
     56             dalay_before_retry 3   #重试时间
     57         }
     58     }
     59 }
         ##删除后面多余的配置
    
    • 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
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    6.3启动keepalived,查看虚拟IP

    systemctl start keepalived
    ip addr
    
    • 1
    • 2

    在这里插入图片描述

    6.4安装keepalived(备:192.168.100.10)

    yum -y install keepalived
    
    • 1

    在这里插入图片描述

    6.5配置keepalived(备:192.168.100.10)

    cd /etc/keepalived/
    cp keepalived.conf keepalived.conf.bak
    vim keepalived.conf
    
    • 1
    • 2
    • 3
    1 ! Configuration File for keepalived
      2 
      3 global_defs {     #定义全局参数
      4    notification_email {
      5      acassen@firewall.loc
      6      failover@firewall.loc
      7      sysadmin@firewall.loc
      8    }
      9    notification_email_from Alexandre.Cassen@firewall.loc
     10    smtp_server 127.0.0.1     #邮件服务指向位置,修改为本地
     11    smtp_connect_timeout 30
     12    router_id LVS_02     #指定服务器名称,主备服务器不能相同
     13    vrrp_skip_check_adv_addr
     14    #vrrp_strict      #注释,取消严格遵守VRRP协议功能,否则VIP无法被连接
     15    vrrp_garp_interval 0
     16    vrrp_gna_interval 0
     17 }
     18 
     19 vrrp_instance VI_1 {      #定义VRRP热备份实力参数
     20     state BACKUP          #指定热备状态,主为MASTER,备为BACKUP
     21     interface ens33       #指定承载的VIP地址的物理接口
     22     virtual_router_id 51  #指定虚拟路由器的ID号,每个热备组保持一致
     23     priority 90          #指定优先级,数值越大,优先级越高
     24     advert_int 1          #通告间隔秒数(心跳频率)
     25     authentication {      #定义认证信息,每个热备组保持一致
     26         auth_type PASS    #认证类型
     27         auth_pass 1111    #指定验证密码,主备服务器保持一致
     28     }
     29     virtual_ipaddress {   #指定集群VIP
     30     192.168.100.100
     31     }
     32 }
     33 
     34 virtual_server 192.168.100.100 80 {    #指定虚拟服务器地址(VIP)、端口、定义虚拟服务器和web服务器池参数
     35     delay_loop 6    #健康检查的间隔
     36     lb_algo rr      #指定调度算法:轮询(rr)
     37     lb_kind DR      #指定集群工作模式,直接路由(DR)
     38     persistence_timeout 50     #连续保持时间
     39     protocol TCP              #应用服务采用的TCP协议
    
     41     real_server 192.168.100.12 80 {  #指定第一个web节点的地址、端口
     42         weight 1         #节点权重
     43         TCP_CHECK {      #添加健康检查方式
     44             connect_port 80    #添加检查的端口
     45             connect_timeout 3   #添加连接超时时间
     46             nb_get_retry 3       #添加重试次数
     47             delay_before_retry 3  #添加重试间隔
     48         }
     49     }
     50     real_server 192.168.100.13 80 {  #指定第二个web节点的地址、端口
     51         weight 1      #节点权重
     52         TCP_CHECK {    #健康检查方式
     53             connect_port 80   #检查的端口
     54             connect_timeout 3   #连接超时时间
     55             nb_get_retry 3      #重试次数
     56             dalay_before_retry 3   #重试时间
     57         }
     58     }
     59 }
    
    • 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
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    6.6启动keepalived,查看虚拟IP

    systemctl start keepalived
    ip addr
    #因为是备用服务器,所以不会显示虚拟IP
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    测试

    用一台win10机器,修改IP
    在这里插入图片描述
    访问192.168.100.100
    在这里插入图片描述
    我们模拟主LVS故障,查看虚拟IP是否会飘到备LVS上

    关闭keepalived后主LVS上虚拟IP没了
    在这里插入图片描述
    查看备LVS是否顶上
    在这里插入图片描述
    再次启动主LVS,看是否能抢占
    在这里插入图片描述
    看备LVS上虚拟IP是否消失
    在这里插入图片描述
    备LVS上虚拟IP消失


    总结

    集群满足的三个特点:负载均衡,健康检查,故障切换

    1、对于节点服务器:健康检查如果发现有故障的节点就会将其隔离或者提出集群。待其恢复后在重新加入集群当中。
    2、负载均衡器:健康检查会定时检查主机的状态(包括主机和服务状态)如果主故障就会自动切换到备主机上,待主的恢复重新在让主承载业务请求。

  • 相关阅读:
    vue3+vite中使用vuex
    数据预处理
    Mysql进阶索引篇03——2个新特性,11+7条设计原则教你创建索引
    Python的logging模块Demo
    SQLite SQL教程之如何实现contains函数,left join 判断一个字符串包含另外一个(教程含源码)
    ScrapeKit 和 Swift 编写程序
    docker:Untar exit status 1 archive/tar: invalid tar header 错误解决
    error C2039: ‘m_ctlMainTopReBar‘: is not a member
    leetCode 139.单词拆分 + 完全背包 + 排列数
    记录一次Bitbucket鉴权的坑
  • 原文地址:https://blog.csdn.net/S314118142/article/details/126796642