LVS(二)

前面已经基本介绍了一下 LVS 的基础内容,包括 LVS 是什么以及 LVS 的算法,现在给大家介绍一下 LVS 的管理以及使用。

一、 LVS 模型

LVS 有三种模型:dr ,nat , tun 。用的稍微多一点的就是 nat 模型与 dr 模型。所以这里对这两种模型多做以下介绍。

nat 模型

LVS-dr模型

这个过程又分为四个部分:

  1. 客户端发送请求经过互联网到达 director(也就是 LVS 所在的调度服务器) 所在的网段,路由器(或者交换机)将请求交给 director 。

  2. director 服务器通过用户定义的算法(这里以 rr(轮询算法) 算法为例)选择后端的一台真实的 web 服务器,并将请求报文的目标地址修改为选定的后端 web 服务器的地址(在这之前,客户端发送的请求报文源地址为客户端的地址(当然如果客户端的地址是私网地址,那么这里源地址就是客户端连接互联网的公网地址),目的地址是 LVS 服务器的地址)并将该请求转发给后端的 web 服务器

  3. web 服务器接受到请求之后处理请求并将响应报文发送给 director ,这时的响应报文的响应首部的源地址是 web 服务器的地址,目标地址是 client 客户端的地址。

  4. director 服务器接收到响应报文之后将报文进行重新封装,将响应报文的源地址修改为 director 服务器的地址,目的地址不变。通过路由器发送给客户端。

在这个过程中,director 需要作以下配置

  • director 必须有两块网卡两个地址(当然在做实验的时候可以只用一块网卡,绑定一个 IP 别名即可),一个地址是公网地址,能够接受客户端的请求。另外一个是与 web 服务器在同一个网段的局域网地址,能够将客户端的请求转发给 web 服务器,并且这个地址的网关不需要指定。
  • director 需要配置路由转发的功能,不然报文无法通过一块网卡进来从另外一块网卡进去
  • director 的 SELinux 与 IPTABLES 都要关闭,不然容易造成冲突

web 服务器需要作的配置

  • web 服务器需要关闭 IPTABLES 与 SELinux
  • web 服务器的网关要指向 director 的地址,这个地址是与 web 服务器在同一个网段的网卡的地址。

dr 模型

dr 模型

这个过程被分为四部分

  1. 客户端将请求报文通过路由器与交换机发送给 director
  2. director 通过用户定义的算法,从后端的 web 服务器中选择一台进行响应。通过广播取得选择的那台 web 服务器的 MAC 地址。这个时候 director 便将请求报文的 MAC 地址修改为选择的那台 web 服务器的 MAC 地址,源 IP 地址与目标 IP 地址都不进行修改。封装好之后发送给局域网中的交换机。
  3. 交换机收到请求报文之后,根据目标 MAC 地址发送给选择的那台 web 服务器,这样 web 服务器便收到了请求报文。
  4. web 服务器获取数据封装成响应报文,不经由 director 服务器,直接发送给客户端。

这个过程需要对 director 进行以下设置:

  • director 与 nat 模式一样,IPTABLES 与 SELinux 都要关闭
  • 路由选择要开启
  • 两快网卡,绑定两个 IP 地址。网卡一绑定公网 IP ,能够让客户端能够访问到。网卡二绑定私网 IP ,并且要与后端的 web 服务器在同一个物理网段。

要对后端的 web 服务器做以下设置:

  • IP 地址要与 director 网卡二的 IP 处于同一个物理网段,这样 director 才能够通过交换机将请求报文发送给 web 服务器。
  • web 服务器还要绑定一个 IP 地址,这个 IP 地址要与 director 网卡一的 IP 相同。这样 web 服务器收到请求报文之后,在解封装的时候不会因为目标 IP 不是本地而丢弃。这个 IP 我们称之为 VIP(前面 LVS(一)中有提到过)
  • web 服务器绑定的 VIP 可以作为别名绑定在网卡上或者 IO 回环地址上面。但是绑定之后不会进行广播,而且当别的主机广播的时候也不能进行响应。所以要对内核参数进行修改。
  • 要设置网关,通过这个网关要能够连接外网,这样才能够将数据报文发送给客户端。

这个过程可能稍微难以理解一点,下面我再进行详细的描述一下,为什么要对 web 服务器作那些配置。

首先,LVS 的 dr 模型有一个特点,就是请求报文在通过 director 转发给后端的 web 服务器的时候,不修改请求报文的源 IP 地址与目标 IP 地址,而仅仅只是将目标的 MAC 地址修改为选定的 web 服务器的 MAC 地址(后端 web 服务器的 MAC 地址是通过 web 服务器的 RIP 获取的)。因为我们知道,主机与主机之间通信的时候是通过 MAC 地址进行通信的,交换机在进行转发的时候也是通过 MAC 地址进行转发的,它才不会去管报文的目标 IP 地址与 MAC 地址是否匹配。所以这个时候 web 服务器是能够收到这个请求报文的。当然这个前提是 director 的 DIP 要与 web 的 RIP 在同一个物理网段(前面有讲到过 DIP 与 RIP,这里不作过多描述)。

那么现在 web 服务器已经可以确定收到了这个请求报文。但是这又有一个问题,那就是这个时候请求报文的源 IP 地址是客户端的 IP 地址,目标 IP 地址是 director 的 VIP ,和我的网卡的 IP 地址不同啊。一般对于这种情况,计算机都是会将报文进行转发或者丢弃的。但是,为了让 web 服务器能够将报文接受进来,所以要再绑定一个 IP ,这个 IP 就是 director 的 VIP ,可以作为别名绑定在网卡上面,也可以绑定在 lo 回环地址上面。

这个时候 web 服务器已经能够将请求报文接受进来进行处理了。但是,这里还是又出现了一个问题。那就是一个网段有多个相同的 VIP ,当请求报文通过路由器到达交换机的之后,交换机进行广播,目标 IP 为 VIP 的主机的 MAC 地址是多少。这个时候 director 与后端的 web 服务器组同时进行响应,那么交换机将数据给谁呢?所以,这里要保证 web 服务器组中绑定的 VIP 在交换机进行广播的时候不进行响应。同时,我们又知道,每当一个主机设置了一个 IP ,那么这个 IP 就会发送一个广播,告诉这个网段的所有主机,我已经使用了这个 IP。所以在 web 服务器上绑定 VIP 的时候我们要禁止 VIP 进行广播。

这样进行设置之后,请求报文就会正常到达后端的 web 服务器,并且被处理。当处理完之后,web 服务器就需要将封装好之后的响应报文发送给 client 客户端。因为请求报文的源地址就是客户端的地址。所以这个时候主机要指定一个能够访问外网的网关。


二、ipvsadm 的使用

由于 LVS 已经被编译进内核,是内核中的组件,所以与防火墙相同,在用户空间需要工具去进行管理,这个工具就是 ipvsadm

使用 CentOS 6.9 直接安装 ipvsadm

# yum install -y ipvsadm
# rpm -ql ipvsadm
/etc/rc.d/init.d/ipvsadm
/etc/sysconfig/ipvsadm-config
/sbin/ipvsadm
/sbin/ipvsadm-restore
/sbin/ipvsadm-save


# rpm -ql iptables 
/bin/iptables-xml-1.4.7
/etc/rc.d/init.d/iptables
/etc/sysconfig/iptables-config
/sbin/iptables-1.4.7
/sbin/iptables-multi-1.4.7
/sbin/iptables-restore-1.4.7
/sbin/iptables-save-1.4.7

从这里可以看出,ipvsadm 与 iptables 一样,都仅仅只是命令行的工具,用来控制内核中的真正的工作组件的。只不过 iptables 的模块文件多一点而已

ipvsadm 在使用过程中又被分为两类,一是管理集群服务,二是管理集群服务中后端的真实服务器。命令如下:

管理集群服务命令

ipvsadm -A|E -t|u|f service-address [-s scheduler]
ipvsadm -D -t|u|f service-adress
ipvsadm -C
ipvsadm -S
ipvsadm -L|l [options]
ipvsadm -R
ipvsadm -Z [-t|u|f service-address]

-A:添加
-E:修改
-D:删除
-C:清空所有规则
-S:将规则保存至相应的文件,系统默认文件为 /etc/sysconfig/ipvsadm
-L:查看配置的集群,这里有几个选项需要用上
   -n: 基于数字格式显示地址和端口
   -c:显示详细连接
   –stats:统计已经处理的连接
   –rate:速率
   –exact:精确值
-R:将保存到 /etc/sysconfig/ipvsadm 中的配置读取出来
-Z:将接受的字节清零

-t:tcp 协议
-u: udp 协议
-f: mark,这是 fwm 机制,Firewall Mark,对访问的某些端口进行标记,并根据这个标记进行访问,后面有谈到这个机制。
-s:指定算法,算法在前面已经讲到过,总共在内核中记录了十种算法,其实常用的也就那么几种。

管理集群中后端的真实 web 服务器的命令

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

-a:增加
-e:修改

-t:tcp
-u:udp
-f:fwm 机制
-r:指定后端真实 web 服务器的地址
-g:表示 dr 模型
-i:表示 tun 模型
-m:系统默认,表示 nat 模型
-w:指定服务器的权重


三、配置 LVS-nat 模型
  1. director 使用 CentOS 7 ,两块网卡,一个绑定 IP 为 :172.18.49.8/16,一块网卡绑定 IP 为:192.168.49.1/24
  2. web 服务器两台,都是 CentOS 6,一台 IP 为:192.168.49.80/24,另外一台的 IP 为:192.168.49.81/24,两台 web 服务器的网关都指向 director 的 IP 地址:192.168.49.1

director 设置

1、添加两块网卡,一台使用桥接模式(相当于公网地址),一台使用 vmnet2 模式(相当于局域网),并配置 IP 地址。

director 网卡配置

对新加的网卡进行配置
# cd /etc/sysconfig/network-scripts/ 

由于新加的网卡没有配置文件,所以这里将第一块网卡的配置文件拷贝过来进行更改即可
# cp ifcfg-ens32 ifcfg-ens34

修改配置文件将其中的 UUID 以及 HWADDR 删除,并配置静态 IP ,我在下面配上一张图,按图修改即可,路由不需要指定
# vim ifcfg-ens34
# systemctl restart network

网卡一我配置的是静态地址
IP:172.18.49.8
NetMask:255.255.0.0
GateWay:172.18.0.1
这里不过多赘述

     
     网卡 ifcfg-ens34 配置

2、开启 director 的路由转发功能

# vim /etc/sysctl.conf
在末尾添加以下命令
net.ipv4.ip_forward = 1

重读配置文件
# sysctl -p

查看是否修改成功
# cat /proc/sys/net/ipv4/ip_forward
结果为 1 表示修改成功

3、关闭 IPTABLES 与 SELinux

# iptables -F
# iptables -X
# setenforce 0

web 服务器的配置

1、修改网卡工作方式,与上述 director 相似,首先将网卡的工作方式变成 VMnet2,注意,这里一定要是 VMnet2,不然就不与 director 的第二块网卡在同一个网段了。

2、配置 IP 地址,将 IP 地址修改为 192.168.49.80 ,NetMask 修改为 255.255.255.0 ,GateWay 修改为 192.168.49.1 ,注意,这里的网关一定要指向 director 的第二块网卡的 IP 地址。

修改后的情况如下:

      web ifcfg-eth0 配置

3、清除 IPTABLES 规则,关闭 SELinux

两台都是一样的

4、搭建 web 服务,这里以 httpd 为例

第一台 web 服务器
# yum install -y httpd
# cd /var/www/html
# rm -rf index.html
# for i in {1..10}; do echo "Page $i for web1" > test$i.html; done

第二台 web 服务器
# yum install -y httpd
# cd /var/www/html
# rm -rf index.html
# for i in {1..10}; do echo "Page $i for web2" > test$i.html; done

使用浏览器进行访问,最后的结果应该是这样的

    web 访问结果

Page 1 for web1Page 1 for web2 两个结果交替相互出现


四、LVS-dr 模型

LVS-dr 模型比较复杂,这里我在中间使用了一个路由器进行转发

route 路由器添加两块网卡,一块网卡桥接模式,地址:172.18.49.6/16。一块网卡 VMnet2 模式,绑定两个地址:192.168.49.1/24,192.168.0.1/24。网关不指定,那么 172.18.49.6 与 192.168.0.1 相当于公网 IP 地址,192.168.49.1 相当于局域网 IP 地址

client 客户端地址:172.18.49.12/16,网关指向路由器的 IP:172.18.49.6

director (也就是 LVS 所在的服务器)一块网卡,VMnet2 模式,地址:192.168.49.3/24,192.168.0.2/24。192.168.49.3 表示 DIP,192.168.0.2 表示 VIP ,默认网关指向 192.168.0.1

web1 服务器一块网卡,绑定 VIP 和 RIP,VIP 地址:192.168.0.2/32 ,RIP 地址:192.168.49.80/24,默认网关指向 192.168.49.1

web2 服务器一块网卡,VIP 与 web1 相同,RIP 地址:192.168.49.81/24,默认网关指向 192.168.49.1

LVS-dr 模型

route 路由器的配置

1、添加两块网卡,绑定三个地址,这里以 CentOS 7 为例

route-网卡

桥接模式的网卡配置 IP 为:172.18.49.6/16,只需要配置网卡配置文件即可,这里在 nat 模型中将解过,这里对配置过程就不做赘述,配置完成之后应该是这样的:

网卡一(桥接模式):
IPADDR=172.18.49.6
NETMASK=255.255.0.0

网卡二(VMnet2模式):
IPADDR=192.168.0.1
NETMASK=255.255.255.0

网关不指定,同时在网卡二上在绑定一个IP(这里网卡二的名称叫 ens37)
# ifconfig ens37:0 192.168.49.1/24

2、开启路由转发功能

# vim /etc/sysctl.conf
在最末尾添加上以下内容
net.ipv4.ip_forward = 1

重读配置文件
# sysctl -p

director 的配置

1、一块网卡(VMnet2),绑定两个 IP

编辑网卡配置文件,绑定静态 IP ,作为 VIP
IPADDR=192.168.0.2
NETMASK=255.255.255.0
GATEWAY=192.168.0.1 

再绑定一个 IP 地址,作为 DIP
# ifconfig ens32:0 192.168.49.3/24

2、开启路由转发功能

web 服务器的配置

1、修改内核参数,让系统在配置 VIP 之后不进行广播,别人广播之后不进行响应

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

arp_ignore:系统在配置 IP 之后不进行广播,其他主机在进行询问的时候也不进行响应
arp_announce:表示报文从哪个网卡进来就从哪个网卡出去

2、一块网卡,两个 IP 地址

编辑网卡配置文件,绑定静态 IP 作为 RIP
IPADDR=192.168.49.80
NETMASK=255.255.255.0
GATEWAY=192.168.49.1
网关要指向路由器的地址

绑定 VIP 在 lo 回环地址上
# ifconfig lo:0 192.168.0.2/32 broadcast 192.168.0.2 up

必须要先修改内核参数,在配置 VIP

完成以上配置表示环境已经搭建完成,可以检查一下。在客户端上使用 ping 命令,测试是否可以连接上 VIP,如果可以连接表示成功。

测试环境

现在对 ipvsadm 策略进行配置:

在 director 主机上
# ipvsadm -A -t 192.168.0.2:80 -s rr
# ipvsadm -a -t 192.168.0.2:80 -r 192.168.49.80 -g
# ipvsadm -a -t 192.168.0.2:80 -r 192.168.49.81 -g
# 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.2:80 rr
  -> 192.168.49.80:80             Route   1      0          0         
  -> 192.168.49.81:80             Route   1      0          0  

在配置策略的时候,一定要使用 -g 选项,因为 -g 表示 dr 模型。-m 是 nat 模型

检查 IPTABLES 与 SELinux,检查 web 服务器上的 80 端口是否已经监听,能够测试得通。

以上所有配置就完成了,客户端可以随便找一台主机进行测试,这里我使用的是 172.18.49.12 网段的主机,并且网关指向了路由器网卡一的 IP 地址。下面是我测试的结果:

测试结果


五、LVS 的 FWM机制

FWM:FireWall Mark,能够通过防火墙去进行标记,将访问目标地址的某些目标端口进行打标,然后 LVS 通过这些标记进行调度。一般适用于 80/443 端口,也就是 http/https。

防火墙打标方法

# iptables -t mangle -A PREROUNTING -d 172.18.49.7 -p tcp --dport 80 -j MARK --set-mark 10

-j MARK –set-mark 10

10只是指定的一个标记,可以指定其他的标记,如:11。不过一般是在 mangle 上的 PREROUTING 上进行打标。除了对 httpd 进行打标之外还可以对 sshd 进行打标。

LVS 通过标记进行调度方法:

# ipvsadm -A -f 10 -s rr
# ipvsadm -a -f 10 -r 172.19.49.80 -g
# ipvsadm -a -f 10 -r 172.19.49.81 -g

LVS 作为反向代理服务器,能够在在前端 web 服务器压力过大的时候能够将一些请求分发至其他的 web 服务器上面,因为 LVS 在工作的时候能够对外宣称自己就是一台 web 服务器,让外界的用户在访问网页的时候访问我,我再以客户端的身份去后端的提供页面的真实 web 服务器(Real Server)上去取数据,将 Real Server 响应的数据再转交给用户。这就是反向代理的一部分功能,除此之外,还能够实现以下功能:

  • 能够隐藏后端的真实服务器,减少了后端的服务器被攻击的可能
  • 能够通过用户发送的请求内容,将不同的请求发送给后端不同的服务器。比如,如果是手机端发送过来的请求,那么可以把请求数据发送给后端专门能够处理该请求的服务器;如果是动态请求,转发给后端的处理动态请求的服务器组,这样就实现了动静分离…
  • 能够提供缓存,将用户访问较多的资源缓存在代理服务器上,这样既加快了用户的访问速度,又减少了后端的真实服务器的负载。
  • 能够检测后端服务器的健康状况,如果后端某一个服务器发生故障,则会将发往该服务器的请求分发到其他服务器上。
  • 能够根据后端服务器的负载状况,自动增加或者减少请求。

LVS 作为反向代理服务,提供了四层反向代理。也就是说当请求数据发送给了 LVS 之后,LVS 当中的规则从内核中将数据报文截获,直接发送给后端的 web 服务器。这样一来,LVS 不需要监听在某个套接字上面,不需要受限制于 Linux 中的套接字的限定,性能极高,理论上来说优化到极致的 LVS 可以支持五百万并发连接。

但是恰恰也是因为 LVS 工作在内核中,所以它没有代理服务器的大部分的功能,如:不支持健康状态监测、不支持后端的业务分离,动静分离、不能提供缓存…相对于其他的反向代理服务来说,LVS 还是一般适用于大规模的电商公司。所以对一般规模的电商公司来说,LVS 作为反向代理不是一个明智的选择,有点杀鸡用牛刀的感觉。选择 Nginx 或者 Haproxy 会更加好一些。如果 Nginx 或者 Haproxy 不足以承载现有并发,可以在前端再加上一个 LVS ,对负载均衡进行负载均衡。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值