目录
- NAT模式下的lvs集群
- 准备工作
- 具体步骤
- 客户机
- lvs
- 服务器1
- 服务器2
- 测试
- DR模式下的lvs集群
- 具体流程
- 客户机:
- 路由器
- LVS
- 服务器1
- 服务器2
- 测试
- 防火墙标签解决轮询问题
- LVS持久链接
- 解决方案
NAT模式下的lvs集群
lvs-nat概念:修改请求报文的目标IP,多目标IP的DNAT,本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
最终实现效果:
1.Director 服务器采用双网卡,一个是桥接网卡连接外网,一个是仅主机网卡与后端Web服务器相连
2.Web服务器采用仅主机网卡与director相连
3.Web服务器网关指向192.168.0.100
4.后端web服务器不需要连接外网
准备工作
工作前提准备:
- VMware的网卡设置:一个网卡设置仅主机模式,网段为192.168.0.0/24 另一个网卡设置仅主机模式,网段为172.25.254.0/24
- 准备四台环境干净的虚拟机
- 防火墙及其selinux都处于关闭状态
流程原理图:
具体步骤
客户机
IP:172.25.254.200/24gateway:172.25.254.100
lvs
[root@lvs1 ~]# vmset.sh eth0 172.25.254.100 lvs1
[root@lvs1 ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@lvs1 ~]# vmset.sh eth1 192.168.0.100 lvs
[root@lvs1 ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
[root@lvs1 ~]# nmcli connection reload
[root@lvs1 ~]# nmcli connection up eth1
lvs中打开内核路由
[root@lvs1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@lvs1 ~]# sysctl -p
安装lvs软件
[root@lvs1 ~]# dnf install ipvsadm -y
编写策略
[root@lvs1 ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs1 ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs1 ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
# 查看
[root@lvs1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 rr-> 192.168.0.10:80 Masq 1 0 0 -> 192.168.0.20:80 Masq 1 0 0
服务器1
[root@webserver ~]# vmset.sh eth0 192.168.0.10 webserver
[root@webserver ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@webserver ~]# nmcli connection reload
[root@webserver ~]# nmcli connection up eth0
修改网关
安装web服务:
[root@webserver ~]# yum install httpd -y
[root@webserver ~]# echo webserver 192.168.0.10 > /var/www/html/index.html
[root@webserver ~]# systemctl enable --now httpd
服务器2
[root@webserver2 ~]# vmset.sh eth0 192.168.0.20 webserver2
[root@webserver2 ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@webserver2 ~]# nmcli connection reload
[root@webserver2 ~]# nmcli connection up eth0
修改网关
安装web服务:
[root@webserver2 ~]# yum install httpd -y
[root@webserver2 ~]# echo webserver 192.168.0.10 > /var/www/html/index.html
[root@webserver2 ~]# systemctl enable --now httpd
测试
在客户机上测试
DR模式下的lvs集群
DR模式:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行
转发
源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;
源IP/PORT,以及目标IP/PORT均保持不变
流程原理图:
具体流程
客户机:
IP:172.25.254.200/24gateway:172.25.254.100
路由器
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;
EOFchmod 600 /etc/NetworkManager/system-connections/$1.nmconnection
nmcli connection reload
nmcli connection up $1hostnamectl hostname $3cat > /etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
$2 $3
EOF
[root@route ~]# vmset.sh eth0 172.25.254.100 route
[root@route ~]# vmset.sh eth1 192.168.0.100 route
[root@route ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
[root@route ~]# nmcli connection reload
[root@route ~]# nmcli connection up eth1
因脚本问题,修改eth1的网卡配置
打开内核路由功能
[root@route ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@route ~]# sysctl -p
LVS
[root@lvs1 ~]# vmset.sh eth1 192.168.0.50 lvs
[root@lvs1 ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
[root@lvs1 ~]# nmcli connection reload
[root@lvs1 ~]# nmcli connection up eth1
添加vip,采用环回,注意环回的掩码需要使用32位
[root@lvs1 ~]# ip a a 192.168.0.200/32 dev lo
安装lvs软件
[root@lvs1 ~]# dnf install ipvsadm -y
编写策略
[root@lvs1 ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@lvs1 ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -m
[root@lvs1 ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -m
服务器1
[root@webserver ~]# vmset.sh eth0 192.168.0.10 webserver
[root@webserver ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@webserver ~]# nmcli connection reload
[root@webserver ~]# nmcli connection up eth0
修改网关
安装web服务:
[root@webserver ~]# yum install httpd -y
[root@webserver ~]# echo webserver 192.168.0.10 > /var/www/html/index.html
[root@webserver ~]# systemctl enable --now httpd
修改rip,使RS主机VIP不对外响应
[root@webserver ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore[root@webserver ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
添加vip,采用环回,注意环回的掩码需要使用32位
[root@webserver ~]# ip a a 192.168.0.200/32 dev lo
安装web服务:
[root@webserver ~]# yum install httpd -y
[root@webserver ~]# echo webserver 192.168.0.10 > /var/www/html/index.html
[root@webserver ~]# systemctl enable --now httpd
服务器2
[root@webserver2 ~]# vmset.sh eth0 192.168.0.20 webserver2
[root@webserver2 ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@webserver2 ~]# nmcli connection reload
[root@webserver2 ~]# nmcli connection up eth0
修改网关
修改rip,使RS主机VIP不对外响应
[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/all/arp_announce
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
添加vip,采用环回,注意环回的掩码需要使用32位
[root@webserver2 ~]# ip a a 192.168.0.200/32 dev lo
安装web服务:
[root@webserver2 ~]# yum install httpd -y
[root@webserver2 ~]# echo webserver2 192.168.0.20 > /var/www/html/index.html
[root@webserver2 ~]# systemctl enable --now httpd
测试
在客户机上进行测试
[root@client ~]# for i in {1..10}
> do
> curl 192.168.0.200
> done
werbserver2 192.168.0.20
webserver 192.268.0.10
werbserver2 192.168.0.20
werbserver2 192.168.0.20
webserver 192.268.0.10
werbserver2 192.168.0.20
werbserver2 192.168.0.20
webserver 192.268.0.10
werbserver2 192.168.0.20
werbserver2 192.168.0.20
[root@client ~]#
防火墙标签解决轮询问题
轮询中可能遇到的问题:
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出
现了一个轮询错乱的问题
当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上
MARK target (可用于给特定的报文打标记,) --set-mark value
打标记语法: iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $portl,$port2,..-i MARK --set-mark NUMBER
基于标记定义服务的语法: ipvsadm -A -f NUMBER [options]
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.100 -p tcp -m multiport --dports
80,443 -j MARK --set-mark 66[root@lvs ~]# ipvsadm -A -f 66 -s rr
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.101 -g
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.102 -g
测试结果:
[root@node10 ~]# curl -k https://192.168.0.100webserver1 - 192.168.0.10
[root@node10 ~]# curl -k https://192.168.0.100;curl 192.168.0.100webserver1 - 192.168.0.10webserver2 - 192.168.0.20
LVS持久链接
我们使用客户机上网的时候,有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们使用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡,为了解决这一问题,我们设置持久链接来解决
解决方案
- 在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上
- 如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台RS上。
- 如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上
语法格式:ipvsadm -AlE -tlulf service-address [-s scheduler] [-p [timeout]] 默认360秒
# 在lvs调度器中设定
[root@lvs ~]# ipvsadm -E -f 6666 -s rr -p [3000]