LVS高性能、高可用的负载均衡集群技术实验

一、部署NAT模式集群案例

1.1 nat模式的简介

1.1.1 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发

1.1.2 RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP

1.1.3 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈

1.1.4 支持端口映射,可修改请求报文的目标PORT

1.1.5 VS必须是Linux系统,RS可以是任意OS系统

1.2 配置要求

1.2.1 Director 服务器采用双网卡,一个是桥接网卡连接外网,一个是仅主机网卡与后端Web服务器相连

1.2.2 Web服务器采用仅主机网卡与director相连

1.2.3 Web服务器网关指向192.168.248.100

1.2.4 后端web服务器不需要连接外网

1.3 实验环境

主机名 ip 角色
VS NAT:192.168.198.100 host-only:192.168.248.100 调度器(VS)
RS1 host-only:192.168.248.10,WG192.168.248.100 真实服务器(RS)
RS2 host-only:192.168.248.20,GW 192.168.248.100 真实服务器(RS)

1.3.1 如图所示,已经搭建的VS

1.3.2 如图所示,已经搭建的RS1

1.3.3 如图所示,已经搭建的RS2

1.3.4 在两台服务器上设置业务真实数据

VS
bash 复制代码
[root@RS1 ~]# dnf install ipvsadm -y
[root@RS1 ~]# systemctl enable --now ipvsadm
RS1
bash 复制代码
[root@RS1 ~]# dnf install httpd -y
[root@RS1 ~]# systemctl enable --now httpd
[root@RS1 ~]# echo RS2 - 192.168.248.10 > /var/www/html/index.html
RS2
bash 复制代码
[root@RS2 ~]# dnf install httpd -y
[root@RS2 ~]# systemctl enable --now httpd
[root@RS2 ~]# echo RS2 - 192.168.248.20 > /var/www/html/index.html

--注意因为RS1和RS2因为网关指向内网无法与外网互通,不能下载资源,所以我们需在VS上开启内核路由功能

临时开启(重启失效) echo 1 > /proc/sys/net/ipv4/ip_forward

永久开启(需重启网络或系统) echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

两者任选其一即可

对从VS的eth0网卡发出的数据包进行IP伪装,现 Linux 服务器的 NAT 转发(路由器功能),让内网设备可以通过这台服务器的公网 IP 访问互联网。

#iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

验证能VS否正常访问两台服务器上的业务

1.4 NAT模式的实现方法

1.4.1 开启VS内核路由功能

bash 复制代码
[root@VS ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@VS ~]# sysctl  -p
net.ipv4.ip_forward = 1

1.4.2 VS上的编写策略

bash 复制代码
[root@VS ~]# ipvsadm -C
[root@VS ~]# ipvsadm -A -t 192.168.198.100:80 -s wrr
[root@VS ~]# ipvsadm -a -t 192.168.198.100:80 -r 192.168.248.10:80 -m  -w 1
[root@VS ~]# ipvsadm -a -t 192.168.198.100:80 -r 192.168.248.20:80 -m  -w 1
[root@VS ~]# ipvsadm -Ln[root@VS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.198.100:80 wrr
  -> 192.168.248.10:80            Masq    1      0          0
  -> 192.168.248.20:80            Masq    1      0          0
测试

1.4.3 更改权重

根据实际情况,可以让性能好的机器比性能差的机器多做一些工作

bash 复制代码
[root@VS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.198.100:80 wrr
  -> 192.168.248.10:80            Masq    1      0          0
  -> 192.168.248.20:80            Masq    1      0          0
[root@VS ~]# ipvsadm -e -t 192.168.198.100:80 -r 192.168.248.20:80 -m -w 2 
#更改RS2的权重为2,RS1的权重为1保持不变
[root@VS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.198.100:80 wrr
  -> 192.168.248.10:80            Masq    1      0          0
  -> 192.168.248.20:80            Masq    2      0          0
测试

1.4.4 ipvsadm规则持久化

利用自定义文件实现规则持久化
bash 复制代码
[root@VS ~]# ipvsadm-save -n > /mnt/ipvs.rule
[root@VS ~]# ipvsadm -C
[root@VS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@VS ~]# ipvsadm-restore < /mnt/ipvs.rule
[root@VS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.198.100:80 wrr
  -> 192.168.248.10:80            Masq    1      0          0
  -> 192.168.248.20:80            Masq    2      0          0
利用守护进程进行规则持久化
bash 复制代码
[root@VS ~]# ipvsadm -C
[root@VS ~]# ipvsadm-restore < /mnt/ipvs.rule
[root@VS ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
[root@VS ~]# systemctl enable --now ipvsadm.service
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
[root@VS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.198.100:80 wrr
  -> 192.168.248.10:80            Masq    1      0          0
  -> 192.168.248.20:80            Masq    2      0          0

二、 部署DR模式集群案例

2.1 DR模式简介

直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。

2.2 配置要求

2.2.1 Director服务器采用双IP桥接网络,一个是VPP,一个DIP

2.2.2Web服务器采用和DIP相同的网段和Director连接

2.2.3每个Web服务器配置VIP

2.2.4每个web服务器可以出外网

2.3 实验环境

| 主机名 | ip | 角色 |
| VS | lo:(vip):192.168.248.200,host-only(dip):192.168.248.50 | 调度器(VS) |
| RS1 | host-only:192.168.248.10,WG192.168.248.100,lo:192.168.248.200 | 真实服务器(RS) |
| RS2 | host-only:192.168.248.20,GW 192.168.248.100,lo:192.168.248.200 | 真实服务器(RS) |
| route | NAT:192.168.198.100 host-only:192.168.248.100 | 路由器(route) |

client NAT:192.168.198.10 GW:192.168.198.100 客户端 (client)

2.3.1 搭建VS的vip和dip

vip

bash 复制代码
[root@VS ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
method=manual
address=192.168.248.50/24,192.168.248.100
[root@VS ~]# nmcli connection reload
[root@VS ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/9)

dip

bash 复制代码
[root@VS ~]# cp -p /etc/NetworkManager/system-connections/eth0.nmconnection /etc/NetworkManager/system-connections/lo.nmconnection

[root@VS ~]# cat /etc/NetworkManager/system-connections/lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo

[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.248.200/32

[root@VS ~]# nmcli connection reload
[root@VS ~]# nmcli connection up lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/29)

2.3.2 在RS1的lo上搭建dip

bash 复制代码
[root@RS1 ~]# cp -p /etc/NetworkManager/system-connections/eth0.nmconnection  /etc/NetworkManager/system-connections/lo.nmconnection
[root@RS1 ~]# cat /etc/NetworkManager/system-connections/lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo

[ethernet]

[ipv4]
address1=127.0.0.1/8
address2=192.168.248.200/32
method=manual

[root@RS1 ~]# nmcli connection reload
[root@RS1 ~]# nmcli connection up lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)

因为VS,RS1和RS2配置同一个VIP,抑制ARP相应以免发生ARP 冲突和流量劫持状况。

bash 复制代码
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

2.3.3 在RS2的lo上搭建dip

bash 复制代码
[root@RS2 ~]# cp -p /etc/NetworkManager/system-connections/eth0.nmconnection /etc/NetworkManager/system-connections/lo.nmconnection

[root@RS2 ~]# cat /etc/NetworkManager/system-connections/lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo

[ethernet]

[ipv4]
address1=127.0.0.1/8
address2=192.168.248.200/32
method=manual

[root@RS2 ~]# nmcli connection reload
[root@RS2 ~]# nmcli connection up lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)

因为VS,RS1和RS2配置同一个VIP,抑制ARP相应以免发生ARP 冲突和流量劫持状况。

bash 复制代码
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

2.3.4 route ip配置

--注意因为RS1和RS2因为网关指向内网无法与外网互通,不能下载资源,所以我们需在VS上开启内核路由功能

临时开启(重启失效) echo 1 > /proc/sys/net/ipv4/ip_forward

永久开启(需重启网络或系统) echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

两者任选其一即可

对从VS的eth0网卡发出的数据包进行IP伪装,现 Linux 服务器的 NAT 转发(路由器功能),让内网设备可以通过这台服务器的公网 IP 访问互联网。

#iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

2.3.5 客户端配置

2.4 VS上的编写策略及测试

bash 复制代码
[root@VS ~]# ipvsadm -A -t 192.168.248.200:80 -s wrr
[root@VS ~]# ipvsadm -a -t 192.168.248.200:80 -r 192.168.248.10:80 -g
[root@VS ~]# ipvsadm -a -t 192.168.248.200:80 -r 192.168.248.20:80 -g

[root@VS ~]# ipvsadm-save -n
-A -t 192.168.248.200:80 -s wrr
-a -t 192.168.248.200:80 -r 192.168.248.10:80 -g -w 1
-a -t 192.168.248.200:80 -r 192.168.248.20:80 -g -w 1
在客户端上测试

三、 防火墙标签解决轮询错误

3.1 概念

以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题;当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上。

3.2 问题呈现

在RS1和RS2上下寨mod_ssl并重启httpd

bash 复制代码
[root@RS1 ~]# dnf install mod_ssl -y
[root@RS1 ~]# systemctl restart httpd

[root@RS2 ~]# dnf install mod_ssl -y
[root@RS2 ~]# systemctl restart httpd

给VS调度器添加ipvsadm策略如tu所示

当访问vip时两次调度都到了20

3.3 防火墙标记解决轮询调度问题

3.3.1 解决方案:使用火墙标记访问vip的80和443的所有数据包,设定标记为6666,然后对此标记进行负载

在VS中添加https的轮询策略
bash 复制代码
[root@VS ~]# iptables -t mangle -A PREROUTING -d 192.168.248.200 -p tcp -m multiport --d
ports 80,443 -j MARK --set-mark 6666
[root@VS ~]# ipvsadm -A -f 6666 -s rr

[root@VS ~]# ipvsadm -a -f 6666 -r 192.168.248.10 -g
[root@VS ~]# ipvsadm -a -f 6666 -r 192.168.248.20 -g
[root@VS ~]# ipvsadm-save -n
-A -f 6666 -s rr
-a -f 6666 -r 192.168.248.10:0 -g -w 1
-a -f 6666 -r 192.168.248.20:0 -g -w 1
在客户端上测试

四、利用持久连接实现会话粘滞(该实验建立在防火墙标签实验环境的基础上)

4.1 解决的问题

在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡

4.2 解决方案

在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上,如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台RS上。如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上

4.3 VS的ipvsadm策略编写

复制代码
[root@VS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@VS ~]# ipvsadm -A -f 6666 -s rr -p 20
[root@VS ~]# ipvsadm -a -f 6666 -r 192.168.248.20:0 -g
[root@VS ~]# ipvsadm -a -f 6666 -r 192.168.248.10:0 -g
[root@VS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  6666 rr persistent 20
  -> 192.168.248.10:0             Route   1      0          0
  -> 192.168.248.20:0             Route   1      0          0
测试;使用客户机访问vip在超时连接断开20秒后再次访问变成另一台服务器,未超时断开链接20秒之前时将实现会话粘滞
相关推荐
ZKNOW甄知科技38 分钟前
深度对标ServiceNow:燕千云如何破解企业全球化运维难题?
大数据·运维·人工智能·科技·ai·自动化·运维开发
进击切图仔1 小时前
ROS 跨机通信与 Docker 多机环境搭建
运维·docker·容器
主角1 71 小时前
Nginx核心功能
运维·nginx
cyber_两只龙宝1 小时前
【MySQL】MySQL主从复制架构
linux·运维·数据库·mysql·云原生·架构
i建模2 小时前
在 Windows CMD 中将当前路径永久添加到系统环境变量
运维·windows
虚拟世界AI2 小时前
Linux运维实战:从部署到高可用全指南
linux·运维
闫记康2 小时前
scp工具
linux·运维·服务器·学习·ssh·github
虾..2 小时前
Linux 套接字编程---基于UDP协议实现简易的聊天室
linux·运维·udp
默|笙2 小时前
【Linux】库制作与原理(2)_ELF格式
linux·运维·服务器
青桔柠薯片2 小时前
Linux I/O多路复用:深入浅出poll与epoll
linux·运维·服务器·算法