如何配置Web服务器实现负载均衡
网络的负载均衡是一种动态均衡技术,通过一些工具实时地分析数据包,掌握网络中的数据流量状况,把任务合理均衡地分配出去。这种技术基于现有网络结构,提供了一种扩展服务器带宽和增加服务器吞吐量的廉价有效的方法,加强了网络数据处理能力,提高了网络的灵活性和可用性。
以四台服务器为例实现负载均衡:
安装配置LVS
1 安装前准备:
(1)首先说明,LVS并不要求集群中的服务器规格划一,相反,可以根据服务器的不同配置和负载状况,调整负载分配策略,充分利用集群环境中的每一台服务器。如下表:
Srv Eth0 Eth0:0 Eth1 Eth1:0
vs1 10001 10002 192168101 19216810254
vsbak 10003 19216810102
real1 19216810100
real2 19216810101
其中,10002是允许用户访问的IP。
(2)这4台服务器中,vs1作为虚拟服务器(即负载平衡服务器),负责将用户的访问请求转发到集群内部的real1,real2,然后由real1,real2分别处理。
Client为客户端测试机器,可以为任意操作系统。
(3)所有OS为redhat62,其中vs1 和vsbak 的核心是2219, 而且patch过ipvs的包, 所有real
server的Subnet mask 都是24位, vs1和vsbak 的1000 网段是24 位。
2理解LVS中的相关术语
(1) ipvsadm :ipvsadm是LVS的一个用户界面。在负载均衡器上编译、安装ipvsadm。
(2) 调度算法: LVS的负载均衡器有以下几种调度规则:Round-robin,简称rr;weighted
Round-robin,简称wrr;每个新的连接被轮流指派到每个物理服务器。Least-connected,简称lc;weighted
Least-connected,简称wlc,每个新的连接被分配到负担最小的服务器。
(3) Persistent client
connection,简称pcc,(持续的客户端连接,内核2210版以后才支持)。所有来自同一个IP的客户端将一直连接到同一个物理服务器。超时时间被设置为360秒。Pcc是为https和cookie服务设置的。在这处调度规则下,第一次连接后,所有以后来自相同客户端的连接(包括来自其它端口)将会发送到相同的物理服务器。但这也会带来一个问题,因为大约有25%的Internet
可能具有相同的IP地址。
(4) Persistent port
connection调度算法:在内核2212版以后,pcc功能已从一个调度算法(你可以选择不同的调度算法:rr、wrr、lc、wlc、pcc)演变成为了一个开关选项(你可以让rr、
wrr、lc、wlc具备pcc的属性)。在设置时,如果你没有选择调度算法时,ipvsadm将默认为wlc算法。 在Persistent port
connection(ppc)算法下,连接的指派是基于端口的,例如,来自相同终端的80端口与443端口的请求,将被分配到不同的物理服务器上。不幸的是,如果你需要在的网站上采用cookies时将出问题,因为http是使用80端口,然而cookies需要使用443端口,这种方法下,很可能会出现cookies不正常的情况。
(5)Load Node Feature of Linux Director:让Load balancer 也可以处理users 请求。
(6)IPVS connection synchronization。
(7)ARP Problem of LVS/TUN and LVS/DR:这个问题只在LVS/DR,LVS/TUN 时存在。
3 配置实例
(1) 需要的软件包和包的安装:
I piranha-gui-0412-2rpm (GUI接口cluster设定工具);
II piranha-0412-2rpm;
III ipchains-139-6lprpm (架设NAT)。
取得套件或mount到光盘,进入RPMS目录进行安装:
# rpm -Uvh piranha
# rpm -Uvh ipchains
(2) real server群:
真正提供服务的server(如web
server),在NAT形式下是以内部虚拟网域的形式,设定如同一般虚拟网域中Client端使用网域:192168100/24
架设方式同一般使用虚拟IP之局域网络。
a 设网卡IP
real1 :19216810100/24
real2 :19216810101/24
b每台server均将default gateway指向19216810254。
19216810254为该网域唯一对外之信道,设定在virtual server上,使该网域进出均需通过virtual server 。
c每台server均开启httpd功能供web server服务,可以在各real server上放置不同内容之网页,可由浏览器观察其对各real
server读取网页的情形。
d每台server都开启rstatd、sshd、rwalld、ruser、rsh、rsync,并且从Vserver上面拿到相同的lvsconf文件。
(3) virtual server:
作用在导引封包的对外主机,专职负责封包的转送,不提供服务,但因为在NAT型式下必须对进出封包进行改写,所以负担亦重。
aIP设置:
对外eth0:IP:10001 eth0:0 :10002
对内eth1:192168101 eth1:0 :19216810254
NAT形式下仅virtual server有真实IP,real server群则为透过virtual server
b设定NAT功能
# echo 1 >; /proc/sys/net/ipv4/ip_forward
# echo 1 >; /proc/sys/net/ipv4/ip_always_defrag
# ipchains -P forward MASQ
c设定piranha 进入X-window中 (也可以直接编辑/etc/lvscf )
a)执行面板系统piranha
b)设定“整体配置”(Global Settings) 主LVS服务器主机IP:10002, 选定网络地址翻译(预设) NAT路径名称:
19216810254, NAT 路径装置: eth1:0
c)设定虚拟服务器(Virtual Servers) 添加编辑虚拟服务器部分:(Virtual
Server)名称:(任意取名);应用:http;协议: tcp;连接:80;地址:10002;装置:eth0:0; 重入时间:180
(预设);服务延时:10 (预设);加载监控工具:ruptime (预设);调度策略:Weighted least-connections; 持续性:0
(预设); 持续性屏蔽: 255255255255 (预设); 按下激活:实时服务器部分:(Real Servers); 添加编辑:名字:(任意取名);
地址: 19216810100; 权重:1 (预设) 按下激活
另一架real server同上,地址:19216810101。
d) 控制/监控(Controls/Monitoring)
控制:piranha功能的激活与停止,上述内容设定完成后即可按开始键激活piranha监控器:显示ipvsadm设定之routing table内容
可立即更新或定时更新。
(4)备援主机的设定(HA)
单一virtual server的cluster架构virtual server 负担较大,提供另一主机担任备援,可避免virtual
server的故障而使对外服务工作终止;备份主机随时处于预备状态与virtual server相互侦测
a备份主机:
eth0: IP 10003
eth1: IP 19216810102 同样需安装piranha,ipvsadm,ipchains等套件
b开启NAT功能(同上面所述)。
c在virtual server(10002)主机上设定。
a)执行piranha冗余度 ;
b)按下“激活冗余度”;
冗余LVS服务器IP: 10003;HEARTBEAT间隔(秒数): 2 (预设)
假定在…秒后进入DEAD状态: 5 (预设); HEARTBEAT连接埠: 539 (预设)
c)按下“套用”;
d)至“控制/监控”页,按下“在当前执行层添加PULSE DEAMON” ,按下“开始”;
e)在监控器按下“自动更新”,这样可由窗口中看到ipvsadm所设定的routing table,并且动态显示real
server联机情形,若real server故障,该主机亦会从监视窗口中消失。
d激活备份主机之pulse daemon (执行# /etc/rcd/initd/pulse start)。
至此,HA功能已经激活,备份主机及virtual server由pulse daemon定时相互探询,一但virtual
server故障,备份主机立刻激活代替;至virtual server 正常上线后随即将工作交还virtual server。
LVS测试
经过了上面的配置步骤,现在可以测试LVS了,步骤如下:
1 分别在vs1,real1,real2上运行/etc/lvs/rclvs_dr。注意,real1,real2上面的/etc/lvs
目录是vs2输出的。如果您的NFS配置没有成功,也可以把vs1上/etc/lvs/rclvs_dr复制到real1,real2上,然后分别运行。确保real1,real2上面的apache已经启动并且允许telnet。
2 测试Telnet:从client运行telnet 10002,
如果登录后看到如下输出就说明集群已经开始工作了:(假设以guest用户身份登录)
[guest@real1 guest]$——说明已经登录到服务器real1上。
再开启一个telnet窗口,登录后会发现系统提示变为:
[guest@real2 guest]$——说明已经登录到服务器real2上。
3 测试http:从client运行iexplore http://10002
因为在real1 和real2 上面的测试页不同,所以登录几次之后,显示出的页面也会有所不同,这样说明real server 已经在正常工作了。
一般用的就用简单的轮询就好了
调度算法
静态方法:仅根据算法本身实现调度;实现起点公平,不管服务器当前处理多少请求,分配的数量一致
动态方法:根据算法及后端RS当前的负载状况实现调度;不管以前分了多少,只看分配的结果是不是公平
静态调度算法(static Schedu)(4种):
(1)rr (Round Robin) :轮叫,轮询
说明:轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。缺点:是不考虑每台服务器的处理能力。
(2)wrr (Weight Round Robin) :加权轮询(以权重之间的比例实现在各主机之间进行调度)
说明:由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。
(3)sh (Source Hashing) : 源地址hash实现会话绑定sessionaffinity
说明:简单的说就是有将同一客户端的请求发给同一个real server,源地址散列调度算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的并且没有超负荷,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。它的算法流程与目标地址散列调度算法的基本相似,除了将请求的目标IP地址换成请求的源IP地址。
(4)dh : (Destination Hashing) : 目标地址hash
说明:将同样的请求发送给同一个server,一般用于缓存服务器,简单的说,LB集群后面又加了一层,在LB与realserver之间加了一层缓存服务器,当一个客户端请求一个页面时,LB发给cache1,当第二个客户端请求同样的页面时,LB还是发给cache1,这就是我们所说的,将同样的请求发给同一个server,来提高缓存的命中率。目标地址散列调度算法也是针对目标IP地址的负载均衡,它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
动态调度算法(dynamic Schedu)(6种):
(1)lc (Least-Connection Scheduling): 最少连接
说明:最少连接调度算法是把新的连接请求分配到当前连接数最小的服务器,最小连接调度是一种动态调度短算法,它通过服务器当前所活跃的连接数来估计服务器的负载均衡,调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1,当连接中止或超时,其连接数减一,在系统实现时,我们也引入当服务器的权值为0时,表示该服务器不可用而不被调度。此算法忽略了服务器的性能问题,有的服务器性能好,有的服务器性能差,通过加权重来区分性能,所以有了下面算法wlc。
简单算法:active256+inactive (谁的小,挑谁)
(2)wlc (Weighted Least-Connection Scheduling):加权最少连接
加权最小连接调度算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权限,加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。由于服务器的性能不同,我们给性能相对好的服务器,加大权重,即会接收到更多的请求。
简单算法:(active256+inactive)/weight(谁的小,挑谁)
(3)sed (shortest expected delay scheduling):最少期望延迟
说明:不考虑非活动连接,谁的权重大,我们优先选择权重大的服务器来接收请求,但会出现问题,就是权重比较大的服务器会很忙,但权重相对较小的服务器很闲,甚至会接收不到请求,所以便有了下面的算法nq。
基于wlc算法,简单算法:(active+1)256/weight (谁的小选谁)
(4)nq (Never Queue Scheduling): 永不排队
说明:在上面我们说明了,由于某台服务器的权重较小,比较空闲,甚至接收不到请求,而权重大的服务器会很忙,所此算法是sed改进,就是说不管你的权重多大都会被分配到请求。简单说,无需队列,如果有台real server的连接数为0就直接分配过去,不需要在进行sed运算。
(5)LBLC(Locality-Based Least Connections) :基于局部性的最少连接
说明:基于局部性的最少连接算法是针对请求报文的目标IP地址的负载均衡调度,主要用于Cache集群系统,因为Cache集群中客户请求报文的目标IP地址是变化的,这里假设任何后端服务器都可以处理任何请求,算法的设计目标在服务器的负载基本平衡的情况下,将相同的目标IP地址的请求调度到同一个台服务器,来提高服务器的访问局部性和主存Cache命中率,从而调整整个集群系统的处理能力。
(6)LBLCR(Locality-Based Least Connections with Replication) :基于局部性的带复制功能的最少连接
说明:基于局部性的带复制功能的最少连接调度算法也是针对目标IP地址的负载均衡,该算法根据请求的目标IP地址找出该目标IP地 址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除, 以降低复制的程度。
如果你是看CDN的东西看到的这句话,那么我可以来解释一下流程。“全局负载均衡技术将用户的访问指向离用户最近的工作正常的流媒体服务器上”。首先我们要明确几件事:
1、在CDN的案例图中,其实B和C不会在不同的城域。如果在不同的城市,一般会在那个地域也放置一个反向代理服务器或反向代理节点。B和C为同一地域,A为B、C的负载均稀器或调度器;
2、CDN的部署里,为避免单点故障或应对业务峰值,A并不是单台服务器,一般由多台服务器进行调度,一般采用LVS进行七层的负载和转发。通过LVS的负载均衡策略将业务转发至B和C,负载均衡策略可以进行设置,如轮询,权重轮询、随机等等;
3、CDN一般由DNS来做为用户流量调度,也是CDN的核心,即将用户的请求调度至距用户最近的节点,例如节点D,节点D通过负载均衡策略将请求分发至节点D后端的业务服务器E和F。
4、你看到的这句话,是指DNS层面的调度。
流媒体业务使用CDN的发布业务的前提和流程如下:
1、在流媒体业务服务器域名注册商修改域名的CNAME记录为CDN服务厂商的域名;(这一步是使用CDN的首要条件)
2、CDN服务厂商为业务设置不同地域的缓存节点,如北京、上海、美国等
3、不同地域设置的缓存节点具有不同的IP地址地址池,并且该节点内拥有业务调度器(LVS的DR)及真正的业务缓存服务器,缓存服务器通过类似Squid等程序定期缓存流媒体业务服务器的视频信息及网页信息,每隔一段时间进行更新请求;
4、用户通过DNS调度请求到某一节点时,该节点通过LVS技术将用户的请求调度至节点内某一以缓存节点进行处理,并返回结果给用户;(可参照LVS的工作模式)
5、当缓存节点有用户请求的内容时,将直接返回内容给用户,当缓存节点发现请求的内容不存在时,会主动返回流媒体业务的源服务器进行内容请求,并将结果缓存至缓存节点。
6、
用户最终拿到缓存节点上的视频内容及信息,由于通过DNS调度至用户最近的节点,通过LVS调度至最快最优的服务器进行处理,故加快了用户访问网站及视频
的速度。(视频的加速其实还有一种技术叫cache技术,即将视频提前下载到距用户最近的节点,用户看起来等于在局域网中查看)
DNS和CDN调度的流程如下:
1、用户访问流媒体业务的域名如“wwwabccom";
2、wwwabccom的cname记录为CDN服务厂商的域名,如wwwabccomcdncache01com;
3、用户的请求被转发至wwwabccomcdncache01com进行处理,即触发用户对wwwabccomcdncache01com域名的解析处理。DNS解析流程见图“DNS解析流程图”
4、
wwwabccomcdncache01com域名在权威服务器里配置的记录为多条的,即智能DNS,可参考DNSPOD,即一个域名可以根据地
域的不同配置不同的解析策略,源地址为北京联通的,即解析为用户指定的联通服务器IP地址,源地址为广州移动的,即解析的IP地址为用户指定广州移动的
IP地址。
5、DNS通过AnyCast技术进行三层负载均衡,类似于OSPF的等价路由,如8888这个地址实际为一个AnyCast地
址,即谷歌全球的递归DNS服务器均使用8888作为Global
DNS地址,当用户通过8888请求域名解析时会带上自己的DNS服务器地址进行请求,即8888会查询请求过来的客户端地址是哪里的IP地
址,如果是北京联通的,即将请求解析为北京联通的一个IP地址或解析为北京联通的一个负载均衡节点CNAME域名。
6、为了达到更精准备的DNS
解析调度,谷歌还研发了edns-client-subnet,即在DNS授权、递归、缓存上均支持该Edns协议,支持该协议后,用户在请求DNS域名
解析时,会带上自己客户端的源IP地址放在请求包里,而非客户端配置的DNS服务器IP地址。这样就有效的避免了用户使用Global
DNS服务器时不能调度精准的问题。(有关DNS授权、递归等问题可以参照RFC 1034和1035)
7、按照以上流程用户请求wwwabccomcdncache01com,会得到一个距离用户上网所在地域最近的一个CDN缓存节点的IP地址即楼主图中的反向代理服务节点。假设IP地址为1234。
8、用户请求1234的流媒体业务,节点1234通过LVS及其它负载均衡技术将用户的请求分发布该节点内最优最快的缓存服务器,如服务器E,IP地地址为19216814,即由19216814进行业务处理。
9,服务器19216814直接将结果返回给用户。
0条评论