LVS(Linux virual server)

一、集群和分布式简介

1.1 什么是集群?

集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据 和代码都是一样的

1.2 什么是分布式?

分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式 中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起 来,才是完整的业务 分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数 来提升效率。

二、LVS简介

2.1 什么是LVS

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

LVS 官网: http://www.linuxvirtualserver.org/ LVS

2.2 相关术语

VS: Virtual Server,负责调度

RS:RealServer,负责真正提供服务

2.3 LVS集群体系结构

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

2.4 LVS概念

VS:Virtual Server

RS:Real Server

CIP:Client IP

VIP: Virtual serve IP VS外网的IP

DIP: Director IP VS内网的IP

RIP: Real server IP

访问流程:CIP VIP == DIP RIP

2.5 lvs集群的类型

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

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

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

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

2.5.1.nat模式

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

2、RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP

3、请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈

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

5、VS必须是Linux系统,RS可以是任意OS系统 

 

客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通 过PREROUTING后被ipvs结果并作nat转发

因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工 作。所以在做lvs时要把iptables的火墙策略全清理掉。

 2.5.2 DR模式

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

 

 

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 

3.5.3 TUN模式(了解)

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

TUN模式特点

1.DIP, VIP, RIP都应该是公网地址

2.RS的网关一般不能指向DIP

3.请求报文要经由Director,但响应不能经由Director

4.不支持端口映射

5.RS的OS须支持隧道功能         

3.5.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.支持端口映射

实战案例

环境准备

主机名ipVIP角色
LVS192.168.0.100172.25.254.100调度器(VS)
webserver1

192.168.0.101

GW192.168.0.100

null真实服务器(RS)
webserver2

192.168.0.102

GW 192.168.0.100

null真实服务器(RS)

LVS主机配置

添加一张网卡eth1,网络设定为仅主机模式,原有的eth0网络为nat模式。

eht0:ip为172.25.254.100、网关172.25.254.2 主机名LVS

eht1:ip为192.268.0.100、主机名LVS,并且删掉网关

在LVS主机中打开内核路由功能

[root@LVS ~]# cat /etc/sysctl.conf 
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

net.ipv4.ip_forward=1

web1server主机配置

网络设定为eth0仅主机模式。

eth0:ip为192.168.0.10 主机名webserver1,修改网关为192.168.0.100

下载httpd服务

[root@webserver1 ~]# dnf install httpd -y
[root@webserver1 ~]# echo webserver2:192.168.0.10 > /var/www/html/index.html
[root@webserver1 ~]# systemctl enable --now httpd

web2server主机配置

网络设定为eth0仅主机模式。

eth0:ip为192.168.0.20 主机名webserver2,修改网关为192.168.0.100

下载httpd服务

[root@webserver2 ~]# dnf install httpd -y
[root@webserver2 ~]# echo webserver2:192.168.0.20 > /var/www/html/index.html
[root@webserver2 ~]# systemctl enable --now httpd

在LVS中测试

[root@LVS ~]# curl 192.168.0.10
webserver1:192.168.0.10
[root@LVS ~]# curl 192.168.0.20
webserver2:192.168.0.20

 LVS中安装LVS软件

[root@LVS ~]# dnf install ipvsadm -y

在LVS中添加调度策略
rr为轮询调度算法

ipvsadm -A -t 172.25.254.100:80 -s rr

-m 表示使用 NAT网络地址转换模式。

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

查看

[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  172.25.254.100:80 rr
  -> 192.168.0.10:80              Masq    1      0          0         
  -> 192.168.0.20:80              Masq    1      0          0

将 ipvsadm 配置保存到 /etc/sysconfig/ipvsadm 中。

清空规则
 

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

用另一台测试机进行测试(172.25.254.0网段)

[root@test ~]# for i in {1..10}
> do
> curl 172.25.254.100
> done
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver1:192.168.0.10

 

############################################################################ 

 

DR模式实验

LVS配置

eth1:IP为192.168.0.50 网关为192.168.0.100 

路由器配置

添加一张网卡设定为仅主机模式

eth0:设定NAT模式 IP为172.25.254.100

eth1:设定仅主机模式 IP为192.168.0.100 删除网关和dns

打开路由核心功能

[root@router ~]# cat /etc/sysctl.conf 
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

net.ipv4.ip_forward=1

[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

客户机

从母盘中克隆出一台虚拟机充当客户端

IP:172.25.254.20  gateway:172.25.254.100

[root@client ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.25.254.100  0.0.0.0         UG    100    0        0 eth0
172.25.254.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0

解决vip响应问题

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

(1)在前端网关做静态绑定

(2)在各RS使用arptables

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

限制响应级别:arp_ignore

0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce

0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告 2:必须避免将接口信息向非本网络进行通告

[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/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@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/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 
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

策略配置

将之前的策略清空

[root@LVS ~]# ipvsadm -C
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

添加策略

[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
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.200:80 wrr
  -> 192.168.0.10:80              Route   1      0          0         
  -> 192.168.0.20:80              Route   2      0          0       

客户端访问

root@client ~]# for i in {1..10}
> do
> curl 192.168.0.200
> done
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver2:192.168.0.20

############################################################################ 

 防火墙mark标记

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

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

问题呈现

在RS1和RS2中安装mod_ssl模块,让RS支持https,重启apache

webserver1

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

webserver2 

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

设置调度

[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:443 -g
[root@LVS ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g
[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.0.200:80 rr
  -> 192.168.0.10:80              Route   1      0          0         
  -> 192.168.0.20:80              Route   2      0          0         
TCP  192.168.0.200:443 rr
  -> 192.168.0.10:443             Route   1      0          0         
  -> 192.168.0.20:443             Route   1      0          0

此时两个集群调度的主机都为同一个。当客户端访问的时候两个请求都到达了同一台主机上,所以就会出现轮询错乱的问题

利用mark标记来解决调度问题

防火墙mark标记

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]

清空策略

[root@LVS ~]# ipvsadm -C

在LVS主机中为端口做标记

[root@LVS ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 66
[root@LVS ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
MARK       6    --  0.0.0.0/0            192.168.0.200        multiport dports 80,443 MARK set 0x42

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[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@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  66 rr
  -> 192.168.0.10:0               Route   1      0          0         
  -> 192.168.0.20:0               Route   1      0          0 

测试

[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2:192.168.0.20
webserver1:192.168.0.10

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值