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秒之前时将实现会话粘滞
相关推荐
乘云数字DATABUFF2 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--4 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森4 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜4 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB5 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode7 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220707 天前
如何搭建本地yum源(上)
运维
大树8810 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠10 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质10 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务