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