抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

LVS 负载均衡

  • LVS(ipvs)已被集成到Linux内核中 Linux Virtual Server
  • 负载均衡调度器
  • 基于四层的负载均衡, ip+端口号, 传输层

LVS网络拓扑图

为什么要使用 LVS + Nginx

  • LVS基于四层的, 工作效率高
  • 单个Nginx承受不了压力, 需要集群
  • LVS充当Nginx集群的调度者
  • Nginx接受请求来回, LVS可以只接受不响应

有进有出, 需要处理响应

不需要处理响应, 核心就是ipvs.

LAS的三种模式

NAT

TUN - Tunneling 隧道模式

ip隧道, 量子领域.有一个硬性要求, 每一个节点都要配备一张网卡.下行不会经过LVS, 下行量会很大, 这种方式大大提高了并发和吞吐量.Real Server是暴露在公网的, 这种方式很明显是不安全的.

DR – Direct Route 直接路由模式

搭建LVS, 使用DR模式

LVS节点构建虚拟IP

使用CentOS(192.168.123.129)配置.

# 关闭网络配置管理器 不关闭可能会引起网络接口的冲突, 虚拟机的关系
systemctl stop NetworkManager
systemctl disable NetworkManager
cd /etc/sysconfig/network-script/
cp ifcfg-ens33 ifcfg-ens33:1
vim ifcfg-ens33:1

BOOTPROTO=static
DEVICE=ens33:1
ONBOOT=yes
IPADDR=192.168.123.117
NETMASK=255.255.255.0

# 重新加载配置文件
nmcli c reload
# 重启网卡
nmcli c up ens33
nmcli d reapply ens33
nmcli d connect ens33

ArchLinux(192.168.123.26)

# 添加
ip addr add 192.168.123.117/24 dev eno1
# 移除
ip addr del 192.168.123.117/24 dev eno1

注意: 阿里云不支持虚拟ip的, 而腾讯云的虚拟ip是收费的(建立在网卡上).

为其余RS配置虚拟IP

两台都是CentOS.(192.168.123.128, 192.168.123.129)

这个虚拟ip仅仅是用来返回用户数据报文的, 而不能被用户访问到真实服务器哦, 所以要在本地环回接口上添加!

# 使用 ip addr 指令
ip addr add 192.168.123.117/8 dev lo
# 查看帮助
ip addr -help

为其余RS配置ARP

arp-ignore: ARP响应级别(处理请求)

  • 0: 只要本机配置了ip, 就能响应请求
  • 1:请求的目标地址到达对应的网络接口, 才会响应请求

arp-announce:ARP通告行为(返回响应)

  • 0:本机上任何网络接口都向外通告, 所有的网卡都能接受到通告
  • 1:尽可能避免本网卡与不匹配的目标进行通告
  • 2:只在本网卡通告

修改

# Manjaro
cd /usr/lib/sysctl.d/
vim 50-default.conf
sysctl --system
# CentOS
vim /etc/sysctl.conf
sysctl -p

添加以下内容

net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.default.arp_ignore=1
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.default.arp_announce =2
net.ipv4.conf.lo.arp_announce =2

添加路由

# 接收数据报文, 在本机会交给lo处理
route add -host 192.168.123.117 dev lo
route -n

# CentOS 添加到开机启动
echo "route add -host 192.168.123.117 dev lo" >> /etc/rc.local

# ArchLinux 添加到开机启动
# 创建一个service脚本
vim /etc/systemd/system/rc-local.service

:<<!
[Unit]
Description="/etc/rc.local Compatibility"

[Service]
Type=oneshot
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardInput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target
!

# 创建rc.local文件
vim /etc/rc.local


#!/bin/sh
# /etc/rc.local
if test -d /etc/rc.local.d; then
    for rcscript in /etc/rc.local.d/*.sh; do
        test -r "${rcscript}" && sh ${rcscript}
    done
    unset rcscript
fi

# 修改执行权限
chmod a+x /etc/rc.local

# 创建rc.local.d文件夹 把需要开机启动的脚本放在此文件夹下即可
mkdir /etc/rc.local.d

# 设置开机启动
systemctl enable rc-local.service

安装集群管理工具

# CentOS
yum install ipvsadm
# ArchLinux
pacman -S ipvsadm
# 查看安装
ipvsadm -Ln

使用ipvsadm配置集群规则

# 查看帮助
ipvsadm -h
man ipvsadm

# 创建虚拟集群  
# -t tcp service
# -s 负载均衡算法 rr 轮询
# -p 设置连接持久化时间
ipvsadm -A -t 192.168.123.117:80 -s rr -p 5
# 查看创建
ipvsadm -Ln
# 创建真实服务器的节点
# -r realServer
# -g gatewaying dr模式
ipvsadm -a -t 192.168.123.117:80 -r 192.168.123.128:80 -g
ipvsadm -a -t 192.168.123.117:80 -r 192.168.123.129:80 -g

# 保存到规则库, 否则重启后会失效
ipvsadm -S
# 查看集群状态
ipvsadm -Ln --stats

# 重启ipvsadm, 重启后需要重新配置
systemctl start ipvsadm

验证DR模式和LVS持久化方案

ipvsadm -Ln --stats

Prot LocalAddress:Port                  Conns   InPkts  OutPkts  InBytes OutBytes
    -> RemoteAddress:Port
   TCP  192.168.123.117:80                 2       16        0     3140        0
    -> 192.168.123.128:80                  2       16        0     3140        0
    -> 192.168.123.129:80                  0        0        0        0        0

可以到OutPkts参数是0, 也就是说下行的返回没有经过lvs.

问题1:负载均衡方案是轮询, 但是刷新还是访问同一个节.

原因:lvs持久化连接.同一个客户端的多次请求, 在第一次访问之后, 会建立连接, 之后会被重定向到同一个服务器.默认时间是300s.

# 重新修改 持久化连接时间为 5s
ipvsadm -E -t 192.168.123.117:80 -s rr -p 5
# 查看持久化连接
ipvsadm -Ln --persistent-conn
# 查看连接请求过期时间以及请求源ip和目标ip
ipvsadm -Lnc
# 设置 tcp tcpfin udp 的过期时间(一般保持默认)
ipvsadm --set 1 1 1
# 查看过期时间
ipvsadm -Ln --timeout

搭建 Keepalived + LVS + Nginx 高可用集群

Keepalived有健康检查.

LVS服务器:192.168.123.26、192.168.123.197

Nginx服务器:192.168.123.128、192.168.123.129

修改192.168.123.26的keepalived.conf

global_defs {
   router_id lvs_26
}

# 计算机节点
vrrp_instance VI_1 {
    # 当前的 26 为主节点 如果是备用机的话, 就是BACKUP
    state MASTER
    # 当前实例绑定的网卡
    interface eno1
    # 保证主备id一致即可
    virtual_router_id 41
    # 优先级 权重 master宕机之后, 就会进行选举, 谁的优先级高, 就能成为master
    priority 100
    # 心跳同步检查的时间间隔, 默认1秒
    advert_int 1
    # 认证授权的密码, 防止非法节点的进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟ip
    virtual_ipaddress {
        192.168.123.117
    }
}
# LVS配置
# 配置集群地址访问的IP+端口, 端口和nginx保持一致, 都是80
virtual_server 192.168.123.117 80 {
    # 健康检查的时间 单位是秒
    delay_loop 6
    # lb LoadBalance 负载均衡算法 默认是轮询
    lb_algo rr
    # 设置LVS模式 NAT TUN DR
    lb_kind DR
    # 会话持久化连接时间
    persistence_timeout 5
    # 协议 -t
    protocol TCP
    # 负载均衡的真实服务器, 就也是nginx节点真实的ip地址
    real_server 192.168.123.128 80 {
        # 轮询的默认权重配比设置为1
        weight 1
        # 设置健康检查
        TCP_CHECK {
            # 检查 80 端口
            connect_port 80;
            # 超时时间 2s
            connect_timeout 2;
            # 重试次数 2次
            nb_get_retry 2;
            # 间隔时间 3s
            delay_before_retry 3;
        }
    }
    real_server 192.168.123.129 80 {
        weight 1
        # 设置健康检查
        TCP_CHECK {
            # 检查 80 端口
            connect_port 80;
            # 超时时间 2s
            connect_timeout 2;
            # 重试次数 2次
            nb_get_retry 2;
            # 间隔时间 3s
            delay_before_retry 3;
        }
    }
}

修改192.168.123.197的keepalived.conf

global_defs {
   router_id lvs_197
}

# 计算机节点
vrrp_instance VI_1 {
    # 当前的 26 为主节点 如果是备用机的话, 就是BACKUP
    state BACKUP
    # 当前实例绑定的网卡
    interface wlp1s0
    # 保证主备id一致即可
    virtual_router_id 41
    # 优先级 权重 master宕机之后, 就会进行选举, 谁的优先级高, 就能成为master
    priority 80
    # 心跳同步检查的时间间隔, 默认1秒
    advert_int 1
    # 认证授权的密码, 防止非法节点的进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟ip
    virtual_ipaddress {
        192.168.123.117
    }
}
# LVS配置
# 配置集群地址访问的IP+端口, 端口和nginx保持一致, 都是80
virtual_server 192.168.123.117 80 {
    # 健康检查的时间 单位是秒
    delay_loop 6
    # lb LoadBalance 负载均衡算法 默认是轮询
    lb_algo rr
    # 设置LVS模式 NAT TUN DR
    lb_kind DR
    # 会话持久化连接时间
    persistence_timeout 5
    # 协议 -t
    protocol TCP
    # 负载均衡的真实服务器, 就也是nginx节点真实的ip地址
    real_server 192.168.123.128 80 {
        # 轮询的默认权重配比设置为1
        weight 1
        # 设置健康检查
        TCP_CHECK {
            # 检查 80 端口
            connect_port 80;
            # 超时时间 2s
            connect_timeout 2;
            # 重试次数 2次
            nb_get_retry 2;
            # 间隔时间 3s
            delay_before_retry 3;
        }
    }
    real_server 192.168.123.129 80 {
        weight 1
        # 设置健康检查
        TCP_CHECK {
            # 检查 80 端口
            connect_port 80;
            # 超时时间 2s
            connect_timeout 2;
            # 重试次数 2次
            nb_get_retry 2;
            # 间隔时间 3s
            delay_before_retry 3;
        }
    }
}
# 清除 ipvsadm
ipvsadm -C
# 重启 keepalived
systemctl restart keepalived

评论