什么是负载均衡:

1.负载均衡集群—LB Cluster (Load Balance)

当大量用户并发访问时,将请求转发到不同的机器止实现负载均衡。我们这里使用lvs实现。LVSLinux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。

什么是IPVS:

        ipvs称之为IP虚拟服务器(IP Virtual Server,简写为IPVS)。是运行在LVS下的提供负载平衡功能的一种技术,工作在OSI定义的第四层,可以在编译linux内核的时候将功能整合进去,IPVS是LVS的关键,因为LVS的IP负载平衡技术就是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。

Director调度器:用户请求先到达的主机。它根据工作模型与调度方法把请求转发到真实服务器上

RS:RealServer,真正响应用户请求的服务器

VIP:Virtual IP,一般为一个公网IP,是用户直接访问的IP,此IP所在的主机不直接提供服务,所以该主机称为Virtual Server,一般为调度器,该IP称为VIP

DIP:Direct IP,与RS通信的IP

RIP:Real IP,真正响应用户请求的服务器IP

CIP:Client IP,客户端IP

LVS的工作模型:

1、VS/NAT(Virtual Server via Network Address Translation)

客户端请求到达Director,Director根据ipvs上生效的调度算法修改报文的目标IP为真实服务器的RIP,然后转发到后端的RS上,RS收到报文后构建响应报文,然后再发到Director,Director再将报文的源IP也就是RIP还原为VIP发给客户端,这一过程与DNAT很相似。

服务器集群之负载均衡集群—LB Cluster (Load Balance)_cluster

NAT: 

1、RealServer应该使用私有IP地址;

2、RealServer的网关应该指向DIP;

3、RIP和DIP应该在同一个网段内;

4、进出的报文都得经过Directory,在高负载下,Directory会成为系统性能瓶颈;

5、支持端口映射;

6、RealServer可以使用任意OS;


2VS/DR(Virtual Server via Direct Routing)

服务器集群之负载均衡集群—LB Cluster (Load Balance)_ipvsadm_02


        因为NAT模型下Director很容易成为整个系统的瓶颈,所以DR模式下Director不再转发响应的报文,相对于响应报文,请求报文要小的多,这样Director就被释放出来了。

        当请求报文到达路由后,路由会发出广播,得到VIP的mac地址,把报文目标MAC改为VIP MAC地址并交给Director,Director根据调度算法选择一个RealServer,把报文中的目标mac改为选择的RealServer的mac,然后发给交换机,交换机根据报文目标mac将报文发向了RealServer,RealServer收到报文后,会检查报文的目标IP,发现目标IP是VIP而本机没有VIP就舍弃报文,所以RS上必须设置个VIP地址,然而这样会导致ARP响应冲突的,我们必须解决这个问题才能实现整个流程,解决这个问题的方法有很多,1、修改路由,使用静态ARP,2、在RS上使用arptables,禁止响应对VIP的ARP广播请求,3、在RS上修改其内核参数,并向VIP配置在与RIP不同的接口的别名上。常用的是第三种,不响应关于它的任何ARP请求,也不向外发送关于VIP的ARP广播,这样就不会导致ARP冲突了。这时当报文到达RS时,RS会接受报文,并响应请求,但是默认情况下,响应报文的源IP是RIP,当这个报文发到Client时,客户端检查报文会发现源IP不是自己请求的IP,会舍弃该报文,所以RS的响应报文源IP应该是VIP,这就需要在RS中加条路由,凡是目标IP是VIP的报文,先从定义VIP那设备出去,这样源IP就是VIP了。响应报文发向Switch,经由Router响应用户,不用经过Director了。这是生产环境中最常用的模型。


DR模式的特点:

1.DIP和RIP必须在同一个物理网络中,它的转发机制是基于Mac地址转发

2.RIP可以使用私有地址(建议使用公网地址)

3.入站报文经过Directory,出站则由RealServer直接响应Client

4.集群节点(Real Server)的网关一定不能指向DIP

5.不支持端口映射

6.绝大多数的操作系统都可以实现Real Server

7.比NAT模型的Director能带动更多的RealServer

 

LVS调度算法:

分为两类:静态算法动态算法

静态:仅根据算法本身调度,不关心RS上的连接状态      

RR(RoundRobin):轮调,所有的请求依次轮流分配到后端RS,如果机器性能不一致则负载均衡失去意义。    

WRR:加权weight,不能反映服务器的状态,WRR在RR的基础上加上了权重,能者多劳,性能好的多分配,性能差的少分配,比例与设置的权重值成正比。

sh:源地址哈希,持久会话。

dh:同一个客户端请求同一个RS,相应也会通过同一个防火墙,解决防火墙的连接追踪问题。 

lc(least connection)Overhead=Active*256+Inactive,计算发给overhead值小的服务器。

wlc:默认的调度算法,Overhead=(Active*256+Inactive)/Weight

sed(shortest Expect Delay):Overhead=(Active+1)*256/Weight

nq(Never Queue)

lblc:(dh+lc) Locality-based Least Connection

lblcr:Replicated and Locality-based least Connection,可以实现缓存服务器彼此之间互相复制缓存对象,是lblc的改进版,可以使对负载均衡的损耗降到最低。


实验一、现在我们来实现工作于VS/NAT模型的负载均衡

我通过使用ipvsadm工具管理ipvs,先安装程序。

  • yum install ipvsadm -y

ipvsadm:

  • ipvsadm -A|E -t|u|f service-address [-s scheduler]

添加一个集群服务,一个服务地址必须唯一,定义方式三组合一,IP地址、端口和协议,二者选一。

这官方的翻译有点难懂哈,其实格式就是IP:端口。

  • -A, --add-service

Add a virtual service. A service  address  is  uniquely  defined  by  a

triplet:  IP  address, port number, and protocol. Alternatively, a vir-

tual service may be defined by a firewall-mark.

  • -E:编辑

  • -t:tcp

  • -u:udp

  • -f:firewall mark

  • service-address:VIP:Port

  • -s:指定调度算法

  • -C:清空规则

  • -Z:重置计数器

  • -L:查看

        -n

        --rate:查看速率

        --stats:查看状态

        --timeout:查看超时信息

        -c:显示连接

example:ipvsadm -A -t 172.16.100.3:80 -s rr

  • ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]

添加一个真实服务器到集群

  • -a, --add-server

Add a real server to a virtual service.

编辑一个集群里的真实服务器

  • -e, --edit-server

Edit a real server in a virtual service.

从集群删除一个服务器

  • -d, --delete-server

Remove a real server from a virtual service.

  • -r, --real-server 指定RealServer地址

  • -g:dr模型(默认)

  • -i:tun模型

  • -m:nat模型

  • -w:weight

将一个服务器添加到集群:

example:ipvsadm -a -t 172.16.100.3:80 -r 192.168.10.2 -m 

从集群删除一个服务器:

example:ipvsadm -d -t 172.16.100.3:80 -r 192.168.10.7

保存:

service ipvsadm save

/etc/sysconfig/ipvsadm

ipvsadm -S > /paht/to/ipvsadm.rules    保存规则

ipvsadm -R < /path/to/ipvsadm.rules    恢复规则

实验环境拓扑:

服务器集群之负载均衡集群—LB Cluster (Load Balance)_ipvsadm_03


配置Web服务,配置IP地址这些我就省略了。

配置Director虚拟IP。

  • ifconfig eth0:0 192.168.1.220/24

添加一个集群

  • ipvsadm -A -t 192.168.1.220:80 -s rr

添加RealServer到集群

  • ipvsadm -a -t 192.168.1.200:80 -r 172.16.1.2 -m

  • ipvsadm -a -t 192.168.1.200:80 -r 172.16.1.3 -m

查看列表

  • ipvsadm -L -n

服务器集群之负载均衡集群—LB Cluster (Load Balance)_LVS_04

开启数据包转发功能

  • echo '1' > /proc/sys/net/ipv4/ip_forward

现在我们用浏览器测试,第一次访问。

服务器集群之负载均衡集群—LB Cluster (Load Balance)_cluster_05

测试第二次访问。

服务器集群之负载均衡集群—LB Cluster (Load Balance)_LVS_06


查看状态

  • ipvsadm -L -n --stats

服务器集群之负载均衡集群—LB Cluster (Load Balance)_cluster_07

由此可以看出他们的连接都是平均的。

现在我们换一个调度算法。

  • ipvsadm -E -t 192.168.1.220:80 -s wrr

修改服务器权重

  • ipvsadm -e -t 192.168.1.220:80 -r 172.16.1.2 -m -w 2

查看列表

  • ipvsadm -L -n

服务器集群之负载均衡集群—LB Cluster (Load Balance)_负载均衡_08现在对服务器进行压测,再看一下状态。

服务器集群之负载均衡集群—LB Cluster (Load Balance)_LVS_09

实验二、实现工作于VS/DR模型的负载均衡

环境拓扑:

服务器集群之负载均衡集群—LB Cluster (Load Balance)_ipvsadm_10

配置两台Web服务器,已经配置IP地址,过程我就省略了。

RealServer的配置:

  • echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

  • echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

  • echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

  • echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

  • ifconfig lo:0 192.168.1.200  broadcast 192.168.1.200 netmask 255.255.255.255 up

  • route add -host 192.168.1.200 dev lo:0

Director配置:

  • ifconfig eth0:1 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255 up

  • route add -host 192.168.1.200 dev eth0:1

  • iptables -F

  • iptables -Z

  • ipvsadm -C

  • ipvsadm -A -t 192.168.1.200:80 -s wlc

  • ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.10 -g -w 2

  • ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.11 -g -w 3

  • ipvsadm -L -n

服务器集群之负载均衡集群—LB Cluster (Load Balance)_ipvsadm_11

进行压力测试,查看状态。

服务器集群之负载均衡集群—LB Cluster (Load Balance)_cluster_12

LVS Persistent 

    由于http是无状态的连接,客户每次请求会被当做新请求,比如我们登录了一个论坛,以刷新页面,服务器会把你当新访问,你还得重新登录,这样很不方便,尤其在电子商务类的网站上,好不容易选了好多商品准备付款,刷新了一次或者网页跳转了一次信息都丢失了。为了追踪客户的状态,才有了cookies 和session。cookies是什么?它是动态网站发给每个客户端的一个识别码SessionID,识别码是有有效期的。session中文意思是会话,服务器端发给客户端一个识别码,服务器端会也会把这个识别码保存到文件上,这个文件包含了客户端的识别码与一些客户端访问过页面的信息,所以我们登录论坛后,服务器会给我们发一个SessionID,浏览器会自己保存下来,当我们再次访问的时候,httpd请求首部会包含你的SessionID,服务器收到请求报文后会查看该SessionID,如果服务器上有该sessionID并在有效期内,则验证通过,刚才的访问状态还会存在,如果登录信息,比如购物车中的商品。

但是负载均衡以后,客户端请求可能被调度到不同的RealServer,而其他的RealServer中并没有该客户端的Session认证文件,这样就又无法追踪客户状态了,所以LVS引入了持久连接,它会启用一段内存空间生成一个hash表用来保存客户端与服务器的请求状态,凡是来自同一个IP的客户端都会被调度同一个RealServer,当然这个持久连接是有有效期的。持久连接有三种:


PCC Persistent client connections 持久客户端连接,将IP的所有请求都转发到一个RS。

定义方式:

  • ipvsadm -A -t 172.16.1.3:0 -s rr -p

  • ipvsadm -a -t 172.16.1.3:0 -r 192.168.1.2 -g

  • ipvsadm -a -t 172.16.1.3:0 -r 192.168.1.3 -g

这里端口写的是0,表示所有端口请求都定义到一个服务器。


PPC persistent port connections  将IP中的一个服务转发到一个RS


PFM—— 基于防火墙标记的持久连接,可以将几个服务定义为同一种标记转发。  

iptables为定义的服务报文打上防火墙标记,凡是有该防火墙标记的服务请求LVS都会根据他们的来源IP把他们调度到同一个RS上。

要想实现给一个数据包打标,需要在mangle表的PREROUTING链上实现。

example:

iptables -t mangle -A PREROUTING -d $VIP -p tcp --dport 80 -j MARK --set-mark 10 (0-99)均可

iptables -t mangle -A PREROUTING -d $VIP -p tcp --dport 443 -j MARK --set-mark 10

在定义集群的时候,则可以使用-f选项。

  • ipvsadm -A -f 10 -s rr -p 

实验三、构建一个DR模型的集群,VIP与RIP不在同一个子网内,并且使用防火墙标记的持久连接,来实现同一个IP来访问时,http与https的请求都发往一个RS。

实验环境拓扑:

服务器集群之负载均衡集群—LB Cluster (Load Balance)_ipvsadm_13

配置Web服务器,和配置https,我这里就省略了。

RealServer配置内核参数,配置VIP。

  • echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

  • echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

  • echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

  • echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

  • ifconfig lo:0 192.168.1.200  broadcast 192.168.1.200 netmask 255.255.255.255 up

  • route add -host 192.168.1.200 dev lo:0

Director配置IP。

  • ifconfig eth0 172.16.0.100/16 

  • route add -net default gw 172.16.0.1

Director配置防火墙标记。

iptables -t mangle -A PREROUTING -d 192.168.1.200 -p tcp --dport 80 -j MARK --set-mark 6

iptables -t mangle -A PREROUTING -d 192.168.1.200 -p tcp --dport 443 -j MARK --set-mark 6

Director配置VIP和主机路由。

  • echo 1 >  /proc/sys/net/ipv4/ip_forward

  • ifconfig eth0:1 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255 up

  • route add -host 192.168.1.200 dev eth0:1

  • Director配置IPVSec

  • ipvsadm -A -f 6 -s rr -p

  • ipvsadm -a -f 6 -r 172.16.0.12 -g

  • ipvsadm -a -f 6 -r 172.16.0.11 -g

注意如果路由不知道如何找到VIP,可以在路由上加一条规则。

  • route add -host 192.168.1.200 gw 172.16.0.100

这时我们来测试下,访问www.tuchao.com。

服务器集群之负载均衡集群—LB Cluster (Load Balance)_LVS_14

换成https协议再测试

服务器集群之负载均衡集群—LB Cluster (Load Balance)_cluster_15

哈,实验成功,这就完成了基于防火墙标记的持久连接,实现了当一个IP请求http与https,lvs都会转发给一台RealServer。

太晚了,明天还要上班,以后这篇文章我以后还会再做完善。

有问题欢迎与我交流QQ1183710107