集群之LVS负载均衡详解.docx
《集群之LVS负载均衡详解.docx》由会员分享,可在线阅读,更多相关《集群之LVS负载均衡详解.docx(15页珍藏版)》请在冰豆网上搜索。
集群之LVS负载均衡详解
提高服务器响应能力的方法
scaleon 在原有服务器的基础上进行升级或者直接换一台新的性能更高的服务器。
scaleout 横向扩展,将多台服务器并发向外响应客户端的请求。
优点:
成本低,扩展架构比较简单。
集群(Cluster),通俗地讲就是按照某种组织方式将几台电脑组织起来完成某种特定任务的这样一种架构。
三种集群类型:
LB,LoadBalancing负载均衡:
在一定程度上能够实现高可用的目的。
HA,HighAvailability高可用:
实时在线,能够及时响应客户端请求,企业应用要求达到
7*24小时,99.999%时间在线。
HP,HighPerformance高性能提供大量超级运算能力的集群。
LB负载均衡架构:
Director(dispatcher):
负责接收客户端请求,并将请求按照某种算法分发到后台真正提供服务的服务器上。
既可以基于硬件(F5)来实现,也可以基于软件来实现。
基于软件实现的又分为四层交换:
基于IP地址和端口号组合起来对服务做重定向(LVS)。
七层交换:
通常指的是反向代理(proxy),例如:
squid。
LVS:
LinuxVirtual Server
类似于iptables的架构,在内核中有一段代码用于实时监听数据包来源的请求,当数据包到达端口时做一次重定向。
这一系列的工作必须在内核中实现。
在内核中实现数据包请求处理的代码叫做ipvs。
ipvs仅仅提供了功能框架,还需要自己手动定义是数据对哪个服务的请求,
而这种定义需要通过写规则来实现,写规则的工具就称为ipvsadm。
应用场景
高吞吐量(higherthroughput)
冗余 (redundancy)
适应性 (adaptability)
LVS负载均衡架构
VirtualIP(VIP)address:
Director用来向客户端提供服务的IP地址
RealIP(RIP)address:
集群节点(后台真正提供服务的服务器)所使用的IP地址
Director'sIP(DIP)address:
Director用来和D/RIP进行联系的地址
Clientcomputer'sIP(CIP)address:
公网IP,客户端使用的IP。
根据前端Director和后台RealServer的通信方式将LVS分为三类:
NetworkAddressTranslation(LVS-NAT)
目标地址转换所有客户端的请求都被Director根据访问请求和算法被定向到后台的RealServer上。
数据包地址转换过程:
S:
CIPD:
VIP------->Director------>S:
CIPD:
RIP------>RealServer------>
----->S:
RIP D:
CIP----->Director----->S:
VIP D:
CIP
Director和RealServer必须在同一个网段中;
一般情况下,RIP是私有地址,只用于集群内部节点间通信;
Director会响应所有的请求在客户端和RealServer之间,所承担的负载较大;
所有的RealIP网关必须指向DIP以响应客户端请求;
Director可以重映射网络端口,即前端使用标准端口,后端可以使用非标准端口;
后台的RealServer可以使用任何操作系统;
Director可能会成为系统瓶颈。
Directorrouting(LVS-DR)
直接路由客户端请求经过Director,RealServer直接回应客户端
数据包地址转换过程:
S:
CIPD:
VIP----->Director--->S:
CIPD:
RIP----->RealServer--->S:
VIPD:
CIP
RealServer上必须配置VIP切需要隐藏起来,只有在响应客户端请求时才使用VIP作为源地址,除此之外并不使用此VIP。
集群节点和Director必须在同一个网络中;
RIP不要求为私有地址;
Director仅处理所有进来的请求;
RealServer不能以DIP作为网关,而是以公网上的某台路由器作为网关;
Director不能再使用端口重映射;
大多数操作系统可以被用来作为RealServer,windows除外;
LVS-DR模式可以处理比LVS-NAT更多的请求。
实际生产环境中最常用的一种方式,优点:
RIP为公网地址,管理员可以远程连接RealServer来查看工作状态;
一旦Director宕机,可以通过修改DNS记录将A记录指向RIP继续向外提供服务;
IPtunneling(LVS-TUN)
与DR的网络结构一样,但Director和RealServer可以在不同的网络当中,可以实现异地容灾的功能。
DIP----->VIP基于隧道来传输,在数据包外层额外封装了S:
DIPD:
RIP的地址。
Director和RealServer必须在同一个物理网络中;
RIP一定不能是私有地址;
Director只负责处理进来的数据包;
RealServer直接将数据包返回给客户端,所以RealServer默认网关不能是DIP,必须是公网上某个路由器的地址;
Director不能做端口重映射;
只有支持隧道协议的操作系统才能作为RealServer。
分发时所采用的算法
固定调度算法:
按照某种既定的算法,不考虑实时的连接数予以分配。
Round-robin(RR)轮询:
当新请求到达时候,从服务列表中选择一个RealServer,将请求重定向给这台RealServer。
Weightedround-robin(WRR)加权轮询:
给每台RealServer分配一个权重/位列,权重越大,分到的请求数越多。
Destinationhashing(DH)目标散列:
来自于同一个IP地址的请求都被重定向到同一台RealServer上(保证目标地址不变)。
Sourcehashing(SH)源地址散列:
Director必须确保响应的数据包必须通过请求数据包所经过的路由器或者防火墙(保证原地址不变)。
动态调度算法:
通过检查服务器上当前连接的活动状态来重新决定下一步调度方式该如何实现。
LeaseConnection(LC)最少连接 哪一个RealServer上的连接数少就将下一个连接请求定向到那台RealServer上去。
【算法:
连接数=活动连接数*256+非活动连接数】
WeightLeast-Connection(WLC)加权最少连接 在最少连接的基础上给每台RealServer分配一个权重。
【算法:
连接数=(活动连接数*256+非活动连接数)÷权重】一种比较理想的算法。
ShortestExpectedDelay(SED) 最短期望延迟不再考虑非活动连接数
【算法:
连接数=(活动连接数+1)*256÷权重】
NeverQueue(NQ)永不排队算法,对SED的改进,当新请求过来的时候不仅要取决于SED算法所得到的值,还要取决于RealServer上是否有活动连接。
Locality-BasedLeast-Connection (LBLC)基于本地状态的最少连接,在DH算法的基础上还要考虑服务器上的活动连接数。
Locality-BasedLeast-Connection with Replication Scheduling (LBLCR)带复制的基于本地的最少连接 LBLC算法的改进
下面我们就来做一个基于LVS-NAT的负载均衡实验:
实验环境搭建:
Director:
VIP192.168.0.127桥接
DIP192.168.10.1仅主机
RealServer1:
RIP192.168.10.2 仅主机 网关指向:
192.168.10.1
RealServer2:
RIP192.168.10.3 仅主机 网关指向:
192.168.10.1
Client:
192.168.0.1 物理机
每台RealServer上分别安装有http服务。
我们这里为了演示效果,每个http服务的页面不同。
RealServer1
[root@station39html]#ifconfigeth0192.168.10.2
[root@station39html]#routeadddefaultgw192.168.10.1
RealServer2
[root@station26html]#ifconfigeth0192.168.10.3
[root@station26html]#routeadddefaultgw192.168.10.1
Director:
[root@server27~]#ifconfigeth1192.168.10.1
打开内核路由功能
[root@server27~]#echo1>/proc/sys/net/ipv4/ip_forward
确保永久有效:
[root@server27~]#vim/etc/sysctl.conf
#ControlsIPpacketforwarding
net.ipv4.ip_forward=1
[root@server27~]#sysctl-p
net.ipv4.ip_forward=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.default.accept_source_route=0
kernel.sysrq=0
kernel.core_uses_pid=1
net.ipv4.tcp_syncookies=1
kernel.msgmnb=65536
kernel.msgmax=65536
kernel.shmmax=4294967295
kernel.shmall=268435456
OK,准备工作已经就绪,下面开始实验的关键步骤:
[root@server27~]#yuminstallipvsadm-y
使用步骤:
1.定义服务2.为服务定义RealServer
[root@server27~]#ipvsadm-A-t192.168.0.127:
80-srr
[root@server27~]#ipvsadm-Ln
IPVirtualServerversion1.2.1(size=4096)
ProtLocalAddress:
PortSchedulerFlags
->RemoteAddress:
Port ForwardWeightActiveConnInActConn
TCP 192.168.0.127:
80rr
[root@server27~]#ipvsadm-a-t192.168.0.127:
80-r192.168.10.2-m-w2
[root@server27~]#ipvsadm-a-t192.168.0.127:
80-r192.168.10.3-m-w5
-g, --gatewaying Usegatewaying(directrouting).Thisisthe default.
-i, --ipip Useipipencapsulation(tunneling).
-m, --masquerading Usemasquerading (network access transla-tion,orNAT).
PS:
在这里设定的权重对于RR算法来说并没有什么意义,我们只是为后面的实验而设定的。
[root@server27~]#ipvsadm-Ln
IPVirtualServerversion1.2.1(size=4096)
ProtLocalAddress:
PortSchedulerFlags
->RemoteAddress:
Port ForwardWeightActiveConnInActConn
TCP 192.168.0.127:
80rr
->192.168.10.3:
80 Masq 5 0 16
->192.168.10.2:
80 Masq 2 0 15
此时,我们使用物理机访问192.168.0.127就会发现页面交替变化,这是由RR算法的特性决定的。
我们改变为WRR算法试试:
[root@server27~]#ipvsadm-E-t192.168.0.127:
80-swrr
[root@server27~]#ipvsadm-Ln
IPVirtualServerversion1.2.1(size=4096)
ProtLocalAddress:
PortSchedulerFlags
->RemoteAddress:
Port ForwardWeightActiveConnInActConn
TCP 192.168.0.127:
80wrr
->192.168.10.3:
80 Masq 5 0 86
->192.168.10.2:
80 Masq 2 0 43
改变为LBLC算法试试:
LBLC:
基于本地状态的最少连接,在DH算法的基础上还要考虑服务器上的活动连接数。
[root@server27~]#ipvsadm-E-t192.168.0.127:
80-slblc
[root@server27~]#ipvsadm-Ln
IPVirtualServerversion1.2.1(size=4096)
ProtLocalAddress:
PortSchedulerFlags
->RemoteAddress:
Port ForwardWeightActiveConnInActConn
TCP 192.168.0.127:
80lblc
->192.168.10.3:
80 Masq 5 0 112
->192.168.10.2:
80 Masq 2 0 41
此时无论客户端怎么刷新,访问页面都不会改变。
保存规则:
ipvsadm-S>>/etc/sysconfig/ipvs-config == ipvsadm-save
ipvsadm-R
Directorrouting(LVS-DR)
PS:
Director分发到RealServer的过程中,数据包的源地址和目标地址都没有发生改变,Director仅仅是将目标mac地址转换成某台RealServer的mac地址,源mac地址改为Director内网网卡的mac地址。
两个技术难题
1 RealServer要避免对客户端发来的对VIP的arp地址解析请求;
解决方法
1) 修改内核的两个参数:
arp_announce,arp_ignore。
arp_announce:
定义不同级别:
当ARP请求通过某个端口进来是否利用这个接口来回应。
0-(default)Useanylocaladdress,configuredonanyinterface.
利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1-Trytoavoidlocaladdressesthatarenotinthetarget'ssubnetforthisinterface.
避免使用另外一个接口上的mac地址去响应ARP请求;
2-Alwaysusethebestlocaladdressforthistarget.
尽可能使用能够匹配到ARP请求的最佳地址。
arp_ignore:
当ARP请求发过来后发现自己正是请求的地址是否响应;
0-(default):
replyforanylocaltargetIPaddress,configuredonanyinterface
利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1-replyonlyifthetargetIPaddressislocaladdressconfiguredontheincoming
interface.
哪个接口上接受ARP请求,就从哪个端口上回应。
PS:
对linux来说IP地址属于系统而不属于某个接口。
2) RedHat提供了arptables工具,利用arp防火墙也可以实现。
2 当RealServer内网网卡响应客户端请求时,要以VIP作为源地址,不能以RIP作为源地址。
解决方法
添加一条路由:
routeadd-host192.168.0.127devlo:
0使客户端访问VIP,就让VIP来响应客户端。
这样避免了使用RIP作为源地址。
Director:
VIP:
响应客户端请求;
DIP:
与RIP彼此间实现arp解析,并将客户端的请求转发给RealServer。
实验环境搭建:
Director:
eth0:
0 VIP192.168.0.127
eth0 DIP192.168.0.10桥接
RealServer1:
eth0 RIP192.168.0.12 桥接
lo:
0 VIP192.168.0.127
RealServer2:
eth0 RIP192.168.0.13 桥接
lo:
0 VIP192.168.0.127
Client:
192.168.0.1 物理机
RealServer1
[root@station39~]#vim/etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
[root@station39~]#sysctl-p
[root@station39~]#ifconfigeth0192.168.0.12/24
[root@station39~]#ifconfiglo:
0192.168.0.127broadcast192.168.0.127netmask 255.255.255.255
[root@station39~]#routeadd-host192.168.0.127devlo:
0
RealServer2
[root@station26~]#vim/etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
[root@station26~]#sysctl-p
[root@station26~]#ifconfigeth0192.168.0.13/24
[root@station26~]#ifconfiglo:
0192.168.0.127broadcast192.168.0.127netmask 255.255.255.255
[root@station26~]#routeadd-host192.168.0.127devlo:
0
Director
[root@server27~]#ifconfigeth0192.168.0.10/24
[root@server27~]#ifconfigeth0:
0192.168.0.127broadcast192.168.0.127netmask255.255.255.255
[root@server27~]#routeadd-host192.168.0.127deveth0:
0
[root@server27~]#echo1>/proc/sys/net/ipv4/ip_forward
[root@server27~]#ipvsadm-C
[root@server27~]#ipvsadm-A-t192.168.0.127:
80-swlc
[root@server27~]#ipvsadm-a-t192.168.0.127:
80-r192.168.0.12-g-w5
[root@server27~]#ipvsadm-a-t192.168.0.127:
80-r192.168.0.13-g-w8
[root@server27~]#ipvsadm-Ln
IPVirtualServerversion1.2.1(size=4096)
ProtLocalAddress:
PortSchedulerFlags
->RemoteAddress:
Port ForwardWeightActiveConnInActConn
TCP 192.168.0.127:
80wlc
->192.168.0.13:
80 Route 8 0 18
->192.168.0.12:
80 Route 5 0 11
PS:
如果要保持访问的页面一致,我们可以另外准备一台服务器专门用