可能是全网最详细LVS讲解和实验教程,快来收藏

LVS(Linux virtual server)

一.实验环境

主机名角色
server1调度器(VS)
server2真实服务器1(RS)
server3真实服务器2(RS)
server4测试机

实验系统为rhel9.2

二.集群和分布式

1.系统性能扩展

a.向上扩展,既增强单个服务器性能,但是有物理上限

b.向外扩展,既增加设备数量,调度分配问题,Cluster集群,无上限,可以集群n台设备

2.集群Cluster

Cluster:集群为了解决某些问题将多台计算机组合形成的单个系统

一般分为3种

LB:负载均衡,单一主机只承担部分访问,降低单一服务器的负载压力

HA:高可用(High Availability),A为平均无故障时间和总运行时间和的比值

HPC:高性能计算机

3.分布式

分布式:一个业务被拆分为多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务

分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率,

三.lvs运行原理

1.简介

LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩,阿里的四层SLB(Server LoadBalance)是基于LVS+keepalived实现

lvs官网:The Linux Virtual Server Project - Linux Server Cluster for Load Balancing

2.lvs集群体系结构

3.LVS概念

VS:Virtual Server

RS:Real Server

CIP:Client IP

VIP:Virtual serverIP VS外网的IP

DIP:Director IP VS内网的IP

RIP:Real Server IP

4.LVS类型

lvs-nat:修改请求报文的目标IP,多目标IP的DNAT

lvs-dr:操纵封装新的MAC地址

lvs-tun:在原请求IP报文之外新加一个IP首部

lvs-fullnat:修改请求报文的源和目标IP

a.nat模式

lvs-nat:

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

RIP和DIP应在同一个网段,使用私网IP;RS网关是DIP

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

请求和响应都由Director转发,容易形成系统瓶颈

nat模式数据逻辑

1.客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口(9000port)

2.VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口

3.RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口(9000port)

4.VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)

5.VS服务器把修改过报文的响应数据包回传给客户端

6.lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞

注意在后面的实验中要清除掉全部的防火墙策略,不然会受到干扰导致实验失败

lvs的nat模式实验操作

实验设备结构

我们一共需要四台虚拟机,分别是一台lvs调度机,一台客户机,两台服务器

配置命令
1. 在lvs 中启用内核路由功能
echo"net.ipv4.ip_forward=1">/etc/sysctl.d/ip_forward.conf 
sysctl--system

2.lvs上安装ipvsamd,并开启服务

yum install ipvsadm -y
systemctl enable --now ipvsadm.service

3.给每一台虚拟机配好ip,这里客户机的ip模式为nat,lvs的VIP为nat模式,dip为host-only模式,两台rs虚拟机的rip均为host-only模式.

我为大家提供一个脚本,可以快速方便的为新加的网卡加入配置

#!/bin/bash
rm -rf /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.255
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

$1代表的是新网卡的名称,$2代表新网卡的IP,$3代表主机的新名称.在bin目录下创建一个.sh后缀的文件然后复制粘贴进去.wq保存退出以后

chmod +x /bin/文件名称
文件名称 ens36 192.168.1.2 hostname #示例,具体怎么写看自己的虚拟机

完成以后使用ip a s查看网卡是否成功启用,有设定的ip说明成功,然后和网段内其他ip互相ping看看是否互通,由于lvs比较特殊,两个ip所在端口都是网关,所以在使用脚本以后需要手动删除网关

vim /etc/NetworkManager/system-connections/ens33.nmconnection
vim /etc/NetworkManager/system-connections/ens36.nmconnection

进去之后把ip后面的删掉就好,出来以后nmcli重新启用网卡即可

4.在lvs中加入策略

ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m

5.查看lvs策略

ipvsadm -Ln

此为两个权重相同的轮询调度策略

我们可以用客户机来测试lvs轮询的效果

6.在real server上部署apache的httpd

yum intsall httpd -y
systecmctl enable --now httpd
echo webserver1 192.168.0.10 > var/www/html/index.html    #在rs1上
echo webserver2 192.168.0.20 > var/www/html/index.html    #在rs2上

7.在客户端上curl172.25.254.100

for N in {1..10};do curl 172.25.254.100;done

8.修改策略的权重

ipvsadm -E -t 172.25.254.100:80 -s wrr
ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2
ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1

再利用curl来测试结果,我们发现每调度web1两次,就调度一次web2

9.保存策略

ipvsadm -Sn

10.删除策略

ipvsadm -C                #删除所有策略
ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.10:80    #删除单一策略

11.重新加载策略

ipvsadm -R < /etc/sysconfig/ipvsadm-config
ipvsadm -Ln

b.DR 模式
DR Direct Routing ,直接路由, LVS 默认模式 , 应用最广泛 , 通过为请求报文重新封装一个 MAC 首部进行转发,源MAC DIP 所在的接口的 MAC ,目标 MAC 是某挑选出的 RS RIP 所在接口的 MAC 地址;源 IP/PORT,以及目标 IP/PORT 均保持不变
DR模式数逻辑
DR 模式中, RS 接收到访问请求后 直接把回传数据发送给 client ,所以 RS vs上都要有vip,实际上就是大家共用一个对外的ip,而这个ip不再像是nat一样只存在于nat协议路由器.
1. 客户端发送数据帧给 vs 调度主机帧中内容为客户端 IP+ 客户端的 MAC+VIP+VIP MAC
2.VS 调度主机接收到数据帧后把帧中的 VIP MAC 该为 RS1 MAC ,此时帧中的数据为客户端 IP+ 客户端
MAC+VIP+RS1 MAC
3.RS1 得到 2 中的数据包做出响应回传数据包,数据包中的内容为 VIP+RS1 MAC+ 客户端 IP+ 客户端 IP
MAC
DR 模式的特点
1.Director 和各 RS 都配置有 VIP
2. 确保前端路由器将目标 IP VIP 的请求报文发往 Director
3. 在前端网关做静态绑定 VIP Director MAC 地址
4.RS RIP 可以使用私网地址,也可以是公网地址; RIP DIP 在同一 IP 网络;
5.RIP 的网关不能指向 DIP ,以确保响应报文不会经由 Director
6.RS Director 要在同一个物理网络
7. 请求报文要经由 Director ,但响应报文不经由 Director ,而由 RS 直接发往 Client
8. 不支持端口映射(端口不能修改)

LVS的dr模式实验操作

实验设备结构
配置命令
1.rs主机中使vip不对外响应

两台real server都需要做这个配置,如果你还没有删除刚才的配置,做完这一步你会发现刚才的curl172.25.254.100已经无法连接上了

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

2.给所有网卡配好配置,这里三台内网虚拟机的网关都是192.168.0.100,客户机网关为172.25.254.100.

客户端主机为nat模式

router的ens33(172.25.254.0)为nat模式,ens37(192.168.0.0)为host-only模式

三台内网的模式均为host-only

用脚本的时候注意辣,千万记得改网关
3.在lvs和webserver上设定vip
[root@lvs ~]# ip addr add dev lo 192.168.0.50/32
[root@webserver1 ~]# ip addr add dev lo 192.168.0.50/32
[root@webserver2 ~]# ip addr add dev lo 192.168.0.50/32

可以ip a s看一下,应为下图的状态就是正确的

lo中有一个子网掩码为32的192.168.0.50
4.配置策略
ipvsadm -A -t 192.168.0.50:80 -s wrr
ipvsadm -a -t 192.168.0.50:80 -r 192.168.0.10:80 -g
ipvsadm -a -t 192.168.0.50:80 -r 192.168.0.20:80 -g
ipvsadm -Ln

此处的lvs.sh是我自己编的脚本,和上面四个命令敲完效果相同
5.测试策略
for N in {1..10};do curl 192.168.0.50;done

记得在测试过程中关闭防火墙,避免出现命令不好使的问题
TUN 模式(了解)
转发方式:不修改请求报文的 IP 首部(源 IP CIP ,目标 IP VIP ),而在原 IP 报文之外再封装一个 IP 首部(源IP DIP ,目标 IP RIP ),将报文发往挑选出的目标 RS RS 直接响应给客户端(源 IP VIP ,目标 IP是CIP
fullnet 模式(了解)
fullnat :通过同时修改请求报文的源 IP 地址和目标 IP 地址进行转发
CIP --> DIP
VIP --> RIP
1.VIP 是公网地址, RIP DIP 是私网地址,且通常不在同一 IP 网络;因此, RIP 的网关一般不会指向 DIP
2.RS 收到的请求报文源地址是 DIP ,因此,只需响应给 DIP ;但 Director 还要将其发往 Client
3. 请求和响应报文都经由 Director
4. 支持端口映射

5.lvs的调度算法

1.lvs 调度算法类型
ipvs scheduler :根据其调度时是否考虑各 RS 当前的负载状态被分为两种:静态方法和动态方法
静态方法:仅根据算法本身进行调度,不考虑 RS 的负载情况
动态方法:主要根据每 RS 当前的负载状态及调度算法进行调度 Overhead=value 较小的 RS 将被调度
2.lvs 静态调度算法
1 RR roundrobin 轮询 RS 分别被调度,当 RS 配置有差别时不推荐
2 WRR Weighted RR ,加权轮询根据 RS 的配置进行加权调度,性能差的 RS 被调度的次数少
3 SH Source Hashing ,实现 session sticky ,源 IP 地址 hash ;将来自于同一个 IP 地址的请求始终发往
第一次挑中的 RS ,从而实现会话绑定
4 DH Destination Hashing ;目标地址哈希,第一次轮询调度至 RS ,后续将发往同一个目标地址的请
求始终转发至第一次挑中的 RS ,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
3.lvs 动态调度算法
主要根据 RS 当前的负载状态及调度算法进行调度 Overhead=value 较小的 RS 会被调度
1 LC least connections(最少链接发) 适用于长连接应用 Overhead (负载值) =activeconns (活动链接数) x 256+inactiveconns (非 动链接数)
2 WLC Weighted LC(权重最少链接) 默认调度方法 Overhead=(activeconns x 256+inactiveconns)/weight
3 SED :Shortest Expection Delay, 初始连接高权重优先 Overhead=(activeconns+1+inactiveconns) x 256/weight. 但是,当 node1 的权重为 1 node2 的权重为 10 ,经过运算前几次的调度都会被 node2 承接
4 NQ Never Queue ,第一轮均匀分配,后续 SED
5 LBLC Locality-Based LC ,动态的 DH 算法,使用场景:根据负载状态实现正向代理
6 LBLCR LBLC with Replication ,带复制功能的 LBLC ,解决 LBLC 负载不均衡问题,从负载重的复制到负载轻的RS

6.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]
[root@lvs ~]# ipvsadm -LnC

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值