1. LVS 负载均衡
Linux Virtual Server
章文嵩博士主导的开源的负载均衡项目
LVS(ipvs)已被集成到Linux内核中
负载均衡调度器
2. 为什么要使用 LVS + Nginx?
LVS 基于四层负载均衡,工作效率高
单个 Nginx 承受不了压力,需要集群
LVS 充当 Nginx 集群的调度者
Nginx 接受请求来回,LVS 可以只接受不响应
3. LVS 的三种模式
3.1. LVS 模式之 NAT
3.2. LVS 模式之 TUN
3.3. LVS 模式之 DR
3. 搭建 LVS-DR 模式 - 配置LVS节点与ipvsadm
3.1. 服务器与IP约定
LVS:
DIP:192.168.1.151(内网IP)
VIP:192.168.1.150(虚拟IP)Nginx1:
RIP:192.168.1.171(内网IP)
VIP:192.168.1.150(虚拟IP)Nginx2:
RIP:192.168.1.172(内网IP)
VIP:192.168.1.150(虚拟IP)
3.2. 关闭网络配置管理器
所有主机节点关闭网络配置管理器,因为可能会和网络接口冲突
systemctl stop NetworkManager
systemctl disable NetworkManager
3.3. 创建子接口虚拟IP
进入到网卡配置目录,找到本机网卡(如,ens33或者eth0)
cd /etc/sysconfig/network-scripts/ ls拷贝并且创建子接口(这里以网卡ens33为例,实际情况自定)
cp ifcfg-ens33 ifcfg-ens33:1注:数字’1’为别名,可以任取其它数字
配置子接口
vim ifcfg-ens33:1DEVICE="ens33:1" BOOTPROTO="static" ONBOOT="yes" IPADDR=192.168.1.150 NETMASK="255.255.255.0"刷新网络配置
service network restart查看配置是否成功
ip addr出现
192.168.1.150、ens33:1
至此,子接口 虚拟IP已配置成功
3.4. 安装集群管理工具ipvsadm
yum install ipvsadm
验证安装
ipvsadm -Ln
安装成功会出现版本号集群等信息
3.5. 注意事项
目前所涉及到的有关虚拟ip的配置,都是在本地虚拟机进行的
需要注意的是,在云服务器,如阿里云、腾讯云
阿里云:不支持系统级别的虚拟ip,需要购买官方提供的负载均衡服务
腾讯云:支持系统级别的虚拟ip,但是也是需要额外购买的(单台服务器最多支持10个ip)
因为虚拟ip是建立在网卡的基础上,需要成本的
4. 搭建 LVS-DR 模式 - 为两台RS配置虚拟IP
4.1. 192.168.1.171配置创建子接口虚拟IP
进入到网卡配置目录,找到本机网卡ifcfg-lo
为什么这里使用ifcfg-lo,而不使用之间提到的ens33或者eth0?
ifcfg-l0 是本地回环接口,相当于 127.0.0.1
因为在这里我们要构建的虚拟ip仅用于返回用户数据,不对外提供访问,所以使用ifcfg-lo构建子接口cd /etc/sysconfig/network-scripts/ ls拷贝并且创建子接口
cp ifcfg-lo ifcfg-lo:1注:数字’1’为别名,可以任取其它数字
配置子接口
vim ifcfg-lo:1DEVICE="lo:1" IPADDR=192.168.1.150 NETMASK=255.255.255.255 NETWORK=127.0.0.0 BROADCAST=127.255.255.255 ONBOOT="yes" NAME=loopback刷新网络配置
ifup lo查看配置是否成功
ip addr出现
192.168.1.150、lo:1
至此,子接口 虚拟IP已配置成功
4.2. 192.168.1.172配置创建子接口虚拟IP
进入到网卡配置目录,找到本机网卡ifcfg-lo
cd /etc/sysconfig/network-scripts/ ls拷贝并且创建子接口
cp ifcfg-lo ifcfg-lo:1注:数字’1’为别名,可以任取其它数字
配置子接口
vim ifcfg-lo:1DEVICE="lo:1" IPADDR=192.168.1.150 NETMASK=255.255.255.255 NETWORK=127.0.0.0 BROADCAST=127.255.255.255 ONBOOT="yes" NAME=loopback刷新网络配置
ifup lo查看配置是否成功
ip addr出现
192.168.1.150、lo:1
至此,子接口 虚拟IP已配置成功
5. 搭建 LVS-DR 模式 - 为两台RS配置arp
arp-ignore:ARP响应级别(处理请求)
0:只要本机配置了ip,就能响应请求
1:请求的目标地址到达对应的网络接口,才会响应请求arp-announce:ARP通告行为(返回数据)
0:本机上任何网络接口都向外通告,所有的网卡都能接受到通告
1:尽可能避免本网卡与不匹配的目标进行通告
2:只在本网卡通告
5.1. 192.168.1.171配置ARP
- 配置ARP,打开
sysctl.confvim /etc/sysctl.conf - 配置所有网卡
# configration for lvs 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 - 刷新网络配置
sysctl -p - 增加一个网关,用户接收数据报文,当有请求到本机后,会交给lo去处理
# 增加网关(此方式重启后会失效) route add -host 192.168.1.150 dev lo:1
检查配置
route -n
* 把网关配置加到开机自启,防止重启失效
```bash
echo "route add -host 192.168.1.150 dev lo:1" /etc/rc.local
5.2. 192.168.1.172配置ARP
同上
6. 搭建 LVS-DR 模式 - 使用ipvsadm配置集群规则
通过上面的章节,我们已经配置好了三台主机,接下来我们使用 ipvsadm 为它们配置集群
创建 LVS 节点,用户访问的集群调度者
ipvsadm -A -t 192.168.1.150:80 -s rr -p 5-A:添加集群
-t:tcp协议
ip地址:设定集群的访问ip,也就是LVS的虚拟ip
-s:设置负载均衡的算法,rr表示轮询
-p:设置连接持久化的时间创建2台RS真实服务器
ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.171:80 -g ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.172:80 -g-a:添加真实服务器
-t:tcp协议
-r:真实服务器的ip地址
-g:设定DR模式保存到规则库,否则重启失效
ipvsadm -S检查集群
# 查看集群列表 ipvsadm -Ln
查看集群状态
ipvsadm -Ln –stats
* 其它命令
```bash
# 重启 ipvsadm,重启后需要重新配置
service ipvsadm restart
# 查看持久化连接
ipvsadm -Ln --persistent-conn
# 查看连接请求过期时间以及请求ip和目标ip
ipvsadm -Lnc
# 设置 tcp tcpfin udp 的过期时间(一般保持默认)
ipvsadm --set 1 1 1
# 查看过期时间
ipvsadm -Ln --timeout
- 更新详细的帮助文档
ipvsadm -h man ipvsadm
7. 搭建 LVS-DR 模式 - 验证DR模式
ipvsadm -Ln --stats
注意:测试发现每次请求还是同一台节点,并不是我们所配置轮训,这是为什么呢?
原因1:ipvsadm会默认持久化连接,默认时间为300s
原因2:ipvsadm会默认配置tcp tcpfin udp的连接超时时间
# 重新配置持久化时间为5s
ipvsadm -E -t 192.168.1.150:80 -s rr -p 5
# 重新配置 tcp tcpfin udp的连接超时时间,1分钟
ipvsadm --set 1 1 1
# 检查配置
ipvsadm -Ln
ipvsadm -Lnc
等1分钟过后,刷新请求,会看到轮训请求到第二个节点,验证通过
注:在正常使用时,这些配置可以保持默认
8. 总结
以上,我们完成了 LVS-DR 模式,实现高可用集群架构 LVS 负载均衡