什么是负载均衡:
1.负载均衡集群—LB Cluster (Load Balance)
当大量用户并发访问时,将请求转发到不同的机器止实现负载均衡。我们这里使用lvs实现。LVS是Linux 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很相似。
NAT:
1、RealServer应该使用私有IP地址;
2、RealServer的网关应该指向DIP;
3、RIP和DIP应该在同一个网段内;
4、进出的报文都得经过Directory,在高负载下,Directory会成为系统性能瓶颈;
5、支持端口映射;
6、RealServer可以使用任意OS;
2、VS/DR(Virtual Server via Direct Routing)
因为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 恢复规则
实验环境拓扑:
配置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
开启数据包转发功能
echo '1' > /proc/sys/net/ipv4/ip_forward
现在我们用浏览器测试,第一次访问。
测试第二次访问。
查看状态
ipvsadm -L -n --stats
由此可以看出他们的连接都是平均的。
现在我们换一个调度算法。
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
实验二、实现工作于VS/DR模型的负载均衡
环境拓扑:
配置两台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
进行压力测试,查看状态。
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。
实验环境拓扑:
配置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。
换成https协议再测试
哈,实验成功,这就完成了基于防火墙标记的持久连接,实现了当一个IP请求http与https,lvs都会转发给一台RealServer。
太晚了,明天还要上班,以后这篇文章我以后还会再做完善。
有问题欢迎与我交流QQ1183710107