LVS(Linux virual server),从理论到实战,让你快人一步!

目录

LVS

原理解释

集群性能扩展方式

集群(Cluster)分类

分布式

LVS运行原理

LVS概念

LVS集群的类型

LVS部署命令介绍

LVS软件相关信息

ipvsadm命令

        核心功能

        命令参数

        LVS集群中的增删改

        管理集群服务中的增删改   

LVS-NAT模式部署方法 

LVS-NAT

原理图

准备工作

   相关配置

VS中的   sysctl.conf

webserver和webserver2

VS主机相关配置

测试

DR模式

DR模式的特点

LVS-DR模式的实现

原理图

准备工作

相关配置

LVS中的配置策略

测试

解决VIP响应问题

限制响应级别:arp_ignore

限制通告级别:arp_announce

TUN模式

转发方式

数据传输过程

TUN模式特点

Fullnet模式

LVS工作模式总结

LVS 的调度算法

LVS调度算法类型

LVS静态调度算法

LVS动态调度算法

防火墙标签解决轮询错误

轮询规则中可能会遇到的错误

测试

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

实现方法

在Director主机打标记

在Director主机基于标记定义集群服务

示例

测试

LVS持久链接

解决方案


LVS

原理解释

集群性能扩展方式

Scale UP向上扩展,增强
Scale OUT向外扩展,增加设备,调度分配问题,Cluster

集群(Cluster)分类

LB负载均衡,多个主机构成,每个主机承担一部分访问;解决的单机处理不了所有请求的问题
分为四层和七层
HA

高可用,解决的问题是不让整个架构故障

用我们的第一张原理图解释:

第一张图中架构存在的问题:中间主机请假,业务就完了,因为中间主机负载调度

解决方法:再添加一个LVS,随时监督着正在使用的LVS,如果正在使用的LVS挂了,替补的马上顶上接着运行,两个LVS组成的架构就叫做高可用

HPC高性能计算,是国家战略资源

分布式

概念:

       为了提高系统处理能力,将一个大任务分解成多个小任务,由多个节点同时处理,从而提高速度

        

分布式存储Ceph、GlusterFs、FastDFS、MogildFs
分布式计算hadoop、Spark

  分布式和集群的区别:

        分布式是多台主机处理同一台业务,只是分开来做

集群同一个业务系统,部署在多台服务器上,集群中每台服务器实现的功能没有差别,数据、代码都是一致的
分布式一个业务拆分成多个子业务,或者本身就是不同的业务,部署在多台服务器上。在分布式中,每一台服务器实现的功能是有差别的,数据、代码都不一样;分布式每台服务器功能加起来,才是一个完整的业务

        分布式是以缩短任务时间来提升速率

        集群是通过提高在单位时间内所执行的任务数量,来提升速率

LVS运行原理

LVS:负载调度器

工作原理:

        VS(Virtual Server,负责调度)根据请求报文的目标IP和目标协议以及端口将其调度转发到某RS(RealServer,负责真正提供服务),根据调度算法来挑选RS

LVS概念

VSVirtual Server(中间主机,调度器)
RSReal Server(用于处理的主机)
CIPClient IP(客户用于访问lvs的IP) 
VIPVirtual server IP VS外网的IP(中间主机用于接受客户访问的IP)
DIPDirector server IP(中间主机用于将接受的客户请求,调度给用于处理的主机的IP)
RIPReal server IP(用于处理的主机上的IP) 

LVS集群的类型

LVS访问流程:

        CIP <---> VIP == DIP <---> RIP

解释:CIP到VIP,VIP转换成DIP,传输到RIP

lvs-nat    修改请求报文的目标IP,多目标IP的DNAT
lvs-dr操纵封装新的mac地址
lvs-tun在原请求IP报文之外新加一个IP首部
lvs-fullnat修改请求报文的源和目标IP

LVS部署命令介绍

LVS软件相关信息

程序包ipvsadm
Unit Fileipvsadm.service
主程序/usr/sbin/ipvsadm
规则保存工具/usr/sbin/ipvsadm-save
规则重载工具/usr/sbin/ipvsadm-restore
配置文件/etc/sysconfig/ipvsadm-config
ipvs调度规则文件/etc/sysconfig/ipvsadm

ipvsadm命令

        核心功能

                集群服务管理:增删改

                集群服务的 RS 管理:增删改

                查看

        命令参数

####  管理集群服务
ipvsadm -A|E -t(tcp)|u(udp)|f(防护墙标签) \
service-address(集群地址) \
[-s scheduler(调度算法)] \
[-p [timeout]] \
[-M netmask] \
[--pepersistence_engine] \
[-b sched-flags]


ipvsadm -D -t|u|f service-address 删除
ipvsadm –C 清空
ipvsadm –R 重载
ipvsadm -S [-n] 保存

#### 管理集群中的 real server
ipvsadm -a|e -t|u|f service-address -r server-address [-g | -i| -m](工作模式) [-w
weight](权重)
ipvsadm -d -t|u|f service-address -r server-address     ## 删除RS
ipvsadm -L|l [options]     ##  查看rs
ipvsadm -Z [-t|u|f service-address]     ### 清楚计数器

        LVS集群中的增删改

        管理集群服务中的增删改   
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-A添加
-E修改
-tTCP服务
-uUDP服务
-s指定调度算法,默认是 WLC
-p设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
-ffirewall mask 火墙标记,是一个数字
#增加
[root@DR-server ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@DR-server ~]# ipvsadm -A -f 66 -p 3000

#修改
[root@DR-server ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr -p 3000

#删除
[root@DR-server ~]# ipvsadm -D -t 172.25.254.100:80
[root@DR-server ~]# ipvsadm -D -f 66

        管理集群中 Real Server 的增删改查

ipvsadm -a|e -t|u|f service-address -r realserver-address [-g|i|m] [-w weight]
-a添加 realserver
-e更改 realserver
-tTCP协议
-uUDP协议
-f火墙 标签
-rrealserver 地址
-g直连路由模式
-iipip 隧道模式
-mNAT 模式
-w设定权重
-z清空计数器
-c清空 LVS 策略
-l查看 LVS 策略
-n不做解析
--rete输出速率信息
#添加
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.30 -m
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.40 -m -w 2

#更改
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -m -w 1
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -i -w 1

#删除
[root@DR-server ~]# ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.30
PVS 规则/proc/net/ip_vs
IPVS 连接/proc/net/ip_vs_conn

LVS-NAT模式部署方法 

LVS-NAT

        本质:
                多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为 某挑出的RS的RIP和PORT实现转发
                RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
                请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
                支持端口映射,可修改请求报文的目标PORT
                VS必须是Linux系统,RS可以是任意OS系统

原理图

准备工作

(VS)名称:LVS;版本:rhel9版本
要求:
两块网卡,一块NAT,一块仅主机
VIP:
	vmset.sh eth0 172.25.254.100 lvs.ccc.org
DIP:
	vmset.sh eth1 192.168.0.100 lvs.ccc.org

(RS)称:webserver;rhel9版本
要求:网卡仅主机模式
RIP:
	vmset.sh eth0 192.168.0.10 webserver1.ccc.org

(RS)称:webserver2;rhel9版本
要求:网卡仅主机模式
RIP:
	vmset.sh eth0 192.168.0.20 webserver2.ccc.org

   相关配置

### LVS配置
内核路由功能打开:
#过滤sysctl -a | grep ip_forward  
vim /etc/sysctl.conf
#最后加上内容
net.ipv4.ip_forward=1
#服务生效
sysctl -p

###  webserver配置
网关必须指到LVS上去,172.25.254.100接口 
vim /etc/NetworkManager/system-connections/eth0.connection
修改内容
修改完成后
nmcli connection reload
nmcli connection up eth0
安装httpd服务
dnf install httpd -y
配置
echo webserver - 192.168.0.10 > /var/www/html/index.html
启动服务
systemctl enable --now httpd
去VS检测:curl 192.168.0.10

###  webserver2配置
网关必须指到LVS上去,172.25.254.100接口
vim /etc/NetworkManager/system-connections/eth0.connection
修改内容
修改完成后
nmcli connection reload
nmcli connection up eth0
安装httpd服务
dnf install httpd -y
配置
echo webserver2 - 192.168.0.20 > /var/www/html/index.html
启动服务
systemctl enable --now httpd
去VS检测:curl 192.168.0.20

VS中的   sysctl.conf

webserver和webserver2

vim /etc/NetworkManager/system-connections/eth0.connection

修改

VS主机相关配置

VS主机
安装lvs软件
dnf install ipvsadm -y   

lvs软件介绍:
	程序包:ipvsadm
	Unit File:ipvsadm.service
	主程序:/usr/sbin/ipvsadm
	规则保存工具:/usr/sbin/ipvsadm-save
	规则重载工具:/usr/sbin/ipvsadm-restore
	配置文件:/etc/sysconfig/ipvsadm-config
	ipvs调度规则文件:/etc/sysconfig/ipvsadm
	
没有/usr/sbin/ipvsadm
编辑
ipvsadm -A -t 172.25.254.100:80 -s rr
解释:	-A:增加虚拟server
-t:增加的调度是什么协议
-s:指定你的调度算法
rr:静态算法

查看	ipvsadm -Ln
后端调用主机
ipvsadm -a -r 172.25.254.100:80 -r 192.168.0.10:80 -m
解释:
-r	real server
-m  现在lvs用的模式是net的
-w	指定权重(在这里不生效,rr不带权重)

测试

测试(真机)
for i in {1..10}
> do
> curl 172.25.254.200
> done
保存
在172.25.254.100上保存
ipvsadm-save > /etc/sysconfig/ipvsadm

DR模式

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

        在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs 上都要有vip

DR模式的特点

Director 和 各RS 都配置有 VIP
确保前端路由器将 目标IP 为 VIP 的请求报文发往 Director
在前端网关做静态绑定 VIP 和 Director 的 MAC 地址
RS 的 RIP 可以使用私网地址,也可以是公网地址;RIP 与 DIP 在同一IP网络
RIP 的网关不能指向 DIP,以确保响应报文不会经由 Director
RS 和 Director 要在同一个物理网络
请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
不支持端口映射(端口不能修败)
RS可使用大多数OS系统

LVS-DR模式的实现

原理图

准备工作

总共五台主机:一个路由器(router),一个Client(访问路由器),一个LVS,两个RS(webserver)
版本:RHEL9

### Client设定
vmset.sh eth0 172.25.254.200 client.ccc.org

### router设定
双网卡:NAT网卡,仅主机网卡
	172.25.254.100	对外合法IP
	192.168.0.100
vmset.sh 172.25.254.100 router.ccc.org
vmset.sh eth1 192.168.0.100 router.ccc.org

### LVS设定
只需要一个仅主机的网卡eth1
vmset.sh eth1 192.168.0.50 lvs.ccc.org

### 两台RS
RIP:192.168.0.10
RIP: 192.168.0.20

相关配置

### Client
修改网关:
	vim /etc/NetworkManager/system-connections/eth0.connection
网关改成:
	172.25.254.100
nmcli connection reload
nmcli connection up eth0

### router
编辑eth1的信息
vim /etc/NetworkManager/system-connections/eth1.connection
只是一个通信接口
删除网关
nmcli connection reload
nmcli connection up eth1
内核路由打开:
	#过滤sysctl -a | grep ip_forward  
	#net.ipv4.ip_forward = 0	没开,就不能作为路由器
	vim /etc/sysctl.conf
添加内容: 
	net.ipv4.ip_forward = 1
刷新使服务生效:
	sysctl -p

### LVS
修改网关
vim /etc/NetworkManager/system-connections/eth1.connection
网关改成:192.168.0.100
nmcli connection reload
nmcli connection up eth1
VIP设定(回环接口)
添加VIP:
	ip a a 192.168.0.200/32 dev lo

### RS
两台webserver需要禁用响应,需要有VIP
响应解决:
RS主机中使vip不对外响应:
[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/lo/arp_announce
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

[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
注意:
	all不改对网卡是不生效的
	重启后不生效,要想重启生效就得写入到/etc/sysctl.conf里面
	#过滤: sysctl -a | grep arp_ignore
	#找到net.ipv4.conf.all.arp_ignore = 1
	#写完后sysctl -p	生效 
两台webserver网关修改
vim /etc/NetworkManager/system-connections/eth0.connection
网关修改为:
	172.25.254.100
VIP设定(回环接口)
添加VIP:
	ip a a 192.168.0.200/32 dev lo

LVS中的配置策略

[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
[root@lvs ~]# ipvsadm -Ln
测试
for N in {1..6};do curl 192.168.0.100;done

解决VIP响应问题

DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:

        1、在前端网关做静态绑定

        2、在各RS使用arptables

        3、在各RS修改内核参数,来限制arp响应和通告的级别

限制响应级别:arp_ignore

        0:默认值,表示可使用本地任意接口上配置的任意地址进行响应

        1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应

限制通告级别:arp_announce

        0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告

        1:尽量避免将接口信息向非直接连接网络进行通告

        2:必须避免将接口信息向非本网络进行通告

TUN模式

转发方式

                不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部 (源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP 是CIP)

数据传输过程

1、客户端发送请求数据包,包内有源IP+vip+dport

2、到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含 TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1

3、RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP) +port,响应数据包通过网络直接回传给client

TUN模式特点

DIP, VIP, RIP都应该是公网地址
RS的网关一般不能指向DIP
请求报文要经由Director,但响应不能经由Director
不支持端口映射
RS的OS须支持隧道功能

Fullnet模式

        通过同时修改请求报文的源IP地址和目标IP地址进行转发

        CIP --> DIP VIP --> RIP

        1、VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP

        2、RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client

        3、请求和响应报文都经由Director

        4、支持端口映射

LVS工作模式总结

NAT模式TUN模式DR模式
RS操作系统不限支持隧道禁用arp
调度器和服务器网络可跨网络可跨网络不可跨网络
调度服务器数量服务器数量
RS服务器网关指向到调度器DIP指向到路由指向到路由
lvs-nat与lvs-fullnat请求和响应报文都经由Director
lvs-natRIP的网关要指向DIP
lvs-fullnatRIP和DIP未必在同一IP网络,但要能通信
lvs-dr与lvs-tun请求报文要经由Director,但响应报文由RS直接发往Client
lvs-dr通过封装新的MAC首部实现,通过MAC网络转发
lvs-tun通过在原IP报文外封装新IP头实现转发,支持远距离通信

LVS 的调度算法

LVS调度算法类型

ipvs scheduler根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法
静态方法仅根据算法本身进行调度,不考虑RS的负载情况
动态方法主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度

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,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商

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

防火墙标签解决轮询错误

轮询规则中可能会遇到的错误

        以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题

        当第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上

在RS1和RS2中安装mod_ssl并重启apache
]# yum install mod_ssl -y
]# systemctl restart httpd

在lvs中设置调度,因为我们要调度80和443两个端口所以我们需要设定两组策略
]# ipvsadm -C

[root@lvs ~]# ipvsadm -A -t 192.168.0.100:80 -s rr
[root@lvs ~]# ipvsadm -A -t 192.168.0.100:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.101:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.102:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.102:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.101:80 -g
[root@lvs ~]# ipvsadm -Ln
测试
curl http://192.168.0.100;curl -k https://192.168.0.100

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

        FWM:FireWall Mark MARK

        target 可用于给特定的报文打标记

        --set-mark value

        其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服 务:可将多个不同的应用使用同一个集群服务进行调度

实现方法
在Director主机打标记
iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports
$portl,$port2,..-i MARK --set-mark NUMBER
在Director主机基于标记定义集群服务
ipvsadm -A -f NUMBER [options]
示例
在vs调度器中设定端口标签,人为80和443是一个整体
]# iptables -t mangle -A PREROUTING -d 192.168.0.100 -p tcp -m multiport --dports
80,443 -j MARK --set-mark 6666

设定调度规则
[root@lvs ~]# ipvsadm -A -f 6666 -s rr
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.101 -g
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.102 -g
测试
curl -k https://192.168.0.100

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

   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值