Skip to content

Lvs

架构介绍

  • Lvs全称:Linux Virtual Server(Linux虚拟服务器)
  • 用户访问服务器时候,中间加一层服务器作为代理转发到后台多个真实服务器,做转发的这台服务器被叫做Lvs服务器。目的是实现负载均衡和隐藏真实服务器的IP地址作用。
  • Lvs服务器可以配置为NAT模式或DR模式

NAT模式架构图

提示

  • VIP全称:Virtual IP Address(虚拟IP地址)
  • CIP全称:Client IP Address(客户端IP地址)
  • RIP全称:Real IP Address(真实服务器IP地址)
Lvs NAT架构图
流量方向 用到规则 作用
客户端 → LVS → Web (发起请求) DNAT 改目标 IP:VIP → 后端 RIP
Web → LVS → 客户端 (返回响应) SNAT 改源 IP:后端 RIP → VIP
什么是DNAT和SNAT?
名称 全称 作用位置 修改什么 核心用途 LVS-NAT 中角色
DNAT 目的网络地址转换 入站流量(请求) 修改目标IP 把访问VIP的请求,转发到后端真实服务器 客户端→LVS→Web:VIP 改成 RIP
SNAT 源网络地址转换 出站流量(响应) 修改源IP 隐藏后端真实IP,统一用VIP回包给客户端 Web→LVS→客户端:RIP 改成 VIP

NAT模式案例

准备说明

  • 实验过程都是用的vmware虚拟机进行模拟演练 >
  • 当把Lvs服务器配置成NAT模式时,须服务器满足:有至少2块网卡,其中一块网卡连接到公网,另一块网卡连接到内网。
  • 下面实验是由vmware虚拟机组成的实验环境。我的机器是1台本宿主机(即windows电脑本机),1台带有2块网卡的lvs虚拟机,2台web虚拟机。

NAT模式实验操作步骤:

  1. 网卡配置
  • 配置Lvs服务器增加2块网卡,一块自动桥接网卡(vmnat0),一块nat网卡(vmnat8)
  • 配置2台web服务器,都是一块nat模式网卡(vmnat8)
  1. 配置IP地址
  • 配置lvs自动桥接网卡(vmnat0)的IP地址为192.168.73.65/24,另一块网卡(vmnat8)的IP地址为192.168.229.127/24
  • 配置2台web服务器的IP地址为192.168.229.128/24和192.168.229.129/24
  • 由于lvs有vmnat0桥接模式的网卡,本身是和windows电脑(ip地址为192.168.73.62)打通的,无需配置。

配置说明

  • lvs配置2块网卡和2个IP地址,目的就是模拟一头接公网,一头接内网。
  • 这里用2个局域网模拟。192.168.73.0/24(vmnat0)网段的作为公网,192.168.229.0/24(vmnat8)网段的作为内网。
Lvs NAT架构图
  1. 进入虚拟机配置
shell
# LVS虚拟机配置
yum install ipvsadm -y # 安装ipvsadm工具
systemctl start ipvsadm # 启动ipvsadm服务
ipvsadm -A -t 192.168.73.65:80 -s rr  # 创建一个NAT模式的Lvs服务器,VIP为192.168.73.65,端口为80,调度算法为轮询(rr)
ipvsadm -a -t 192.168.73.65:80 -r 192.168.229.128:80 -m
ipvsadm -a -t 192.168.73.65:80 -r 192.168.229.129:80 -m  # 将lvs接受的请求服务转发给内网的2台web服务器 -m是nat模式
echo 1 >/proc/sys/net/ipv4/ip_forward # 开启路由转发功能

# 2台web服务器配置
yum install nginx -y # 提前安装nginx因为内网无法访问外网安装
systemctl start nginx # 启动nginx服务
route add -net 192.168.73.0 netmask 255.255.255.0 gw 192.168.229.127 # 配置路由,将返回给用户的流量给lvs再次转发到外网的用户Windows上
  1. 验证实验,访问VIP192.168.73.65:80,即可看到2台web服务器由于rr的轮询调度,分别被分配到不同的web服务器上
Lvs NAT架构图

DR模式架构图

Lvs DR架构图
步骤 流量环节 源IP 目的IP 源MAC 目的MAC 核心动作
1 客户端请求 客户端公网/内网IP VIP 客户端MAC LVS网卡MAC 客户端访问VIP,二层先发给LVS
2 LVS调度转发 客户端IP VIP 不变(客户端/入口MAC) 改成某一台RS的MAC 只改目标MAC,IP全程不变,二层转发
3 RS接收请求 客户端IP VIP LVS网卡MAC RS网卡MAC RS在lo回环绑定VIP,接收目的IP为VIP的包
4 RS返回响应 VIP 客户端IP RS网卡MAC 网关MAC 不经过LVS,直接找机房/局域网网关回包给客户端

DR模式案例

准备说明

  • DR模式下,Lvs服务器,2台web服务器,都要有公网IP,也就是说模拟时候这3台服务器都要处于一个局域网。
  • 与NAT模式最大的不同是,在于数据返回时,Lvs服务器不再做返回时候转发,而是由web服务器直接返回给客户端。

DR模式实验操作步骤:

  1. IP配置
  • lvs服务器,2台web服务器,都要处于同一局域网,模拟都处于公网有独立IP地址并且同段。这里我把3台机器网卡都用的是vmnat0桥接模式,分配了IP地址,如下。
  • lvs服务器IP地址:192.168.73.65/24
  • 2台web服务器IP地址:192.168.73.63/24和192.168.73.64/24
  • windows电脑IP地址:192.168.73.62/24
  • VIP地址:192.168.73.111/24
  1. 进入虚拟机配置
shell
# lvs配置绑定一个虚拟IP地址 ,外网 / 客户端访问 192.168.73.111 就能到 LVS
ifconfig ens33:0 192.168.73.111 broadcast 192.168.73.255 netmask 255.255.255.0 up
route add -host 192.168.73.111 dev ens33:0  # 核心作用:制告诉系统:访问VIP 192.168.73.111 时,必须从 ens33:0 这个虚拟网卡走,不能乱走物理网卡、不能走默认路由。
# 必关ICMP重定向
net.ipv4.conf.all.send_redirects = 0      # 所有网卡都禁止发重定向
net.ipv4.conf.default.send_redirects = 0  # 默认网卡规则禁止
net.ipv4.conf.ens33.send_redirects = 0    # 你业务网卡 ens33 单独禁止
# 若不关闭这些配置,用户访问一次之后,就绕过 LVS 直连 RS,负载均衡直接报废。

yum install ipvsadm -y # 安装ipvsadm工具
systemctl start ipvsadm # 启动ipvsadm服务
ipvsadm -A -t 192.168.73.111:80  -s rr  # 创建一个DR模式的Lvs服务器,VIP为192.168.73.111,端口为80,调度算法为轮询(rr)
ipvsadm -a -t 192.168.73.111:80 -r 192.168.73.63:80 -g
ipvsadm -a -t 192.168.73.111:80 -r 192.168.73.64:80 -g  # 将lvs接受的请求服务转发给内网的2台web服务器 -g是dr模式

# web服务器配置
yum install nginx -y #
systemctl start nginx # 启动nginx服务
ifconfig lo:0 192.168.73.111/32 # 在本机回环网卡绑定VIP,掩码必须 /32 只让自己认这个 VIP,不广播到其他网段。
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore  # 别人发ARP 问VIP是谁 Rs→不回应
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce  # RS 对外主动通告自己 IP 时,绝不把 VIP 广播出去
  1. 验证实验结果,访问VIP192.168.73.111:80,即可看到2台web服务器由于rr的轮询调度,分别被分配到不同的web服务器上
Lvs DR架构图

两种模式对比

对比维度 LVS-NAT 模式 LVS-DR 模式
转发工作层级 网络层(三层IP转发) 数据链路层(二层MAC转发)
流量走向 请求、响应双向都经过调度器 请求经调度器,响应直接回客户端
VIP 部署位置 仅调度器配置VIP 调度器 + 所有后端RS都配置VIP(回环网卡lo)
端口映射支持 支持端口转换(如80→8080) 不支持,VIP与RS服务端口必须一致
后端RS网关 必须指向LVS调度器内网IP 不能指向调度器,使用原有默认网关
网络环境要求 可跨网段、跨三层 必须同二层广播域(同网段、同交换机)
ARP 配置 无需特殊ARP配置 需要内核参数抑制ARP,防止VIP地址冲突
性能瓶颈 调度器瓶颈严重,吞吐量低 仅处理入站请求,性能极高、无带宽瓶颈
后端节点容量 最多支持10~20台RS 支持几十到上百台RS,扩展性强
配置复杂度 简单,后端无需特殊配置 中等,RS需配置回环VIP+调内核参数
真实IP隐藏 后端RS为私网,可隐藏真实地址 后端暴露公网/同网段IP,无法隐藏
适用场景 测试环境、小流量业务、需要端口映射 生产高并发Web/API、大流量集群服务

KeepAlived

介绍

  • KeepAlived出现的目的是防止一台lvs挂掉后,导致整个集群瘫痪不可用。
  • 大多情况下,会部署2台lvs服务器,1主1备模式,正常情况下只有主节点工作,备节点待命。这两台lvs服务器用KeepAlived软件进行相互监听,当主lvs挂掉后,备lvs会自动切换为主lvs。保证了集群的高可用(HA)。

KeepAlived实验案例

DR模式主节点故障演练

  • 准备实验环境:4台服务器,2台lvs服务器,2台web服务器,1台windows电脑。(只需在上面dr模式实验再多一个lvs服务器即可)
  • 模拟主节点故障,备节点会自动切换为主节点。
  • 验证第二台备节点是否成功切换为主节点。

实验步骤

  1. 配置2台lvs服务器
shell
yum install keepalived -y # 安装keepalived工具,不用装ipvsadm工具因为keepalived内核包含了ipvs模块的功能
systemctl start keepalived # 启动keepalived服务
vim /etc/keepalived/keepalived.conf # 编辑keepalived配置文件如下
shell
# 2台lvs的配置文件都是如下,只是备节点的文件第8行state改为BACKUP
! Configuration File for keepalived
global_defs {
    router_id Director1   # 两台节点此ID必须不同
}

vrrp_instance VI_1 {
    state MASTER                  # 备节点改为 BACKUP
    interface ens33                # 心跳与绑定VIP的网卡
    virtual_router_id 51          # 主备节点必须完全一致
    priority 150                  # 备节点优先级需低于主节点
    nopreempt                   # 当原始的主节点挂了恢复的时候,不会自动切换为主节点尽管priority优先级高
    advert_int 1                  # VRRP心跳广播间隔,单位秒




    authentication {
        auth_type PASS
        auth_pass 1111            # 主备认证密码必须一致(1-8位)
    }

    virtual_ipaddress {
        192.168.73.100/24 dev ens33 # 对外服务的浮动VIP  (以前需要手动添加vip,keepalived会自动添加)
    }
}

# LVS 负载均衡虚拟服务配置(DR模式)
virtual_server 192.168.73.100 80 {
    delay_loop 3                  # 后端RS健康检查轮询间隔,3秒
    lb_algo rr                    # LVS调度算法:轮询(Round Robin)
    lb_kind DR                    # LVS工作模式:直接路由DR模式
    protocol TCP

    # 后端真实服务器1
    real_server 192.168.73.63 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3     # TCP健康检查超时时间,3秒  
        }
    }

    # 后端真实服务器2
    real_server 192.168.73.64 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3    
        }
    }
}
  1. 启动2台web服务器
shell
yum install nginx -y # 安装nginx
systemctl start nginx # 启动nginx服务
ifconfig lo:0 192.168.73.111/32 # 在本机回环网卡绑定VIP,掩码必须 /32 只让自己认这个 VIP,不广播到其他网段。
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore  # 别人发ARP 问VIP是谁 Rs→不回应
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce  # RS 对外主动通告自己 IP 时,绝不把 VIP 广播出去
  1. 停止主lvs服务器,模拟主节点故障
shell
systemctl stop keepalived # 停止keepalived服务
  1. 查看备节点是否成功切换为主节点
1

keepalived脑裂问题

什么是脑裂?

  • 当联系2个节点的“心跳线"断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。
  • 由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像"裂脑人"一样,争抢“VIP”、争抢"共享资源"、争起"应用服务"。两个节点都认为自己是主节点,最终会导致两边服务都起不来,或者2边"服务"都起来了,但同时读写"共享存储",导致数据损坏。(例如用户发起对同一个数据进行增删操作,一台lvs增操作,另一台lvs执行删操作)。
  • 解决: 配置2条心跳线,保持2个节点的联系.配置第三方仲裁节点。
全速前进中...