【LVS负载均衡简易原理】
LVS:Linux Virtual Server:
它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。
LVS的负载均衡有三种模式:
客户端 --------------> LVS ---------------> Realserver
1.NAT模式(两张网卡的模式)
Realserver的ip地址,通过在LVS上转换成为virtual ip address 最后达到客户端
而回来的时候同样需要经过转换,这样就增加了访问的时间延时。当请求或者服务器节点过多时,就会出现瓶颈
2.Tunnel隧道模式(ip封装模式ip encapsulation)
a.主要通过重新封装ip报文的方式来进行连接并返回响应
在LVS上进行ip地址的vip报文的封装,然后发送给Realserver,
当Realserver收到报文,会进行解封装得原来地址的vip的报文,
Realserver发现vip的地址被配置在本地的IP隧道设备上,然后就处理请求,直接返回响应报文给客户端。
b.主要用于移动主机和虚拟私有网络virtual private network,且隧道都为静态建立的。
3.DR的路由模式
a.假设一种场景:
外部数据包进来----通过防火墙或者交换------NAT映射到内网的LVS服务器上-----LVS根据调度算法-----转到realserver
-----------realserver接收到数据包根据原来的外部数据包的源MAC---直接转发给外部发出数据包的一方
解析:
1.外部数据包进来是有 源MAC 源IP 目的MAC 目的IP(VIP集群地址)
2.而在防火墙或者交换通过NAT映射到LVS的服务器上的时候,数据包的目的MAC已经发生了改变,这时的目的MAC变成为了LVS服务器的MAC地址。
3.LVS通过调度算法算出去往的realserver,与此同时会再次更改数据包目的的MAC为这台算出的realserver的MAC地址。
4.realserver收到数据包,由于在这整个过程中,数据包的源MAC和源IP并没有被改变。所以realserver可以直接将结果返还
5.最后的返还过程中,由于之前数据包的目的IP是为VIP集群地址,所以在realserver返还的时候,整个VIP集群地址就变成了
源地址,源MAC就是这台realserver本身的MAC地址。而目的MAC和目的IP都未变。所以可以直接投递转发。
【三种方式的异同】
LVS/NAT:
优点:简便,可运行任何支持TCP/IP的操作系统
缺点:对节点数有要求,当上升到20个server节点以上的时候,LVS的调度器可能会成为瓶颈
因为整个过程中的请求和响应报文都需要通过负载调度器。
当LVS的服务器性能不足以支撑的时候,访问响应会有很大的延时。
解决升级办法:
采用混合方式即中间有掺杂LVS/Tunnel、LVS/DR
这种混合式的集群系统中,有若干个LVS/NAT负载调度器,每个负载调度器带自己的服务器集群。
而这些负载调度器又通过RR-DNS组成简单的域名
RR-DNS:其实是一种通过DNS来实现负载均衡的一种技术;
DNS负载均衡技术是通过DNS服务中的随机别名解析来实现的。通过使用RR-DNS(Round-Robin Domain Name System)可以实现平衡负载的功能。 向一个主机名发出的入站请求可以被转发到多个IP地址上在DNS服务器中,可以为多个不同的地址配置同一个名字,这个数据被发送给其他名字服务器, 而最终查询这个名字的客户机将在解析这个名字时随机使用其中一个地址。因此,对于同一个名字,不同的客户机会得到不同的地址, 因此不同的客户访问的也就是不同地址的Web服务器,从而达到负载均衡的目的。
LVS/Tunnel:
优点:可极大增加负载调度器的服务器数量。100Mbps的全双工网卡,支持最大吞吐量可超过1Gbps
可以调度上百台服务器,而它本身也不会成为瓶颈,可以用来构建高性能的超级服务器。
缺点:对服务器的支持有要求,即必须支持“IP Tunneling”或者“IP Encapsulation”协议。
目前LVS/Tunnel的后端服务器主要运行LINUX操作系统。
LVS/Direct Routing:
优点:跟LVS/Tunnel一样,LVS的调度器只处理客户端到服务器端的连接,响应数据可以直接从独立的网络路由返回给客户端。
可极大的提高LVS集群系统的伸缩性。跟LVS/Tunnel相比,少了LVS/Tunnel隧道的开销
缺点:要求负载调度器与实际服务器都有一块网卡连在同一物理网段上,即必须在同一个局域网内,服务器网路设备
不做ARP响应,或者能将报文重定向到本地的socket端口上。
【负载均衡调度算法】
◆最少的连接方式(Least Connection):传递新的连接给那些进行最少连接处理的服务器。当其中某个服务器发生第二到第7 层的故障,
BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配, 直到其恢复正常。
◆最快模式(Fastest):传递连接给那些响应最快的服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从服务器队列中拿出,
不参加下一次的用户请求的分配,直到其恢复正常。
◆观察模式(Observed):连接数目和响应时间以这两项的最佳平衡为依据为新的请求选择服务器。当其中某个服务器发生第二到第7 层的故障,
BIG-IP就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
◆预测模式(Predictive):BIG-IP利用收集到的服务器当前的性能指标,进行预测分析,选择一台服务器在下一个时间片内,
其性能将达到最佳的服务器相应用户的请求。(被BIG-IP 进行检测)
◆动态性能分配(Dynamic Ratio-APM):BIG-IP 收集到的应用程序和应用服务器的各项性能参数,动态调整流量分配。
◆动态服务器补充(Dynamic Server Act.):当主服务器群中因故障导致数量减少时,动态地将备份服务器补充至主服务器群。
◆服务质量(QoS):按不同的优先级对数据流进行分配。
◆服务类型(ToS): 按不同的服务类型(在Type of Field中标识)负载均衡对数据流进行分配。
◆规则模式:针对不同的数据流设置导向规则,用户可自行。
【LVS的安装与使用】
参考博客:
http://blog.csdn.net/yinwenjie/article/details/46605451
http://www.cnblogs.com/edisonchou/p/4281978.html
前期准备:
1.给LVS的服务器配置两块网卡分别为eth0和eth1
2.用eth0作为对外的vip,而eth1作为对内的网关地址
网卡配置如下:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
-----------------------------
DEVICE=eth0 TYPE=Ethernet UUID=95eaa211-43e6-4240-bd7c-6cd794ecf44e ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.60.90 NETMASK=255.255.255.0 GATEWAY=192.168.60.1 HWADDR=00:0C:29:9A:AB:DB DNS1=202.96.209.5
--------------------------------------------
vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1 HWADDR=00:0C:29:9A:AB:E5 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes IPADDR=192.168.10.1 NETMASK=255.255.255.0
-------------------------------
3.再次进行两台realserver的网卡配置,配置为内网的192.168.10.x段的地址
192.168.10.2的配置如下:
vim /etc/sysconfig/network-scripts/ifcfg-eth1
------------------------------------
DEVICE=eth1 HWADDR=00:0C:29:9A:AB:C3 UUID=1185cb98-9b23-410a-824e-106333b3c1ad TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes IPADDR=192.168.10.2 NETMASK=255.255.255.0 GATEWAY=192.168.10.1
----------------------------------
192.168.10.3的配置如下:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 HWADDR=00:0C:29:52:F4:15 UUID=1185cb98-9b23-410a-a2f0-3f43aaaa9c4d TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.10.3 NETMASK=255.255.255.0 GATEWAY=192.168.10.1
------------------------------------------
4.nginx的服务事先已经在realserver端安装好了,安装方法请参考:CentOS6.6下的Nginx安装
这里分别修改两台realserver的index.html的网页内容,加入各自的ip地址,以便做负载的时候访问的区分:
vim /usr/local/nginx/html/index.html
两台的修改行分别如下:
<h1>Welcome to nginx!192.168.10.2</h1>
<h1>Welcome to nginx!192.168.10.3</h1>
5.配置完了以后,做好验证:
a.在LVS服务器上ping www.baidu.com 是可以ping通的。也就是说可以正常上网的。
b.在LVS服务器上ping到realserver的地址192.168.10.2或者192.168.10.3是可以ping通的。反之亦然。
c.在LVS服务器上可以正常浏览到realserver上的nginx欢迎页面“Welcome to nginx!”
如果ping不同请检查防火墙是否关闭:
service iptables stop
LVS的安装配置:
从上面的LVS简易原理,我们知道有三种模式,而一般常用的是NAT模式和DR的路由模式,
tunnel的隧道模式一般用于跨网使用。
这里介绍NAT和DR的两种模式,掌握后自然懂得tnuuel的隧道模式,因为大体的方法都差不多。
因为LVS是借助于ipvsadm的工具来进行集群管理,所以要先安装这个工具:
yum -y install ipvsadm
-------------------------------------------------------------------------------------
【VS-NAT转发模式】
1.创建虚拟服务器:
ipvsadm -At 192.168.60.90:80 -s rr
参数解析:
-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。 -t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务。 -s --scheduler scheduler 使用的调度算法,可选项包括:rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq -r --real-server server-address 真实的服务器[Real-Server:port]。 -m --masquerading 指定LVS 的工作模式为NAT 模式。 -g --表示DR路由模式 -i --表示Tunnel隧道模式 -a --表示增加一台真实服务器 -w --表示权重(权重为0时表示暂停节点)
2.添加realserver真实提供web的服务器,即服务器节点:
ipvsadm -at 192.168.60.90:80 -r 192.168.10.2 -m -w 1
ipvsadm -at 192.168.60.90:80 -r 192.168.10.3 -m -w 1
3.如果需要删除服务器:
ipvsadm -dr 192.168.10.2:80 -t 192.168.60.90:80 删除服务器节点192.168.10.2的节点
ipvsadm -Dt 192.168.60.90:80 删除整个虚拟服务器(注意-d的大小写区分)
4.开启服务器的ip转发功能:
一般linux默认的ip_forward的值为0,也就是说默认是没有开启ip转发功能的,因为大多数人也用不到。
所以这里要把LVS的转发打开,否则是无法用本地访问web页面的:即
echo 1 >> /proc/sys/net/ipv4/ip_forward
这条修改的是内存里面的值,所以无法用vi或者vim来进行修改。当然这样的更改在服务器重新启动后会失效。
4.1永久启用ip转发的方法:
通过在/etc/sysctl.conf来设置参数
vim /etc/sysctl.conf
----------------------增加一条记录:
net.ipv4.ip_forward = 1
或者如果里面有,可以直接修改里面的值:
或者在防火墙内添加通路规则:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-
5.检查节点:
ipvsadm -Ln 查看节点状态
----------------------------------
[root@localhost ~]# 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.60.90:80 rr -> 192.168.10.2:80 Masq 1 0 0 -> 192.168.10.3:80 Masq 1 0 0
---------------------------------------------------------------------------
ipvsadm -Lnc 查看负载状态
----------------------------------
[root@localhost ~]# ipvsadm -Lnc IPVS connection entries pro expire state source virtual destination TCP 14:50 ESTABLISHED 192.168.60.67:2942 192.168.60.90:80 192.168.10.3:80 TCP 14:54 ESTABLISHED 192.168.60.67:2765 192.168.60.90:80 192.168.10.2:80 TCP 01:42 TIME_WAIT 192.168.60.67:12913 192.168.60.90:80 192.168.10.2:80 TCP 01:04 FIN_WAIT 192.168.60.67:13660 192.168.60.90:80 192.168.10.3:80 TCP 01:07 TIME_WAIT 192.168.60.67:14954 192.168.60.90:80 192.168.10.3:80
--------------------------------------------------------------------------------
6.到这里NAT的模式就建立好了,来试验一下,看看最后的结果:
因为在LVS上添加realserver的时候设置的权重值为1都一样,所以当访问的时候仍然是轮询的访问方式。
我是在自己的电脑上面通过vmware的虚拟机来实现的,一台LVS和两台realserver,使用自己的本地电脑进行
访问LVS的vip地址,以便验证最后的负载是否实现。
通过下面的图可以看到:
第一次访问的是192.168.10.3,而第二次访问的是192.168.10.3,第三次访问的依然是192.168.10.2
那么由此说明NAT的模式已经建立成功。
7.将配置的所有策略保存:
使用导出/导入工具:
ipvsadm-save/ipvsadm-restore
可以保存,恢复LVS策略,操作方法类似于iptables规则的导入/出
ipvsadm -save > /etc/sysconfig/ipvsadm //保存策略
service ipvsadm stop //停止服务(清楚策略)
service ipvsadm start //启动服务(加载保存的策略)
【VS-DR路由模式】
前期准备:
1.一台LVS服务器和两台realserver服务器
2.给这三台服务器新添加一个回环口,并配上静态IP地址,也就是所谓的VIP地址
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
-----------------------------------------
DEVICE=lo:0 IPADDR=192.168.60.90 NETMASK=255.255.255.255 //注意这里的掩码是32位的 #NETWORK=127.0.0.0 # If you're having problems with gated making 127.0.0.0/8 a martian, # you can change this to something else (255.255.255.255, for example) BROADCAST=127.255.255.255 ONBOOT=yes NAME=loopback
------------------------------------------------------------------------
本来是有回环口的,这里是复制了一个回环口出来使用的。
3.给LVS安装ipvsadm的集群管理工具,给两台realserver安装nginx的服务,并分别配置index.html以便后面测试区分。
这里跟上面LVS-NAT的例子一样。
配置安装:
LVS和realserver端的装备安装,这里不再做介绍,可以参考上面的安装示例以及nginx的安装。
主要的DR配置:
1. 对于DR的集群来说,由于LVS负载调度器和各个节点需要公用的VIP地址,且这个地址都需要在一个网段,
可以ping通外网,为了避免网络内ARP的解析出现异常,这里应该关闭所有在这个LVS集群的linux内核的重定向参数响应,包括(LVS+Realserver)
-------------------------------------------
net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.eth0.send_redirects = 0 ----------------------------------------- sysctl -p 可以检查当前/etc/sysctl.conf的配置文件的正确与否
2. 设置负载分配策略
[root@SL-one ~]# service ipvsadm stop [root@SL-one ~]# ipvsadm -At 192.168.60.90:80 -s rr [root@SL-one ~]# ipvsadm -at 192.168.60.90:80 -r 192.168.60.107:80 -g [root@SL-one ~]# ipvsadm -at 192.168.60.90:80 -r 192.168.60.108:80 -g [root@SL-one ~]# service ipvsadm save //保存分配策略 ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ] [root@SL-one ~]# chkconfig ipvsadm on //加入开机自启动
----------------------------------------------------------------------
3. 然后保证realserver端的nginx服务是开启的状态。
就可以通过本地访问 http://192.168.60.90:80 这个集群VIP地址,从而访问到index.html的页面
[root@SL-one ~]# ipvsadm -lnc IPVS connection entries pro expire state source virtual destination TCP 14:50 ESTABLISHED 192.168.60.67:1291 192.168.60.90:80 192.168.60.107:80 TCP 01:45 FIN_WAIT 192.168.60.67:1282 192.168.60.90:80 192.168.60.107:80 TCP 00:17 FIN_WAIT 192.168.60.67:1239 192.168.60.90:80 192.168.60.108:80 TCP 00:47 FIN_WAIT 192.168.60.67:1258 192.168.60.90:80 192.168.60.108:80 TCP 01:07 FIN_WAIT 192.168.60.67:1240 192.168.60.90:80 192.168.60.107:80 TCP 14:50 ESTABLISHED 192.168.60.67:1283 192.168.60.90:80 192.168.60.108:80
如果其中一台realserver挂掉了,那么LVS就会将请求转发到其他可用realserver服务器继续使用
4. 有关于ipvsadm的相关参数:
-A –add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。 -E –edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。 -D –delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。 -C –clear 清除内核虚拟服务器表中的所有记录。 -R –restore 恢复虚拟服务器规则 -S –save 保存虚拟服务器规则,输出为-R 选项可读的格式 -a –add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器 -e –edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录 -d –delete-server 删除一条虚拟服务器记录中的某条真实服务器记录 -L –list 显示内核虚拟服务器表 -Z –zero 虚拟服务表计数器清零(清空当前的连接数量等) –set tcp tcpfin udp 设置连接超时值 –start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。 –stop-daemon 停止同步守护进程 -t –tcp-service service-address 说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port] -u –udp-service service-address 说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port] -f –fwmark-service fwmark 说明是经过iptables 标记过的服务类型。 -s –scheduler scheduler 使用的调度算法,选项:rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq, 默认的调度算法是: wlc. -p –persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。
timeout 的默认值为300 秒。 -M –netmask netmask persistent granularity mask -r –real-server server-address 真实的服务器[Real-Server:port] -g –gatewaying 指定LVS 的工作模式为直接路由模式DR模式(也是LVS默认的模式) -i –ipip 指定LVS 的工作模式为隧道模式 -m –masquerading 指定LVS 的工作模式为NAT 模式 -w –weight weight 真实服务器的权值 –mcast-interface interface 指定组播的同步接口 -c –connection 显示LVS 目前的连接 如:ipvsadm -L -c –timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L –timeout –daemon 显示同步守护进程状态 –stats 显示统计信息 –rate 显示速率信息 –sort 对虚拟服务器和真实服务器排序输出 –numeric -n 输出IP 地址和端口的数字形式
【总结】
lvs的两种配置方法总结:
1.LVS-NAT转发模式:
a. 需要Lvs的服务器有两块网卡,一块对内的realserver,一块对外即VIP(virtual ip address)
b. LVS的对内的一块网卡的地址作为realserver的web服务器的GATEWAY网关地址,当然都需要在同一个网段
c. 打开LVS服务器的地址转发功能,在/etc/sysctl.conf里面的net.ipv4.ip_forward = 1
2.DR路由模式:
a. 集群VIP地址,这个地址配置在LVS服务器和其下的realserver节点的回环口上面,
同时需要LVS的服务器和realserver的服务器真实的ip地址和这个集群地址也在同一个局域网内
b. 三台服务器各自添加一条到vip的路由:
route add -host 192.168.60.90 dev lo:0
c. 使用集群地址对外服务,LVS为流量入口,realserver会直接将数据包转发出去而不经过LVS服务器
d. 需要关闭LVS服务器及realserver服务器的ARP反向查询功能,否则上层交换会进行查询,从而影响流量回传。