LVS 官网: The Linux Virtual Server Project - Linux Server Cluster for Load Balancing
一、实验环境
主机名 | 角色 |
---|---|
LVS | 调度器(VS) |
webserver1 | 服务器(RS) |
webserver2 | 服务器(RS) |
二、lvs集群的类型及运行原理
LVS负载均衡常见的有三种工作模式,分别是地址转换(简称NAT模式)、IP隧道(简称TUN模式)和直接路由(简称DR模式),其实企业中最常用的是 DR 实现方式,而 NAT 配置上比较简单和方便,下面总结 DR 和 NAT 原理和特点
工作原理:VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS
2.1LVS相关术语
-
DS:Director Server, 指的是前端负载均衡器节点。
-
RS:Real Server, 后端真实的工作服务器。
-
VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
-
DIP:Director Server IP, 前端负载均衡器IP地址,主要用于和内部主机通信。
-
RIP:Real Server IP, 后端服务器]的IP地址。
-
CIP:Client IP, 访问客户端的IP地址
2.2nat模式
Ivs-nat:
1.本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发 2.RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP 3.请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈 4.支持端口映射,可修改请求报文的目标PORT 5.VS必须是Linux系统,RS可以是任意OS系统
2.2.1nat数据逻辑模型结构
-
用户发送请求到Director Server,请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。
-
内核空间判断数据包的目标IP是本机,此时IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,重新封装数据包(源IP为CIP,目标IP为RIP),然后选路将数据包发送给Real Server。
-
Real Server比对发现目标IP是本机的IP,重新封装报文(源IP为RIP,目标IP为CIP)发回给Director Server。
-
Director Server重新封装数据包,将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。
2.3DR模式
DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
2.3.1DR数据逻辑模型结构
-
用户发送请求到Director Server,请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。
-
由于DS和RS在同一个网络中,所以是通过二层数据链路层来传输。
-
内核空间判断数据包的目标IP是本机IP,此时IPVS比对数据包请求的服务是否为集群服务,若是,重新封装数据包,修改源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址,源IP地址与目标IP地址没有改变,然后将数据包发送给Real Server.
-
RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文,重新封装报文(源IP地址为VIP,目标IP为CIP),将响应报文通过lo接口传送给eth0网卡然后向外发出。
-
RS直接将响应报文传送到客户端。
2.4LVS的负载调度算法
最常用的有四种;轮询(rr)、加权轮询(wrr)、最少连接(lc)和加权最少连接(wlc)。
-
轮询(rr):将收到的访问请求按照顺序轮流调度到不同的服务器上,不管后端真实服务器的实际连接数和系统负载。
-
加权轮询(wrr):给RS设置权重,权重越高,那么分发的请求数越多,权重的取值范围0–100。根据每台服务器的性能,给每台服务器添加权值,如果RS1的权值为1,RS2的权值为2,那么调度到RS2的请求会是RS1的2倍。权值越高的服务器,处理的请求越多。这种算法是对rr算法的一种优化和补充。
-
最少连接(lc):根据后端RS的连接数来决定把请求分发给谁,比RS1连接数比RS2连接数少,那么请求就优先发给RS1。
-
加权最少连接(wlc):根据后端RS的权重和连接数来决定把请求分发给谁,权重较高,连接数少的RS会优先处理请求。
三、lvs部署命令介绍
3.1lvs软件相关信息
程序包:ipvsadm Unit File: ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvs调度规则文件:/etc/sysconfig/ipvsadm
3.2lvs集群中的增删改
参数 | 描述 |
---|---|
-a | 添加realserver |
-e | 更改realserver |
-t | tcp协议 |
-u | udp协议 |
-f | 火墙 标签 |
-r | realserver地址 |
-g | 直连路由模式 |
-i | ipip隧道模式 |
-m | nat模式 |
-w | 设定权重 |
-Z | 清空计数器 |
-C | 清空lvs策略 |
-L | 查看lvs策略 |
-n | 不做解析 |
--rate | 输出速率信息 |
四、nat模式
4.1实验环境中lvs主机的环境搭建
4.1.1调度器lVS的搭建和服务器RS的搭建
两台服务器RS网卡选择相同都是仅主机模式
4.1.2配置lvs主机IP
先写一个脚本以方便后续配置环境中使用 这是在配置过程中的vmset.sh
#!/bin/bash
rm -fr /etc/NetworkManager/system-connections/$1.nmconnection
cat > /etc/NetworkManager/system-connections/$1.nmconnection <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1
[ipv4]
address1=$2/24,172.25.254.2
method=manual
dns=114.114.114.114;
EOF
chmod 600 /etc/NetworkManager/system-connections/$1.nmconnection
nmcli connection reload
nmcli connection up $1
hostnamectl hostname $3
cat > /etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
$2 $3
EOF
配置网卡nat模式的IP为172.25.254.100并改主机名为lvs
vmset.sh eth0 172.25.254.100 lvs.timing.org
配置网卡仅主机模式的IP为192.168.0.100并改主机名为lvs
vmset.sh eth1 1192.168.0.100 lvs.timing.org
4.1.3配置完成后需要重启网卡
nmcli connection reload
nmcli connection up eth0
nmcli connection up eth1
4.1.4lvs打开内核路由功能
4.1.5配置RS主机IP
上图中的dns可删可不删
配置完成后两台服务器都需要重启生效
nmcli connection reload
nmcli connection up eth0
查看一下IP和网关是否正确
4.1.6安装web服务
配置完成后两台服务器(RS)我们都将安装web服务
yum install httpd -y
echo webserver1 - 192.168.0.10 > /var/www/html/index.html
systemctl enable --now httpdecho webserver2 - 192.168.0.20 > /var/www/html/index.html
systemctl enable --now httpd
配置完成后我们可以lvs主机上检测一下,如果在lvs上都访问不到两台服务器(RS)就别谈后面的调动了
4.1.7lvs安装中lvs软件
在lvs主机上安装所需软件ipvsadm
dnf install ipvsadm -y
安装完成后可以查看一下策略
ipvsadm -Ln
加策略以及查看策略
4.1.8测试
4.1.9保存
ipvsadm-save -n > /etc/sysconfig/ipvsadm
五、DR模式
5.1实验环境
在DR模式中需要5台主机
主机名 | IP | vip | 角色 |
---|---|---|---|
client | 172.25.254.200 | null | 测试主机 |
router | nat-eth0:172.25.254.100;仅主机-eth1:192.168.0.100 | null | 路由器 |
lvs | 192.168.0.50;GW:192.168.0.100 | 192.168.0.200/32 | 调度器 |
webserver1 | 192.168.0.10;GW:192.168.0.100 | 192.168.0.200/32 | web服务器1 |
webserver2 | 192.168.0.10;GW:192.168.0.100 | 192.168.0.200/32 | web服务器2 |
5.1.1lvs上的配置
5.1.2router上的配置
打开路由功能
5.1.3client上的配置
5.1.4webserver1上的配置
5.1.5webserver2上的配置
5.2解决VIP响应问题
DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1)在前端网关做静态绑定
(2)在各RS使用arptables
(3)在各RS修改内核参数,来限制arp响应和通告的级别
5.2.1限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应 1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
5.2.2限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告 1:尽量避免将接口信息向非直接连接网络进行通告 2:必须避免将接口信息向非本网络进行通告
在webserver1和webserver2中解决响应问题
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce这个代码正常情况下是需要写到 /etc/sysctl.conf里面去,但是可能后面有可能还会用到这台主机做实验,因此没有写进去
通过以上代码让VIP不对外响应,所以两台web服务器都要做限制响应
5.2.3在lvs,webserver1和webserver2上配置vip
[root@lvs ~]# ip a a 192.168.0.200/32 dev lo
[root@webserver1 ~]# ip a a 192.168.0.200/32 dev lo
[root@webserver2 ~]# ip a a 192.168.0.200/32 dev lo
5.2.4在lvs中配置策略
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
5.2.5最后在测试主机client上测试
for i in {1..10}
do
curl 192.168.0.200
done
六、防火墙标签解决轮询错误
6.1轮询规则中可能会遇到的错误
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出 现了一个轮询错乱的问题
6.1.1先在两台webserver服务器主机上安装mod_ssl模块,让RS支持https
[root@webserver1 ~]# yum install mod_ssl -y
[root@webserver2 ~]# yum install mod_ssl -y
安装完成后两台服务器都要重启apache
systemctl restart httpd
6.1.2可以过滤一下查看80和443端口是否都开着
6.1.3简单测试
如果由此用client主机去访问会出现轮询错误,会同时显示webserver1或者webserver2上面的内容,按照轮询规则访问时出现的一次Rs1主机上的内容一次Rs上的内容
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
6.2防火墙标记解决轮询调度问题
FWM:FireWall Mark
MARK target 可用于给特定的报文打标记, -
-set-mark value
其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服 务:可将多个不同的应用使用同一个集群服务进行调度
6.2.1在lvs主机上对端口进行标记
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
6.2.2在lvs上将所有策略全部刷新
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -Ln
6.2.3在lvs上重新添加策略防止调用时调用到同一端口
[root@lvs ~]# ipvsadm -A -f 66 -s rr
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.20 -g
6.2.4测试
最后在client主机上访问IP就不会出现调动同一端口的情况了
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
以上就是对lvs负载均衡的nat模式和DR模式以及防火墙轮询错的一个总结和解决方法