LVS+Keepalived 实现高可用负载均衡

本文介绍了LVS(LinuxVirtualServer)及其负载均衡功能,重点讲解了Keepalived在高可用性中的应用,包括配置、架构和故障转移过程,以及如何通过LVS和Keepalived实现高效、灵活的服务器集群管理。
摘要由CSDN通过智能技术生成

一,什么是 LVS?

LVS: 是Linux Virtual Server的简写,也就是Linux 虚拟服务器,是一个虚拟的服务器集群系统,本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。

二,为什么使用LVS?

使用LVS可以达到的技术目标是:通过LVS达到的负载均衡技术和Linux操作系统实现一个高性能高可用的Linux服务器群集,它具有良好的可靠性,可拓展性和可操作性,从而以低廉的成本实现最优的性能。

三,什么是Keepalived?

Keepalived 是一个基于 VRRP 协议来实现的服务高可用方案,可以利用其来避免 IP 单点故障,一般与其它负载均衡技术(如 LVS、HAProxy 、Nginx)一起工作来达到集群的高可用。Keepalived 是 LVS 的扩展项目,因此它们之间具备良好的兼容性,可直接通过 Keepalived 的配置文件来配置 LVS。

四,实验架构图

在这里插入图片描述

集群的架构图如上图所示。DS1、DS2 为两个 LB 节点,RS1、RS2 为两个真实的服务节点,通过一个虚拟的 IP 地址对外提供服务。

最终我们要达到的目标为:

Client 通过 VIP 访问服务能够将请求根据配置的规则进行分发(LB) 当 MATSER 的 LB 节点故障时,自动切换到
BACKUP 的 LB 节点上,保证服务正常访问;MASTER 恢复后,再次作为主 LB 负载节点 当某个 RS
节点故障时,自动剔除该节点;恢复后,再次加入集群

五,开始搭建

1,在DS1和DS2执行以下下载命令,分别在主备lvs上安装keepalived

yum install ipvsadm keepalived -y

修改主lvs下/etc/keepalived/keepalived.conf文件

! Configuration File for keepalived

global_defs {
   notification_email {
    hgh@163.com                                   # 发生故障时发送的邮箱
   }
   #notification_email_from hgh@163.com             # 使用哪个邮箱发送
   #smtp_server hgh.com                                  # 发件服务器
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER             # 标示为主lvs
    interface eth0           # HA检测端口(当前 IP 对应的网络接口,通过 ifconfig 查询)
    virtual_router_id 51     # 主备的virtual_router_id 必须相同
    priority 100             # 优先级,备lvs要比主lvs稍小
    advert_int 1             # VRRP Multicast 广播周期秒数
    authentication {         # 定义认证
        auth_type PASS       # 认证方式为口令认证
        auth_pass 1111       # 定义口令
    }
    virtual_ipaddress {      # 定义vip
        192.168.10.100       # 多个vip可换行添加
    }
}

virtual_server 192.168.10.100 80 {
    delay_loop 6       # 每隔6秒查看realserver状态
    lb_algo wlc        # 调度算法为加权最小连接数
    lb_kind DR         # lvs工作模式为DR(直接路由)模式
    nat_mask 255.255.255.0
    persistence_timeout 50  # 同一IP 的连接50秒内被分配到同一台realserver(测试时建议改为0)
    protocol TCP            # 用TCP监测realserver的状态

    real_server 192.168.10.203 80 {       # 定义realserver
        weight 3                       # 定义权重
        TCP_CHECK {  # 注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
            connect_timeout 3          # 三秒无响应超时
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.10.204 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

修改备lvs下/etc/keepalived/keepalived.conf文件

配置备lvs时需要注意:需要修改state为BACKUP ,
priority比MASTER低,virtual_router_id和master的值一致

! Configuration File for keepalived

global_defs {
   notification_email {
    #hgh@163.com                                   # 发生故障时发送的邮箱
   }
   #notification_email_from hgh@163.com             # 使用哪个邮箱发送
   #smtp_server 163.com                                  # 发件服务器
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP             # 标示为备lvs
    interface eth0           # HA检测端口(当前 IP 对应的网络接口,通过 ifconfig 查询)
    virtual_router_id 51     # 主备的virtual_router_id 必须相同
    priority 99              # 优先级,备lvs要比主lvs稍小
    advert_int 1             # VRRP Multicast 广播周期秒数
    authentication {         # 定义认证
        auth_type PASS       # 认证方式为口令认证
        auth_pass 1111       # 定义口令
    }
    virtual_ipaddress {      # 定义vip
        192.168.10.100       # 多个vip可换行添加
    }
}

virtual_server 192.168.10.100 80 {
    delay_loop 6       # 每隔6秒查看realserver状态
    lb_algo wlc        # 调度算法为加权最小连接数
    lb_kind DR         # lvs工作模式为DR(直接路由)模式
    nat_mask 255.255.255.0
    persistence_timeout 50  # 同一IP 的连接50秒内被分配到同一台realserver(测试时建议改为0)
    protocol TCP            # 用TCP监测realserver的状态

    real_server 192.168.10.203 80 {       # 定义realserver
        weight 3                       # 定义权重
        TCP_CHECK {  # 注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
            connect_timeout 3          # 三秒无响应超时
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.10.204 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
} 

配置完成后,分别重启 Keepalived 服务。

systemctl restart keepalived

搭建配置 RS(后端真实的工作服务器)这些操作都是在RS服务器进行配置注意切换

RS 配置主要分两部分,一部分是 web 服务,另一部分是网络转发配置。
然后在RS1,RS2安装httpd模拟你现在的工程项目就运行在httpd的80端口,和我们配置的keeplived对应上,实现监控
运行以下脚本,才能转发访问到我们后面的两个DS服务器

安装测试httpd服务

yum install -y httpd
systemctl start httpd

然后编写以下脚本 SNS_VIP这个变量的ip地址应该和你keeplived配置的虚拟ip一致

#!/bin/bash
# 设置脚本解释器为Bash

SNS_VIP=192.168.10.100
# 定义一个变量SNS_VIP并赋值为192.168.10.100,这是虚拟IP的地址

case "$1" in
# 使用命令行参数$1的值来决定脚本的操作
start)
       ifconfig ens33:1 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       # 启用虚拟IP,并将它绑定到本地回环接口ens33:1上
       /sbin/route add -host $SNS_VIP dev ens33:1
       # 添加路由,将虚拟IP的数据包发送到ens33:1接口
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       # 设置ARP(地址解析协议)参数,以忽略本地回环接口上的ARP请求
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       # 设置ARP参数,以告知其他主机这是一个共享的IP地址
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       # 设置全局ARP参数,忽略所有接口上的ARP请求
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       # 设置全局ARP参数,告知其他主机这是一个共享的IP地址
       sysctl -p >/dev/null 2>&1
       # 使用sysctl重新加载网络参数,以使更改生效
       echo "RealServer Start OK"
       # 输出启动成功的消息
       ;;
stop)
       ifconfig ens33:1 down
       # 关闭虚拟IP
       route del $SNS_VIP >/dev/null 2>&1
       # 删除虚拟IP的路由配置
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       # 恢复ARP参数,接受本地回环接口上的ARP请求
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       # 恢复ARP参数,不告知其他主机共享IP地址
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       # 恢复全局ARP参数,接受所有接口上的ARP请求
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       # 恢复全局ARP参数,不告知其他主机共享IP地址
       echo "RealServer Stopped"
       # 输出停止成功的消息
       ;;
*)
       echo "Usage: $0 {start|stop}"
       # 如果命令行参数不是start或stop,则输出使用说明
       exit 1
esac
exit 0
# 脚本正常退出

编写完毕 ,在RS运行此脚本

bash tcp.sh start

启动完之后 你应该可以通过你所设置的虚拟ip访问页面
在这里插入图片描述

HA 测试(高可用)

配置完双机热备后,我们就可以测试下,节点发生故障后以及 LB 切换失败后,能否保证服务的 HA。

在负载均衡的主节点上输入 ip a,可以看到 VIP 目前已经正确配置在网卡上。
在这里插入图片描述

输入 watch ipvsadm -Ln --stats 可实时看到负载均衡的结果
在这里插入图片描述

Prot: 代表协议类型,此处为TCP。
LocalAddress:Port: 代表负载均衡器监听的本地地址和端口,本例中为192.168.10.100:80。
Conns: 代表当前连接到负载均衡器的连接数。
InPkts: 代表从客户端到负载均衡器的进入数据包数量。
OutPkts: 代表从负载均衡器到后端服务器的出去数据包数量。
InBytes: 代表从客户端到负载均衡器的进入数据包的字节数。
OutBytes: 代表从负载均衡器到后端服务器的出去数据包的字节数。
RemoteAddress:Port: 代表连接到负载均衡器的客户端的远程地址和端口。
RemoteAddress:Port: 代表转发到的后端服务器的地址和端口。

根据上述输出,可以看到负载均衡器当前有两台后端服务器,分别是192.168.10.203:80和192.168.10.204:80。其中,后端服务器192.168.10.203:80目前还未有连接到达,而后端服务器192.168.10.204:80有一个连接到达,并接收了一个进入数据包。

此时手动停止一个 RS(就是停止一个你所运行httpd的虚拟机),再次访问 VIP,LVS 会自动剔除无法访问的服务,重启后,服务会被自动添加。
在这里插入图片描述
在这里插入图片描述

可以观察到,当某一台(203)停止了服务,lvs会删除掉失效的服务,keepalived会尝试重连,失败之后也会remove 这个服务。
随后 我重新启动(203)的httpd,可以观察到 keepalived 检查可用之后,会重新添加这个服务到当前。
在这里插入图片描述

接下来测试一下 如果是DS(前端负载均衡器节点)其中的某一台出现故障,keepalived会如何处理?

首先停止(201)

   systemctl stop keepalived.service

在这里插入图片描述

可以发现,本来在DS1的vip,现在漂移到了DS2,从而实现HA(高可用)。

总结

高可用性:LVS和Keepalived可以实现故障转移,当一个后端服务器出现故障或不可用时,流量将自动转移到其他可用的后端服务器,确保服务的持续可用性。

负载均衡:LVS可以平衡流量负载,将请求均匀分配到多个后端服务器,避免某台服务器过载而导致性能下降或服务不可用的情况。

灵活性和扩展性:LVS允许根据需要添加或删除后端服务器,以适应不断变化的流量和需求。此外,Keepalived提供了灵活的配置选项,可以根据实际情况进行调整和定制。

效率和性能:LVS和Keepalived是基于内核层的解决方案,相比于其他负载均衡器,可以提供更高效和更低延迟的性能。

总的来说,使用LVS和Keepalived可以提供高可用性、负载均衡,并且具有灵活性和高效性能,使得服务能够稳定可靠地运行,并能够根据需要进行扩展和调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值