共计 5859 个字符,预计需要花费 15 分钟才能阅读完成。
本文由 LinuxProbe.Com 团队成员 烨子 整理发布,原文来自:许鼎。
1.lvs-nat 模型示意图
本次构建的 lvs-nat 模型的示意图如下,其中所有的服务器和测试客户端均使用 VMware 虚拟机模拟,所使用的 CentOS 7
VS 内核都支持 ipvs 功能,且安装 ipvsadm 控制书写 lvs 规则工具。
RS 端两台服务器为 httpd 服务器做请求的负载均衡。
注意:
1) 客户端可以使用 Windows 上的浏览器,会后缓存影响结果,所以采用 CentOS 上的 curl 命令请求 http 协议显示更加直观
2) DIP 上不能配置 iptables 规则
2.VS 网卡配置
(1)增加网卡
在 ” 虚拟机设置 ” 中增加一个网络适配器设备,并将其自定义特定网络为 VMnet2 模式,此处为了模拟负载均衡服务器的两张网卡处于不同网段
(2)配置 VS 两张网卡的 IP 地址
[root@localhost ~]# nmtui # CentOS 7 文本图形界面配置网卡命令
[root@localhost ~]# systemctl start network.service
注意:
网络适配器 1(172.16.249.57)模拟为外网网卡,网络适配器 2(192.168.100.1)模拟为内网,且该网卡的 Ip 地址要和 RS 服务器得 ip 在同一网段,DIP 作为 RIP 的网络调度(网关),无需配置 GATEWAY
[root@localhost~]# ifconfig
3.RS 网卡配置
此处使用两台 CentOS 7 虚拟机作为负载均衡后端真实响应主机,安装 RPM 包格式 httpd 服务,并启动服务。nmtui 命令配置网卡信息,RS1 的 IP:192.168.100.2,RS2 的 IP:192.168.100.3,RIP 和 DIP 在同一网段,虚拟机网卡和 DIP 同时匹配值为 VMnet2 模式,且两台 RS 服务器主机网关指向 DIP:192.168.100.1
[root@localhost~]# yum install -y httpd
[root@localhost ~]# systemctl start httpd.service
注意:安装完成后在各 httpd 服务器上配置测试页面,/var/www/html/index.html.
[root@localhost ~]# nmtui # 配置方法同上,此处省略
… ...
[root@localhost ~]# systemctl start network.service
[root@localhost~]# ifconfig
4. 测试所有主机是否能够通信
用 ping 命令测试各节点的通信,例如 RIP1 和 VIP、DIP、RIP2 之间是否能够通信
[root@localhost ~]# ping IPADDR
5.VS 主机:核心转发和安装 ipvsadm
(1)安装 ipvsadm 组件
[root@localhost ~]# yum install -y ipvsadm
(2)启动网卡间核心转发功能
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
[root@localhost~]# cat /proc/sys/net/ipv4/ip_forward
6.VS 主机:定义配置 lvs-nat 服务(此处采用 rr 算法)
(1)定义 ipvsadm 负载均衡集群规则,并查看
此处定义 DIP 是以 - s 指定为 rr 算法进行轮询调度,- m 指定模式为 lvs-nat,配置命令如下:
[root@localhost~]# ipvsadm -A -t 172.16.249.57:80 -s rr
[root@localhost~]# ipvsadm -a -t 172.16.249.57:80 -r 192.168.100.2:80 -m
[root@localhost~]# ipvsadm -a -t 172.16.249.57:80 -r 192.168.100.3:80 -m
[root@localhost~]# ipvsadm -L -n
(2)Client 客户机测试
在客户端主机上使用 curl 命令对 VIP 发起请求,负载均衡服务器会将请求按照 rr 算法依次将请求调度给不同的主机进行处理,依次请求给分发给 192.168.100.2 和 192.168.100.3 主机响应。
[root@localhost~]# curl http://172.16.249.57
7.VS 主机:定义配置 lvs-nat 服务(此处采用 wrr 算法)
(1)定义 ipvsadm 负载均衡集群规则,并查看
此处将在上面 lvs-nat 的 rr 的基础上进行修改,改成 wrr 加权轮询算法;将 192.168.100.2 的权重设置为 1,192.168.100.3 的权重设置为 3。
[root@localhost~]# ipvsadm -E -t 172.16.249.57:80 -s wrr
[root@localhost~]# ipvsadm -e -t 172.16.249.57:80 -r 192.168.100.2 -w 1 -m
[root@localhost~]# ipvsadm -e -t 172.16.249.57:80 -r 192.168.100.3 -w 1 -m
[root@localhost~]# ipvsadm -L -n
(2)Client 客户机测试
在客户端主机用 curl 发起请求,负载均衡主机 VS 会将其按照权重大小转发给各个主机,四个请求有三个发给了 192.168.100.3 请求响应,一个发给了 192.168.100.2 主机处理。并以此算法做轮询负载请求
[root@localhost~]# curl http://172.16.249.57
1.lvs-dr 模型示意图
三台主机为虚拟机 CentOS 7,每台主机仅有一块网卡,且使用桥接方式都指向外部网络的网关 172.16.100.1
2. 配置 VS 和 RS 服务器的 VIP
此处的 VIP 均已别名的形式配置在往卡上,VS 是配置在对外通信的 DIP 的网卡上;RS 配置在 lo 本地回环网卡
注意:此时配置的 VIP 的子网掩码必须为 255.255.255.255,广播地址为自己本身
VS:[root@localhost~]# ifconfig eno16777736:0 172.16.50.50 netmask 255.255.255.255 broadcast172.16.50.50 up
RS:[root@localhost~]# ifconfig lo:0 172.16.50.50 netmask 255.255.255.255broadcast 172.16.50.50 up
3.RS 服务器上配置路由
[root@localhost~]# route add -host 172.16.50.50 dev lo:0
4.RS 服务器配置 APR 内核参数修改
[root@localhost~]# ll /proc/sys/net/ipv4/conf
(1)ARP 响应行为和 ARP 解析行为内核参数:
1)arp_annouce 定义通告级别
0:默认级别,将本地的任何接口上的配置的地址都在网络中通告
1:尽量避免向本主机上的其他网卡进行网络通信,特殊情况下其他接口也可以
2:总是使用最佳网络地址接口(仅使用定义的网卡接口在同网络通信)
2)arp_ignore 定义响应级别(0- 8 九个级别),响应时忽略方式
0:都全都响应
1:只对从本接口进入的请求响应,且本接口地址是个网络地址
… …
注释:一般使用 arp_annouce=2,arp_ignore=1
(2)配置各 RS 主机参数
注意:all 必须配置、eno16777736(本地)和 lo 两个可以同时全部配置或者配置其中一个
RealServer 内核参数:
#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#echo 1 > /proc/sys/net/ipv4/conf/INTERFACE/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/INTERFACE/arp_announce
注意:INTERFACE 为你的物理接口;此处网卡接口指的是 eno16777736 和 lo
5.VS 主机:定义配置 lvs-dr 模式(此处采用 rr 算法)
(1)配置查看
[root@localhost~]# ipvsadm -A -t 172.16.50.50:80 -s rr
[root@localhost~]# ipvsadm -a -t 172.16.50.50:80 -r 172.16.200.10 -g
[root@localhost~]# ipvsadm -a -t 172.16.50.50:80 -r 172.16.200.11 -g
[root@localhost~]# ipvsadm -L -n
(2)测试
[root@localhost~]# curl http://172.16.50.50
因为基于 rr 算法调度,依次分发给 RS 主机
1.FWM 防火墙标记功能
防火墙标记可以实现多个集群服务绑定为同一个,实现统一调度;将共享一组 RS 的集群服务统一进行定义
FWM 基于 iptables 的 mangle 表实现防护墙标记功能,定义标记做策略路由
2.FWM 定义集群的方式
(1)在 director 上 netfilter 的 mangle 表的 PREROUTING 定义用于 ” 打标 ” 的规则
[root@localhost~]#iptables -t mangle -A PREROUTING -d $vip -p $protocol --dport $port -j MARK--set-mark #
$vip:VIP 地址
$protocol:协议
$port: 协议端口
(2)基于 FWM 定义集群服务:
[root@localhost~]#ipvsadm -A -f # -s scheduler
3. 实例演示
[root@localhost~]# iptables -t mangle -A PREROUTING -d 172.16.50.50 -p tcp --dport 80 -j MARK--set-mark 5
[root@localhost~]# ipvsadm -A -f 5 -s rr
[root@localhost~]# ipvsadm -a -f 5 -r 172.16.200.10 -g
[root@localhost~]# ipvsadm -a -f 5 -r 172.16.200.11 -g
1.lvs persistence 功能
无论 ipvs 使用何种 scheduler,其都能够实现在指定时间范围内始终将来自同一个 ip 地址的请求发往同一个 RS;实现方式和 lvs 调度的十种算法无关,通过 lvs 持久连接模板 (hash 表) 实现,当超过自定义的可持节连接时长候再根据 LVS 算法本身进行调度。
ipvsadm 命令中 - p 选项实现,在 - p 后不指定具体数字(单位: 秒),默认为 300,到时候会自动延长 2 分钟,对于 web 本身就是 15 秒
2. 模式
(1)每端口持久(PPC)
客户端对同一服务端口发起请求,会基于该服务的端口实现请求在一段时间内对同一 RS 服务器持久连接;
例如:有两台主机做为 RS 服务器做 http 和 hssh 的两种服务的集群,仅 http 做每端口持久,Client 请求会实现绑定在,但是 22 号端口请求不会绑定在同一台 RS
(2)每客户端持久 (PCC): 定义 tcp 或 udp 协议的 0 号端口为集群服务端口
director 会将用户的任何请求都识别为集群服务,并向 RS 进行调度;同一客户端的请求任何端口都发往同一台第一次选定的 RS 服务器
(3)每防火墙标记持久(PFWMC)
将两个或两个以上服务通过防火墙打标绑定在一起,这些服务的请求实现同时定向与同一台 RS 服务器,服务绑定同一 RS
实例:
lvs-dr 模式下以 rr 算法绑定 http 和 https 服务
[root@localhost~]# iptables -t mangle -A PREROUTING -d 172.16.100.9 -p tcp --dport 80 -j MARK--set-mark 99
[root@localhost~]# iptables -t mangle -A PREROUTING -d 172.16.100.9 -p tcp --dport 443 -j MARK--set-mark 99
[root@localhost~]# ipvsadm -A -f 99 -s rr -p
[root@localhost~]# ipvsadm -a -f 99 -r 172.16.100.68 -g
[root@localhost~]# ipvsadm -a -f 99 -r 172.16.100.69 -g
#!/bin/bash
#
vip=172.16.50.50
interface="lo:0"
case$1 in
start)
echo1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig$interface $vip broadcast $vip netmask 255.255.255.255 up
routeadd -host $vip dev $interface
;;
stop)
echo0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo0 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig$interface down
;;
status)
ififconfig lo:0 |grep $vip &> /dev/null; then
echo"ipvs is running."
else
echo"ipvs is stopped."
fi
;;
*)
echo"Usage: `basename $0` {start|stop|status}"
exit1
esac
![post-qrcode](https://www.xgss.net/wp-content/uploads/2023/07/二维码-微信公众号256x256.jpg)