目录
LVS(Linux virual server)
一、集群和分布式的简介
二、LVS的运行原理
1、LVS简介
2、LVS 相关术语
3、LVS的集群类型
三、LVS-NAT工作模式
部署NAT工作模式案例:
1、实验环境
2、实验环境说明
3、配置
四、LVS-DR工作模式
部署DR工作模式案例:
1、实验环境
2、实验环境配置及说明
3、配置
五、LVS-TUN工作模式
六、fullnet工作模式
七、LVS工作模式总结
八、LVS的调度算法
1、lvs调度算法类型
2、lvs静态调度算法
3、lvs动态调度算法
4、部署DR模式集群案例
九、LVS部署命令介绍
ipvsadm命令参数的使用
LVS(Linux virual server)
一、集群和分布式的简介
集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据
和代码都是一样的
分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式
中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起
来,才是完整的业务
分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数
来提升效率
对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器
完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决
定由给哪一台去完成响应,并且台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点,
都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败
二、LVS的运行原理
1、LVS简介
LVS:Linux Virtual Server
,负载调度器,内核集成,章文嵩,阿里的四层
SLB(Server LoadBalance)
是基于LVS+keepalived
实现
LVS
官网
:
http://www.linuxvirtualserver.org/
2、LVS 相关术语
VS
:
Virtual Server
RS
:
Real Server
CIP
:
Client IP
VIP: Virtual serve IP VS
外网的
IP
DIP: Director IP VS
内网的
IPL
RIP: Real server IP
3、LVS的集群类型
lvs-nat
: 修改请求报文的目标IP,
多目标
IP
的
DNAT
lvs-dr
:
操纵封装新的
MAC
地址
lvs-tun
: 在原请求IP
报文之外新加一个
IP
首部
lvs-fullnat
:
修改请求报文的源和目标
IP
三、LVS-NAT工作模式
本质是多目标 IP 的 DNAT ,通过将请求报文中的目标地址和目标端口修改为某挑出的 RS 的 RIP 和PORT实现转发RIP 和 DIP 应在同一个 IP 网络,且应使用私网地址 ;RS 的网关要指向 DIP请求报文和响应报文都必须经由 Director 转发, Director 易于成为系统瓶颈支持端口映射,可修改请求报文的目标 PORTVS 必须是 Linux 系统, RS 可以是任意 OS 系统
部署NAT工作模式案例:
此实验采用openEuler版本系统
1、实验环境
主机名 | IP | 角色 |
lvs | 192.168.182.141 仅主机:192.168.237.100 | 负载均衡器 |
client | 192.168.182.144 | 客户端 |
webserver1 | 仅主机:192.168.237.142 | web服务器 |
webserver2 | 仅主机:192.168.237.143 | web服务器 |
2、实验环境说明
web服务器上的网络适配器改为仅主机模式
负载均衡器上添加一个网络适配器并改为仅主机模式
3、配置
web服务器配置
[root@webserver1 ~]# dnf install nginx -y
[root@webserver1 ~]# echo webserver1 > /usr/share/nginx/html/index.html
[root@webserver1 ~]# systemctl restart nginx.service
[root@webserver2 ~]# dnf install nginx -y
[root@webserver2 ~]# echo webserver1 > /usr/share/nginx/html/index.html
[root@webserver2 ~]# systemctl restart nginx.service
lvs配置开启内核路由转发:[root@lvs ~]# vim /etc/sysctl.conf
[root@lvs ~]# dnf install nginx -y [root@lvs ~]# ipvsadm -A -t 192.168.182.141:80 -s rr #rr指轮询算法 [root@lvs ~]# ipvsadm -a -t 192.168.182.141:80 -r 192.168.237.142:80 -m #-a添加,-r指要添加的web服务器IP [root@lvs ~]# ipvsadm -a -t 192.168.182.141:80 -r 192.168.237.143:80 -m #-m指开启nat模式 [root@lvs ~]# 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.182.141:80 rr -> 192.168.237.142:80 Masq 1 0 1 -> 192.168.237.143:80 Masq 1 0 0
客户端测试
[root@node4 ~]# for i in {1..10}
> do
> curl 192.168.182.141
> done
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
四、LVS-DR工作模式
DR : Direct Routing ,直接路由, LVS 默认模式 , 应用最广泛 , 通过为请求报文重新封装一个 MAC 首部进行转发,源 MAC 是 DIP 所在的接口的 MAC ,目标 MAC 是某挑选出的 RS 的 RIP 所在接口的 MAC 地址;源IP/PORT ,以及目标 IP/PORT 均保持不变
在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs上都要有vip
部署DR工作模式案例:
此实验采用openEuler版本系统
1、实验环境
主机名 | IP | VIP | 角色 |
client | 192.168.182.144 | 客户端 | |
lvs | 仅主机:192.168.237.101 | lo:192.168.237.200 | 负载均衡器 |
router | 192.168.182.10 仅主机:192.168.237.100 | 路由器 | |
webserver1 | 仅主机:192.168.237.10 | lo:192.168.237.200 | web服务器 |
webserver2 | 仅主机:192.168.237.20 | lo:192.168.237.200 | web服务器 |
2、实验环境配置及说明
client网络适配器为NAT模式
lvs添加一块网络适配器并改为仅主机模式
router添加一块网络适配器并改为仅主机模式
为你的仅主机模式的网卡添加一个IP
webserver1和webserver2将网络适配器改为仅主机模式
webserver1和webserver2以环回接口添加VIP,VIP可自己指定但必须和lvs和web服务器在同一网段
将lvs、webserver1、webserver2的网关都改为路由器的IP[root@lvs ~]# nmcli connection modify ens224 ipv4.gateway 192.168.237.100
[root@lvs ~]# nmcli con up ens224
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2)
[root@lvs ~]#
[root@webserver1 ~]# nmcli connection modify ens160 ipv4.gateway 192.168.237.100
[root@webserver1 ~]# nmcli con up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2)
[root@webserver1 ~]#[root@webserver2 ~]# nmcli connection modify ens160 ipv4.gateway 192.168.237.100
[root@webserver2 ~]# nmcli con up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2)
[root@webserver2 ~]#
3、配置
在webserver1和webserver2上搭建一个nginx服务并做ARP抑制
[root@webserver1 ~]# dnf install nginx -y
[root@webserver1 ~]# echo my name is lhd > /usr/share/nginx/html/index.html
[root@webserver1 ~]# systemctl restart nginx.service
[root@webserver1 ~]#
[root@webserver2 ~]# dnf install nginx -y
[root@webserver2 ~]# echo my name is lhd2 > /usr/share/nginx/html/index.html
[root@webserver2 ~]# systemctl restart nginx.service
[root@webserver2 ~]#
做ARP抑制,防止web服务发起广播
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
负载调度器上的配置
[root@lvs ~]# ipvsadm -A -t 192.168.237.200:80 -s wrr #wrr指加权轮询
[root@lvs ~]# ipvsadm -a -t 192.168.237.200:80 -r 192.168.237.10:80 -g -w 1 #-a指添加
[root@lvs ~]# ipvsadm -a -t 192.168.237.200:80 -r 192.168.237.20:80 -g -w 2 #-g指DR模式
[root@lvs ~]# 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.237.200:80 wrr
-> 192.168.237.10:80 Route 1 0 0
-> 192.168.237.20:80 Route 2 0 0
客户端测试:
[root@client ~]# for ((i=1;i<=10;i++)) ; do curl 192.168.237.200; done
my name is lhd2
my name is lhd
my name is lhd2
my name is lhd2
my name is lhd
my name is lhd2
my name is lhd2
my name is lhd
my name is lhd2
my name is lhd2
五、LVS-TUN工作模式
转发方式:不修改请求报文的 IP 首部(源 IP 为 CIP ,目标 IP 为 VIP ),而在原 IP 报文之外再封装一个 IP 首部(源 IP 是 DIP, 目标 IP 是 RIP ),将报文发往挑选出的目标 RS ;RS 直接响应给客户端(源 IP 是 VIP ,目标 IP是CIP )
1. 客户端发送请求数据包,包内有源 IP+vip+dport2. 到达 vs 调度器后对客户端发送过来的数据包重新封装添加 IP 报文头,新添加的 IP 报文头中包含 TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到 RS13.RS 收到 VS 调度器发送过来的数据包做出响应,生成的响应报文中包含 SRCIP(VIP)+DSTIP ( CIP) +port,响应数据包通过网络直接回传给 client
六、fullnet工作模式
fullnat :通过同时修改请求报文的源 IP 地址和目标 IP 地址进行转发CIP --> DIPVIP --> RIP1.VIP 是公网地址, RIP 和 DIP 是私网地址,且通常不在同一 IP 网络;因此, RIP 的网关一般不会指向 DIP2.RS 收到的请求报文源地址是 DIP ,因此,只需响应给 DIP ;但 Director 还要将其发往 Client3. 请求和响应报文都经由 Director4. 支持端口映射
注意:此类型kernel默认不支持
七、LVS工作模式总结
NAT模式 | DR模式 | TUN模式 | |
---|---|---|---|
RS
操作系统
|
不限
| 支持隧道 | 禁用arp |
调度器和服务器网络
| 可跨网络 | 可跨网络 | 不可跨网络 |
调度服务器数量服务器数量
| 少 | 多 | 多 |
RS
服务器网关
|
指向到调度器
DIP
|
指向到路由
|
指向到路由
|
lvs-nat 与 lvs-fullnat :请求和响应报文都经由 Directorlvs-nat : RIP 的网关要指向 DIPlvs-fullnat : RIP 和 DIP 未必在同一 IP 网络,但要能通信lvs-dr 与 lvs-tun :请求报文要经由 Director ,但响应报文由 RS 直接发往 Clientlvs-dr :通过封装新的 MAC 首部实现,通过 MAC 网络转发lvs-tun :通过在原 IP 报文外封装新 IP 头实现转发,支持远距离通信
八、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)/weight3 、 SED : Shortest Expection Delay, 初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight但是,当 node1 的权重为 1 , node2 的权重为 10 ,经过运算前几次的调度都会被 node2 承接4 、 NQ : Never Queue ,第一轮均匀分配,后续 SED5 、 LBLC : Locality-Based LC ,动态的 DH 算法,使用场景:根据负载状态实现正向代理6 、 LBLCR : LBLC with Replication ,带复制功能的 LBLC ,解决 LBLC 负载不均衡问题,从负载重的复制到负载轻的RS
4、部署DR模式集群案例
利用防火墙标签解决轮询错误(基于lvs的DR直连路由工作模式)
后端服务器需使用mod_ssl工具并使用https的443端口
Iptables -t mangle -A PREROUTING -d 192.168.237.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 88
-t:指定是什么类型的表
-A:添加
PREROUTING 链规则:在数据包进入路由之前进行处理,常用于对数据包进行 NAT 转换。
-d:指定VIP
-p:指定网络协议tcp
-m:指定多个端口
--dports:目标端口
-j:后面指标签
--set-mark:设定标签号
九、LVS部署命令介绍
ipvsadm命令参数的使用
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 火墙标记,是一个数字
ipvsadm -a|e -t|u|f service-address -r realserver-address [-g|i|m] [-w weight]ipvsadm -Z [-t|u|f service-address] 清楚计数器-a # 添加 realserver-e # 更改 realserver-t #tcp 协议-u #udp 协议-f # 火墙 标签-r #realserver 地址-g # 直连路由模式-i #ipip 隧道模式-m #nat 模式-w # 设定权重-Z # 清空计数器-C # 清空 lvs 策略-L # 查看 lvs 策略-n # 不做解析--rate :输出速率信息