LVS(Linux Virual Server)

1、什么是LVS

LVS,Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在unix/linux平台下实现负载均衡集群功能。主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。能够把许多低性能的服务器组合在一起形成一个超级服务器,并且它配置非常简单,具有多种负载均衡的方法。即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。还有很好的扩展性。

(1)、相比于Nginx、Haproxy等负载均衡器,LVS支持较大的并发量。Nginx、Haproxy是工作在七层的负载均衡器,因此需要监听在一个端口上,同时对于每一个客户端都需要打开一个套接字文件来接受请求数据,当在应用层分析完数据时,有需要扮演成客户端角色向后端的服务器主机发送请求报文,不仅需要打开大量套接字文件,还需要有多个随机端口可以使用,而端口数最多只有65535个,并且其中有一部分端口是不能使用的。因此,工作在七层的负载均衡软件 (如Nginx、Haproxy等)的最大并发数受限于能够打开的套接字文件数(内核需要打开很多的文件描述符来维护)以及能使用的随机端口数。对于LVS而言,因此它工作在四层,所以不需要监听在某个端口以响应客户端请求,因此不需要打开套接字接受和发送数据,同时也不需要使用端口,所有功能均在ipvs中实现,因此LVS的性能更高,支持的并发量更大。

(2)、LVS是一款开源且免费的软件,结合Linux使用可以大大降低企业的应用成本

(3)、LVS具有可伸缩性。当一台服务器负载压力增长时,系统可以在不降低服务质量的情况下通过扩展来满足需求。

(4)、LVS具有高可靠性。这在国内很多大型的、关键性的Web站点实践中得到印证。

2、LVS相关术语及原理

VS: 虚拟服务器,又称调度器,分发器和负载均衡器,负责调度。

RS:真实服务器,在调度器后端提供服务的服务器主机。

CIP:客户端的IP地址。

VIP:调度器面向客户端提供的IP地址。

DIP:调度器用于与后端真实服务器通信的IP地址。

RIP: 调度器后端的真实服务器的IP地址。

工作原理:VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS。

3、LVS集群的类型

用户请求到达前端的负载调度器后,根据调度器如何将请求报文发送到各个提供服务的RS节点,以及RS节点如何返回数据给用户,可以将lvs集群的类型分为以下四种:

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

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

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

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

3.1 nat模式

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

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

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

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

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

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

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

客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通过PREROUTING后被ipvs结果并作作nat转发
因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工作。所以在做Ivs时要把iptables的火墙策略全清理掉。

《====实验====》

LVS中环境准备

net网络地址为172.25.254.100/24

仅主机网络地址为192.168.0.100/24

[root@lvs boot]#cat /etc/Networkyanager/system-connections/eth0.nmconnection
[connection]

id=eth0
type=ethernet

interface-name=eth0
[ipv4]

address1=172.25.254.100/24,172 .25 .254.2
method=maual
dns=114.114.114.114;

[root@lvs boot]# cat /etc/NetworkManager/system-connections/eth1.nmconnection

[connection]
id=eth1
type=ethernet

interface-name=eth1
[ipv4]

address1=192.168.0.100/24

method=manual

在lvs中打开内核路由功能

[root@lvs boot]# vim /etc/sysctl.conf
#在末尾加上

net.ipv4.ip_forward=1

设置RS环境

webserver1 仅主机

[root@webserver1 ~] # cat /etc/NetworkManager/system-connections/eth0.nmconnection

[connection]

id=eth0
type=ethernet

interface-name=eth0


[ipv4]
address1=192.168.0.10/24,192.168.0.100

method=manual

webserver2 仅主机

[root@webserver1 ~] # cat /etc/NetworkManager/system-connections/eth0.nmconnection

[connection]

id=eth0
type=ethernet

interface-name=eth0


[ipv4]
address1=192.168.0.20/24,192.168.0.100

method=manual

dns=114.114.114.114;

在lvs中测试:

(要先在两个RS主机中搭建http服务)

[root@lvs boot]# curl 192.168.0.10

hello 10

[root@lvs boot]# curl 192.168.0.20

hello 20

在lvs中安装lvs软件

[root@lvs boot]# dnf install ipvsadm -y

[root@lvs boot]# ipvsadm -A -t 172.25.254.100:80 -s rr

[root@lvs boot]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)
Prot LocaLAddress:Port Scheduler Flags
     -> RemoteAddress:Port                Forward Weight ActiveConn InActConn

TCP  172.25.254.100:80 rr


[root@lvs boot]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m

[root@lvs boot]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m

最后在客户机测试:

[root@localhost ~]#for i in {1..10}

> do

> curl 172.25.254.100

> done

hello 20

hello 10

hello 20

hello 10

hello 20

hello 10

hello 20

hello 10

hello 20

hello 10

3.2  DR模式

DR: Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。在DR模式中,RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs上都要有vip。

数据传输过程:

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.不支持端口映射 (端口不能修败)

9.RS可使用大多数OS系统

《====实验====》

环境介绍

客户机:natIP172.25.254.200/24  网关172.25.254.100

路由器:natIP172.25.254.100/24 网关172.25.254.2 仅主机IP192.168.0.100/24 

LVS:仅主机IP192.168.0.50  VIP192.168.0.200/32  网关192.168.0.100

server1: 仅主机IP192.168.0.10/24   VIP192.168.0.200/32

server2: 仅主机IP192.168.0.20/24  VIP192.168.0.200/32

路由器打开路由功能

[root@router ~]# sysctl -a  | grep ip_forward
net .ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1

net.ipv4.ip_forward_use_pmtu =  0

RS主机中使vip不对外响应

[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[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 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[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 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

在LVS主机中和RS主机中添加VIP

[root@lvs ~]# ip a a 192.168.0.200/32 dev lo

[root@webserver1 ~]# ip a a 192.168.0.200/32 dev lo

[root@webserver2 ~]# 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@client ~]# for i in {1..10}

> do

> curl  192.168.0.200

> done

hello 20

hello 10

hello 20

hello 20

hello 10

hello 20

hello 20

hello 10

hello 20

hello 20

3.3 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

3.4 fullnet模式

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

4、LVS部署命令介绍

4.1 ipvsadm命令

管理集群服务
ipvsadm -A|E -t(tcp) | u (udp)  | f (防护墙标签)

service-address(集群地址)
[-s scheduler(调度算法)]
[-p [timeout]]

[-M netmask]

[--pepersistence_engine]

[-b sched-fTags]
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 [options]查看rs
ipvsadm -z [-t|u|f service-address] 清楚计数器

4.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的增删改
-a #添加realserver

-e #更改realserver
-t #tcp协议
-u #udp协议
-f  #火墙 标签
-r #realserver地址
-g #直连路由模式

-i  #ipip隧道模式

-m #nat模式
-w #设定权重
-Z #清空计数器
-C #清空lvs策略
-L #查看lvs策略

-n #不做解析
--rate: 输出速率信息

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

以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题
当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上

(在DR模式实验基础上做)

RS安装mod_ssl模块 让RS支持https

[root@webserver1 ~]# yum install mod_ssl -y

[root@webserver1 ~]# systemctl restart httpd

[root@webserver2 ~]# yum install mod_ssl -y

[root@webserver2 ~]# systemctl restart httpd

在lvs中设置调度添加443端口

[root@lvs ~]# ipvsadm -A -t 192.168.0.200:443 -s rr

[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:80 -g

[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:80 -g

lvs主机中为端口做标记

[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66

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

[root@lvs ~]# ipvsadm -A -f 66 -s rr

[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.10 -g

[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.20 -g

在客户机上测试

[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200

hello 20

hello 10

6、lvs持久链接

在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡。
解决方案
在进行调度时,不管用什么算法,,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上。
如果在短期(默认3605)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台RS上。
如果过了比较长的时间(默认最长时间360s) 同源访问再次来访,那么就会被调度到其他的RS上

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] 默认360秒

在lvs调度器中设定

[root@lvs ~]# ipvsadm -E -f 6666 -s rr -p [3000]

[root@lvs ~]# ipvsadm -LnC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值