• LVS+Keepalived负载均衡


    一、Keepalived高可用详解

    1.应用场景
            在企业应用中,单台服务器承担应用存在单点故障的危险。单点故障一旦发生,企业服务将发生中断,造成极大的危害。所以需要群集实现高可用性,保证服务稳定。

    2.介绍和原理简介
            Keepalived是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。

            支持故障自动切换(Failover)和 节点健康状态检查(Health Checking)—— 判断LVS负载调度器、节点服务器的可用性,当master主机出现故障及时切换到backup节点保证业务正常,当master故障主机恢复后将其重新加入群集并且业务。

            在一个LVS服务集群中通常有主服务器(NASTER)和备份服务器(BEACKUP)两种角色的服务器,但是对外表现为一个虚拟re,主服务器会发送vRt通告信息给备份服务器,当备份服务器收不到vRt消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

    3.主要模块和作用
            core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析

            vrrp模块:是来实现VRRP协议的,用于主备调度器的检查和切换。

            check模块:负责健康检查节点服务器,常见的方式有端口检查及URL检查。

    二、LVS+keepalived配置实例(抢占模式)

    LVS-NAT 参考 LVS-NAT负载群集的优势和部署实例​​​​​​

    LVS-DR  参考 LVS-DR负载群集的优势和部署实例

    以下实验使用LVS-DR+keepalived的抢占模式实现高可用负载群集

    Web 服务器1:192.168.116.10(VIP 192.168.116.100)
    Web 服务器2:192.168.116.20(VIP 192.168.116.100)

    NFS 共享存储器:192.168.116.30

    LVS+keepalived 主负载调度器:192.168.116.40(VIP 192.168.116.100)

    LVS+keepalived 备负载调度器:192.168.116.30(VIP 192.168.116.100)

    网关/路由器:192.168.116.2
    客户端:192.168.116.50

    1.配置NFS共享存储器

    1. systemctl stop firewalld.service
    2. setenforce 0
    3. yum -y install nfs-utils rpcbind
    4. mkdir /opt/nfs/server1 /opt/nfs/server2
    5. chmod -R 777 /opt/nfs
    6. vim /etc/exports
    7. /opt/nfs 192.168.116.0/24(rw,sync)
    8. /opt/nfs/server1 192.168.116.0/24(rw,sync)
    9. /opt/nfs/server2 192.168.116.0/24(rw,sync)
    10. systemctl restart rpcbind.service
    11. systemctl restart nfs.service

    检查发布的共享策略

    分别在共享目录中添加web测试页面(两个可以有所区别)

    2.配置节点web服务(两台的配置相同)

    配置好ip地址,并将网关指定为网关/路由器的ip地址

    安装nginx提供web服务(apache、nginx等均可,仅用于实验)

    添加回环网卡虚拟ip

    cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0
     
    vim /etc/sysconfig/network-scripts/ifcfg-lo:0
    DEVICE=lo:0
    IPADDR=192.168.116.100
    NETMASK=255.255.255.255
    ONBOOT=yes
     
    ifup lo:0

    添加静态路由(将数据包封锁在回环网卡中)

    1. #临时配置
    2. route add -host 192.168.116.100 dev lo:0
    3. #永久配置
    4. vim /etc/rc.local
    5. /sbin/route add -host 192.168.116.100 dev lo:0
    6. chmod +x /etc/rc.d/rc.local

    调整内核的ARP响应参数(阻止更新VIP的MAC地址,避免发生冲突)

    1. vim /etc/sysctl.conf
    2. #添加
    3. net.ipv4.conf.lo.arp_ignore = 1
    4. net.ipv4.conf.lo.arp_announce = 2
    5. net.ipv4.conf.all.arp_ignore = 1
    6. net.ipv4.conf.all.arp_announce = 2
    7. #加载配置
    8. sysctl -p

    3.配置主备LVS+keepalived负载调度器

    两台都关闭防火墙下载keepalived和ipvsadm,修改内核参数

    1. systemctl stop firewalld.service
    2. setenforce 0
    3. modprobe ip_vs
    4. yum -y install ipvsadm keepalived
    5. vim /etc/sysctl.conf
    6. net.ipv4.ip_forward = 0
    7. net.ipv4.conf.all.send_redirects = 0
    8. net.ipv4.conf.default.send_redirects = 0
    9. net.ipv4.conf.ens33.send_redirects = 0
    10. sysctl -p

    修改主负载器配置文件

    修改备负载器配置文件(与主配置一致,只需修改以下部分)

    之后启动keepalived再启动ipvsadm(ipvsadm会自动加载keepslived中的配置)

    1. #启动keepalived
    2. systemctl restart keepalived.service
    3. ipvsadm-save > /etc/sysconfig/ipvsadm
    4. #启动ipvsadm
    5. systemctl restart ipvsadm.service

    查看主服务器

    查看备服务器

    现在将主负载器服务停止或关机(模拟宕机),继续访问

     

    访问成功,这次显然是由备负载器进行转发的

    三、非抢占模式

    keepalived的抢占与非抢占模式
            抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。

            非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。非抢占式的两个节点state必须为BACKUP,且必须在优先级前添加nopreempt。
    注意:这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了。

    四、脑裂现象的解释和解决办法

    1.解释

            在抢占模式中,MASTER需要定时发送报文通告BACKUP自己仍在运作,但是当MASTER还在运作,但其中的线路或交换机等出现故障导致BACKUP不能收到通告时,会认为MASTER已经失效,此时BACKUP抢占VIP会导致VIP同时存在,这就是脑裂现象。

    2.解决方法

            主备服务器之间使用双链路通信;

            通过脚本来实时监控主备的网络状态,然后再根据脚本逻辑采取措施(关掉主服务器的keepalived服务器);

            通过第三方监控系统来实时监控主备服务器及网络状态,然后再根据情况采取措施(关掉主服务器的keepalived服务器)。

  • 相关阅读:
    用「闪电侠」的例子解释一下进程和线程
    区块链实训教程(6)--开发、编译、部署、调用HelloWorld合约
    Python---练习:判断是否为一个合法三角形(if else)
    用正则表达式简单解析JSON字符串
    EXCEL里数值列如何显示序号?如何重新排序? 怎么取得排序后的序号?
    go | 切片的长度和容量
    STC8H_硬件IIC
    【数据库系统概论】作业3 第三章 习题4|5|9
    Java基础教程(21)-Java连接MongoDB
    数组还是HashSet?
  • 原文地址:https://blog.csdn.net/a319569016/article/details/132808923