一、LVS简介
1、什么是LVS?
LVS是Linux Virtual Server的简写,即Linux虚拟服务器,是一个虚拟的服务器集群系统。LVS工作在一台server上提供Directory(负载均衡器)的功能,本身并不提供服务,只是把特定的请求转发给对应的realserver(真正提供服务的主机),从而实现集群环境中的负载均衡。
【1】技术简介
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
【2】集群采用三层结构
一般来说,LVS集群采用三层结构,其主要组成部分为:
A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
【3】调度器
调度器是服务器集群系统的唯一入口点(Single Entry Point),它可以采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。
在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当客户请求到达时,调度器只根据服务器负载情况和设定的调度算法从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;当这个请求的其他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器可以提供不同的服务,当客户请求到达时,调度器可根据请求的内容选择服务器执行请求。因为所有的操作都是在Linux操作系统核心空间中完成的,它的调度开销很小,所以它具有很高的吞吐率。服务器池的结点数目是可变的。当整个系统收到的负载超过目前所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载。
对大多数网络服务来说,请求间不存在很强的相关性,请求可以在不同的节点上并行执行,所以整个系统的性能基本上可以随着服务器池的结点数目增加而线性增长。 共享存储通常是数据库、网络文件系统或者分布式文件系统。 服务器结点需要动态更新的数据一般存储在数据库系统中,同时数据库会保证并发访问时数据的一致性。静态的数据可以存储在网络文件系统(如NFS/CIFS)中,但网络文件系统的伸缩能力有限,一般来说,NFS/CIFS服务器只能支持3~6个繁忙的服务器结点。对于规模较大的集群系统,可以考虑用分布式文件系统,如AFS、GFS、Coda和Intermezzo等。分布式文件系统可为各服务器提供共享的存储区,它们访问分布式文件系统就像访问本地文件系统一样,同时分布式文件系统可提供良好的伸缩性和可用性。
【4】分布式锁管理器
此外,当不同服务器上的应用程序同时读写访问分布式文件系统上同一资源时,应用程序的访问冲突需要消解才能使得资源处于一致状态。这需要一个分布式锁管理器(Distributed Lock Manager),它可能是分布式文件系统内部提供的,也可能是外部的。开发者在写应用程序时,可以使用分布式锁管理器来保证应用程序在不同结点上并发访问的一致性。
负载调度器、服务器池和共享存储系统通过高速网络相连接,如100Mbps交换网络、Myrinet和Gigabit网络等。使用高速的网络,主要为避免当系统规模扩大时互联网络成为整个系统的瓶颈。
【5】监视器
Graphic Monitor是为系统管理员提供整个集群系统的监视器,它可以监视系统的状态。Graphic Monitor是基于浏览器的,所以无论管理员在本地还是异地都可以监测系统的状况。为了安全的原因,浏览器要通过HTTPS(Secure HTTP)协议和身份认证后,才能进行系统监测,并进行系统的配置和管理。
2、IPVS简介
IPVS 是 lvs 的第一部分负载调度器(load balancer)的实现 ,也就是最核心的部分,用来进行负载均衡,所以 IPVS主要实现了四种IP负载均衡技术 + 十种调度算法 来实现lvs的负载均衡功能。
<1>IP负载均衡技术
NAT工作模式
,简单来说就是传统的NAT,进出流量都需要经过调度器,调度器会选择一个目的服务器,将进入流量的目标IP改写为负载均衡到的目标服务器,同时源IP地址也会改为调度器IP地址。机制简单,但限制大,IPVS需要维护每个映射关系,而且进出入流量都需要经过调度器,实际上这个会成为瓶颈。
TUN工作模式
,即IP Tunneling模式。这种模式中,调度器将进入的包重新包成一个IP包,然后发送给选定的目的服务器,目的服务器处理后,直接将应答发送给客户(当然该重新封装的报文的源IP地址还是要填成调度器的)。
DR工作模式
,即Direct Routing模式。这种模式中,调度器直接重写进入包的mac地址,将其改为选定的目标服务器的mac地址,这样就可以到达服务器。但这样的话需要要求IPVS服务器需要和真实服务器在同一局域网内,且真实服务器必须有真实网卡(这样重写了mac地址的报文才可以才可以到达该服务器)
FULLNAT工作模式
<2>调度算法
IPVS在内核中的负载均衡调度是以连接为粒度的。在HTTP协议(非持久)中,每个对象从WEB服务器上获取都需要建立一个TCP连接,同一用户的不同请求会被调度到不同的服务器上,所以这种细粒度的调度在一定程度上可以避免单个用户访问的突发性引起服务器间的负载不平衡。
在内核中的连接调度算法上,IPVS已实现了以下十种调度算法:
轮叫调度(Round-Robin Scheduling)
加权轮叫调度(Weighted Round-Robin Scheduling)
最小连接调度(Least-Connection Scheduling)
加权最小连接调度(Weighted Least-Connection Scheduling)
基于局部性的最少链接(Locality-Based Least Connections Scheduling)
带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
目标地址散列调度(Destination Hashing Scheduling)
源地址散列调度(Source Hashing Scheduling)
最短预期延时调度(Shortest Expected Delay Scheduling)
不排队调度(Never Queue Scheduling)
二、VS/NAT
实验环境:
一台Director:server1
版本:Red Hat Enterprise Linux Server release 6.5
双网卡:
eth0:172.25.9.1/24 (VIP:外网IP)
eth1:192.168.9.1/24(DIP:内网IP)
两台RealServer:
Server2:192.168.9.2/24(网关必须指向Director的DIP)
Server3:192.168.9.3/24(网关必须执行Director的DIP)
一台Client: 172.25.9.250
实验步骤:
1.虚拟服务器sever1:
<1>添加网卡
<2>网络设置
[root@server1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
[root@server1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
示图:网络配置
示图:查看ip地址
<2>添加地址为172.25.9.1:80的虚拟服务,指定调度算法为轮转
[root@server1 ~]# ipvsadm -A -t 172.25.9.1:80 -s rr
<3>添加真实服务器,指定传输模式为NAT
[root@server1 ~]# ipvsadm -a -t 172.25.9.1:80 -r 192.168.9.2:80 -m
[root@server1 ~]# ipvsadm -a -t 172.25.9.1:80 -r 192.168.9.3:80 -m
<4>保存rule
[root@server1 ~]# /etc/init.d/ipvsadm save
<5>开启路由机制
永久开启:
[root@server1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@server1 ~]# sysctl -p
或者
临时开启:
[root@server1 ~]# sysctl -w net.ipv4.ip_forward=1
[root@server1 ~]# sysctl -p
<6>加载NAT模块
[root@server1 ~]# modprobe iptable_nat
2.真实服务器server2:
<1>配置网络
[root@server2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="static"
NBOOT="yes"
IPADDR=192.168.9.2
PREFIX=24
GATEWAY=192.168.9.1 ##网关指向server1
或者
[root@server2 ~]# ip addr add 192.168.9.2/24 dev eth0
[root@server2 ~]# route add default gw 192.168.9.1
示图1:IP
示图2:网关
<2>开启httpd服务
[root@server2 ~]# /etc/init.d/httpd start
3.真实服务器server3:
<1>配置网络
[root@server2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="static"
NBOOT="yes"
IPADDR=192.168.9.3
PREFIX=24
GATEWAY=192.168.9.1 ##网关指向server1
或者
[root@server2 ~]# ip addr add 192.168.9.3/24 dev eth0
[root@server2 ~]# route add default gw 192.168.9.1
示图1:IP
示图2:网关
<2>开启httpd服务
[root@server2 ~]# /etc/init.d/httpd start
4.测试:
客户端测试:
Director负载均衡测试:
三、VS/TUN隧道
实验环境:
一台Director:server1
版本:Red Hat Enterprise Linux Server release 6.5
单网卡:
eth0:172.25.9.1/24
两台RealServer:
Server2:172.25.9.2/24
Server3:172.25.9.3/24
一台Client: 172.25.9.250
实验步骤:
1.虚拟服务器sever1:
<1>网络设置
[root@server1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
<2>开启隧道服务
[root@server1 ~]# modprobe ipip
<3>添加ip并开启
[root@server1 ~]# ip addr add 172.25.9.100/24 dev tunl0
[root@server1 ~]# ip link set up dev tunl0
<4>添加路由到172.25.9.100
[root@server1 ~]# route add -host 172.25.0.100 dev tunl0
<5>开启路由机制
[root@server1 ~]# sysctl -w net.ipv4.ip_forward=1
[root@server1 ~]# sysctl -p
<6>添加地址为172.25.9.100:80的虚拟服务,指定调度算法为轮转
[root@server1 ~]# ipvsadm -A -t 172.25.9.100:80 -s rr
<7>添加真实服务器,指定传输模式为隧道模式
[root@server1 ~]# ipvsadm -a -t 172.25.9.100:80 -r 172.25.9.2:80 -i
[root@server1 ~]# ipvsadm -a -t 172.25.9.100:80 -r 172.25.9.3:80 -i
2.真实服务器server2:
<1>配置网络
[root@server2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="static"
NBOOT="yes"
IPADDR=172.25.9.2
PREFIX=24
<2>开启隧道服务
[root@server2 ~]# modprobe ipip
<3>添加ip并开启
[root@server2 ~]# ip addr add 172.25.9.100/24 dev tunl0
[root@server2 ~]# ip link set up dev tunl0
<4>添加路由到172.25.9.100
[root@server2 ~]# route add -host 172.25.9.100 dev tunl0
<5>禁止反向过滤机制
[root@server2 ~]# sysctl -a | grep rp_filter
[root@server2 ~]# sysctl -w net.ipv4.conf.tunl0.rp_filter=0
<6>开启路由机制
[root@server2 ~]# sysctl -w net.ipv4.ip_forward=1
[root@server2 ~]# sysctl -p
<7>开启arp策略
[root@server2 ~]# /etc/init.d/arptables_jf restart
示图:查看arp策略
<8>开启httpd服务
[root@server2 ~]# /etc/init.d/httpd start
3.真实服务器server3:
<1>配置网络
[root@server2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="static"
NBOOT="yes"
IPADDR=172.25.9.3
PREFIX=24
<2>开启隧道服务
[root@server2 ~]# modprobe ipip
<3>添加ip并开启
[root@server2 ~]# ip addr add 172.25.9.100/24 dev tunl0
[root@server2 ~]# ip link set up dev tunl0
<4>添加路由到172.25.9.100
[root@server2 ~]# route add -host 172.25.9.100 dev tunl0
<5>禁止反向过滤机制
[root@server2 ~]# sysctl -a | grep rp_filter
[root@server2 ~]# sysctl -w net.ipv4.conf.tunl0.rp_filter=0
<6>开启路由机制
[root@server2 ~]# sysctl -w net.ipv4.ip_forward=1
[root@server2 ~]# sysctl -p
<7>开启arp策略
[root@server2 ~]# /etc/init.d/arptables_jf restart
示图:查看arp策略
<8>开启httpd服务
[root@server2 ~]# /etc/init.d/httpd start
4.客户端测试: