LVS(Linux virual server)7000字超详细教程从啥也不懂到入门

1.Linux 虚拟服务器概述

Linux 虚拟服务器 (LVS) 是一组集成软件组件,用于在一组真实服务器之间平衡 IP 负载。LVS 在一对配置相同的计算机上运行:一台是活动的 LVS 路由器,另一台是备用 LVS 路由器。活动的 LVS 路由器有两个角色:

  • 在真实服务器之间平衡负载。

  • 检查每个真实服务器上服务的完整性。

备份 LVS 路由器监控活动 LVS 路由器,并在活动 LVS 路由器发生故障时接管该路由器。

1.1. 基本的 LVS 配置

下图显示了由两层组成的简单 LVS 配置。第一层是两个 LVS 路由器 — 一个活动路由器和一个备份路由器。每个 LVS 路由器都有 两个网络接口,一个在 Internet 上,一个在专用网络上,使它们能够调节两个网络之间的流量。在此示例中,活动路由器使用 网络地址转换或  NAT 将流量从 Internet 定向到第二层上数量可变的真实服务器,这些服务器反过来提供必要的服务。

1.2.LVS的基本概念

VS Virtual Server  虚拟
RS Real Server
CIP Client IP 客户端ip
VIP: Virtual server IP   外网访问的虚拟ip
DIP: Director IP  VS内网ip
RIP: Real server IP  内网真实ip
访问流程: CIP <--> VIP == DIP <--> RIP

2.LVS的命令

1. 管理集群服务中的增删改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-A # 添加
-E # 修改 没有事先添加就不能修改
-t   #tcp 服务
-u #udp 服务
-s # 指定调度算法,默认为 WLC
-p # 设置持久连接超时,持久连接表示在同一个时间段同一个来源的请求调度到同一 Realserver
-f #firewall mask 火墙标记,是一个数字
2. 管理集群中 RealServer 的增删改
ipvsadm -a|e -t|u|f service-address -r realserver-address [-g|i|m] [-w weight]
-a # 添加 realserver
-e # 更改 realserver
-t #tcp 协议
-u #udp 协议
-f # 火墙 标签
-r #realserver 地址
-g #直连路由模式
-i #ipip 隧道模式
-m #nat模式
-w # 设定权重
-Z # 清空计数器
-C # 清空 lvs 策略
-L # 查看 lvs 策略
-n # 不做解析
--rate :输出速率信息

3.四种基本模式

3.1 net模式 网络地址转换

LVS的NAT模式工作原理是:客户端访问服务器,访问请求到达调度器,调度器通过网络地址转换,重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的Real Server;Real Server的响应包通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程

对报文的目的地址进行改变

3.1.1准备环境

主机ip下载服务
client172.25.254.10/24
LVS

172.25.254.100/24

192.168.132.100/24

ipvsadm
server1/RS1

192.168.132.101

gw:192.168.132.100

httpd
server2/RS2

192.168.132.102

gw:192.168.132.100

httpd

其中VIP就是我们的192.168.132.100 

3.1.2 LVS的配置

echo "net.ipv4.ip_forward=1" >/etc/sysctl.d/ip_forward.conf
sysctl -p
yum install ipvsadm -y
ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.101:80 -m
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.102:80 -m
ipvsadm -Ln
vim /etc/sysconfig/ipvsadm
ipvsadm -Sn >/etc/sysconfig/ipvsadm-config
systemctl restart ipvsadm.service 
ipvsadm -R < /etc/sysconfig/ipvsadm-config

3.1.3 命令解释

echo "net.ipv4.ip_forward=1" >/etc/sysctl.d/ip_forward.conf #启用内核路由功能让172.25.254网段的内容能到192.168.132网段去
sysctl -p #刷新让上面功能生效
yum install ipvsadm -y
ipvsadm -A -t 172.25.254.100:80 -s rr #集群服务管理增加
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.101:80 -m #集群服务的RS管理增加
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.102:80 -m
ipvsadm -Ln #查看添加的Lvs策略
vim /etc/sysconfig/ipvsadm #创建ipvsadm
ipvsadm -Sn >/etc/sysconfig/ipvsadm-config #保存lvs策略
systemctl restart ipvsadm.service #重启服务
ipvsadm -R < /etc/sysconfig/ipvsadm-config #导入事先写好的配置

3.1.4 注意事项 

网卡配置需要将两台RS也就是server服务器的网关指向我们的LVS服务器

vim /etc/sysconfig/ipvsadm #创建ipvsadm此文件必须创建否则服务起不来

3.1.5 运行过程

3.1.6 web服务器配置  

server1和server2配置一致

vim /etc/NetworkManager/system-connections/ens160.nmconnection

3.1.7 测试结果

3.2 DR模式 Direct Routing(直接路由)

DR模式意为Direct Routing(直接路由),是调度器与实际服务器都有一块网卡连在同一物理网段上的情况。 而LVS-DR的工作原理就是:通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址,源IP/PORT,以及目标IP/PORT均保持不变。

3.2.1准备环境

  

主机名ip服务VIP
client172.25.254.10/24客户端
router

172.25.254.100/24

192.168.132.10

路由转发
lvs

192.168.132.200/24

gw 192.168.132.10

LVS

lo:192.168.132.100/32

或者添加网卡代替

RS1

192.168.132.101/24

gw 192.168.132.10

weblo:192.168.132.100/32
RS2

192.168.132.102/24

gw 192.168.132.10

weblo:192.168.132.100/32

3.2.2 router配置

echo "net.ipv4.ip_forward=1" >/etc/sysctl.d/ip_forward.conf
sysctl -p

3.2.3 LVS的配置

yum install ipvsadm -y
ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.101:80 -m
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.102:80 -m
ipvsadm -Ln
vim /etc/sysconfig/ipvsadm
ipvsadm -Sn >/etc/sysconfig/ipvsadm-config
systemctl restart ipvsadm.service 
ipvsadm -R < /etc/sysconfig/ipvsadm-config
ip addr add dev lo 192.168.132.100/32

3.2.4 web服务器配置 

ip addr add dev lo 192.168.132.100/32
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

3.2.5命令解释

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

目的:在RS1RS2中解决响应问题

arp_ignore和arp_announce参数分别有all,default,lo,eth0等对应不同网卡。当all和具体网卡的参数值不一致时,配置为较大值的生效。一般只需修改all和某个具体网卡的参数即可。

arp_ignore参数

arp_ignore参数的作用是控制系统在收到外部的arp请求时,是否要返回arp响应

0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。

1:只响应目的IP地址为接收网卡上的本地地址的arp请求。

2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。

3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。

4~7:保留未使用

8:不回应所有的arp请求

arp_announce参数


arp_announce的作用是控制系统在对外发送arp请求时,如何选择arp请求数据包的源IP地址。(比如系统准备通过网卡发送一个数据包a,要获取目的IP对应的MAC地址,就需要发送arp请求。arp请求的目的IP自然就是想要获取其MAC地址的IP,而arp请求的源IP是什么呢? 可能第一反应会以为肯定是数据包a的源IP地址,但这不一定,因为arp请求的源IP是可以选择的,控制这个地址如何选择就是arp_announce)

arp_announce参数常用的取值有0,1,2。

0:允许使用任意网卡上的IP地址作为arp请求的源IP,通常就是使用数据包a的源IP。

1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。

2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。

3.2.6 注意事项

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

需要写两个配置文件只写lo/arp_ignore不生效

lo接口必须是32位

3.2.7 运行过程

LVS

server2 和 server1同理

3.2.8 测试结果

3.3 TUN模式


LVS的Tun模式(隧道模式)是利用ip tunnel技术原理,在不改变原有的ip包头首部信息的基础上再封装一层ip首部信息,再利用路由的原理将请求转交给后端RS server。TUN模式的优点是DS和RS不需要在同一网段,可以实现不同网络之间的访问。相比LVS/DR模式,LVS/TUN对网络的消耗较大,因为要支持ip tunnel的开销

3.4 fullnet模式

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

相比net模式多修改了源IP

CIP --> DIP
VIP --> RIP
1.VIP 是公网地址, RIP DIP 是私网地址,且通常不在同一 IP 网络;因此, RIP 的网关一般不会指向 DIP
2.RS 收到的请求报文源地址是 DIP ,因此,只需响应给 DIP ;但 Director 还要将其发往 Client
3. 请求和响应报文都经由 Director
4. 支持端口映射

4.算法

4.1.lvs静态调度算法

4.1.1 RRroundrobin 轮询

RS分别被调度

理想情况下就是小孩子分糖果你一个我一个 平分

4.1.2 WRRWeighted RR

加权轮询 根据 RS 的配置进行加权调度,性能差的 RS 被调度的次数少
能力越大责任越大

4.1.3 SHSource Hashing

实现 session sticky 源IP地址 hash ;将来自于同一个 IP地址的请求始终发往第一次挑中的 RS ,从而实现会话绑定
月老牵红线就是你了 属于是服务端看上了客户端这个IP(受权重影响)

4.1.4 DHDestination Hashing

目标地址 哈希,第一次轮询调度至 RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的 RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
月老牵红线就是你了 属于是服务端看上了客户端的地址(受权重影响)

4.2.lvs动态调度算法

主要根据RS当前的负载状态及调度算法进行调度Overhead=value较小的RS会被调度

4.2.1 LCleast connections(最少链接发)

适用于长连接应用 Overhead (负载值) =activeconns (活动链接数) x 256+inactiveconns (非活
动链接数)
根据这个算式算出当前最少链接并将下一个客户端请求发送过去

4.2.2 WLCWeighted LC(权重最少链接)

默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
 ipvsadm -E -t 192.168.132.100:80 -s lc
 

4.2.3 SED:Shortest Expection Delay

初始连接高权重优先 Overhead=(activeconns+1+inactiveconns) x 256/weight
但是,当 node1 的权重为 1 node2 的权重为 10 ,经过运算前几次的调度都会被 node2 承接

4.2.3 NQNever Queue

第一轮均匀分配,后续SED

4.2.5 LBLCLocality-Based LC

动态的DH算法,使用场景:根据负载状态实现正向代理

4.2.6 LBLCRLBLC with Replication

带复制功能的 LBLC ,解决 LBLC 负载不均衡问题, 从负载重的复制
到负载轻的RS

5.防火墙标签解决轮询错误

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

http https 为例,当我们在 RS 中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题当我第一次访问 80 被轮询到 RS1 后下次访问 443 仍然可能会被轮询到 RS1上问题呈现
防火墙标记解决轮询调度问题
FWM:FireWall Mark
MARK target 可用于给特定的报文打标记 ,
--set-mark value
其中 :value 可为 0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服务 : 可将多个不同的应用使用同一个集群服务进行调度
实例
yum install mod_ssl -y
systemctl restart httpd #重启服务采用mod_ssl自带的加密
curl -k https://192.168.132.101
#两台RS都做

 

人为绑定80端口和443端口让其认为是一个整体计算

5.2 lvs持久链接

在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用 sh 算法,但是 sh算法比较简单粗暴,可能会导致调度失衡
解决方案
在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个 RS上如果在短期(默认 360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台 RS上。如果过了比较长的时间(默认最长时间 360s )同源访问再次来访,那么就会被调度到其他的 RS
ipvsadm -AlE -tlulf service-address [-s scheduler] [-p [timeout]]默认360秒
ipvsadm -E -f 1234 -s rr -p 3000
 
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值