负载均衡软件实现方式之一 - URL重定向方式html
有一种用软件实现负载均衡的方式,是基于"URL重定向"的.前端
先看看什么是URL重定向:mysql
"简单的说,若是一个网站有正规的URL和别名URL,对别名URL进行重定向到正规URL,访问同一个网址,或者网站改换成了新的域名则把旧的域名重定向到新的域名,都叫URL重定向"。linux
"不少网络协议都支持“重定向”功能,例如在HTTP协议中支持Location指令,接收到这个指令的浏览器将自动重定向到Location指明的另外一个URL上。"web
这种方式,对于简单的网站,若是网站是本身开发的,也在必定程度上可行.可是它存在着较多的问题:算法
一、“例如一台服务器如何能保证它重定向过的服务器是比较空闲的,而且不会再次发送Location指令,Location指令和浏览器都没有这方面的支持能力,这样很容易在浏览器上造成一种死循环。”sql
二、在哪里放LOCATION,也是一个问题。颇有可能用户会访问系统的不少个不一样URL,这个时候作起来会很是麻烦。而且,对URL的访问,有的时候是 直接过来的,能够被重定向,有的时候是带着SESSION之类的,重定向就可能会出问题。而且,这种作法,将负载均衡这个系统级的问题放到了应用层,结果 多是麻烦多多。shell
三、这种方式通常只适用于HTTP方式,可是实际上有太多状况不只仅是HTTP方式了,特别是用户若是在应用里面插一点流媒体之类的。后端
四、重定向的方式,效率远低于IP隧道。浏览器
五、这种方式,有的时候会伴以对服务器状态的检测,但每每也是在应用层面实现,从而实时性大打折扣。
实际上,这种方式是一种“对付”的解决方法,并不能真正用于企业级的负载均衡应用(这里企业级是指稍微复杂一点的应用系统)
能够看一下专业的负载均衡软件是如何来实现的:
对比一下能够发现,专业的负载均衡软件要更适用于正规应用,而重定向方式则比较适用于一些简单的网站应用。
负载均衡软件实现方式之二 - 基于DNS
讲到负载均衡,几乎全部地方都必需要讲一下基于DNS的方式,由于这实在是最基本、最简单的方式了。固然,也几乎全部地方都说到这种方式的种种缺点,不过,既然很基本,就仍是要说明一下。
下面这段讲得很清楚:
最先的负载均衡技术是经过DNS来实现的,在DNS中为多个地址配置同一个名字,于是查询这个名字的客户机将获得其中一个地址,从而使得不一样的客户访问不一样的服务器,达到负载均衡的目的。
DNS负载均衡是一种简单而有效的方法,可是它不能区分服务器的差别,也不能反映服务器的当前运行状态。当使用DNS负载均衡的时候,必须尽可能保证不一样的 客户计算机能均匀得到不一样的地址。因为DNS数据具有刷新时间标志,一旦超过这个时间限制,其余DNS服务器就须要和这个服务器交互,以从新得到地址数 据,就有可能得到不一样IP地址。所以为了使地址能随机分配,就应使刷新时间尽可能短,不一样地方的DNS服务器能更新对应的地址,达到随机得到地址,然而将过 期时间设置得太短,将使DNS流量大增,而形成额外的网络问题。DNS负载均衡的另外一个问题是,一旦某个服务器出现故障,即便及时修改了DNS设置,仍是 要等待足够的时间(刷新时间)才能发挥做用,在此期间,保存了故障服务器地址的客户计算机将不能正常访问服务器。
尽管存在多种问题,但它仍是一种很是有效的作法,包括Yahoo在内的不少大型网站都使用DNS。
引自:负载均衡技术研究
原文:http://www.ha999.com/loadbalance/lb_tech.htm
比较一下DNS方式与专业的负载均衡软件如PCL负载均衡软件,会发现DNS的问题在于,一是每每不能根据系统与服务的状态来判断负载,二是每每不能创建较复杂的负载均衡算法,而最主要的是DNS每每有缓存,简单分配负载问题不大,若是是应用集群这个就是没法接受的。
那么,为何象Yahoo在内的大型网站都使用DNS方式呢?由于对于门户网站来说,应用形态单一且简单,重要的是服务器数量与分布,而若是出现短时 间对于少许用户的服务中断问题并不大(好比有100台服务器,有一台不行了,即便DNS有缓存,也关系不大,用户从新刷一下,就极可能又分配到其余机器上了)。
可是,对于应用系统而言,好比两三台服务器,跑着比较复杂的应用,DNS方式就彻底不适合了,这个时候,就要用专业的负载均衡软件了。
咱们能够看一个实例,这样会对专业化负载均衡软件应该支持什么样的应用有更多的理解:36000人同时应用的负载均衡实例
负载均衡软件实现方式之三 - LVS
LVS是一个开源的软件,能够实现LINUX平台下的简单负载均衡.
后面所附文章,讲述了LVS实现负载均衡的方法.
由于文章较长,因此在转载前,先总结一下LVS的优缺点:
优势:
一、开源,免费
二、在网上能找到一些相关技术资源
三、具备软件负载均衡的一些优势
缺点:
一、具备开源产品常有的缺点,最核心的就是没有可靠的支持服务,没有人对其结果负责
二、功能比较简单,支持复杂应用的负载均衡能力较差,如算法较少等。
三、开启隧道方式需重编译内核
四、配置复杂
五、只支持LINUX,若是应用还包括WINDOWS、SOLIRIS等就不行了
所以,建议在简单的LINUX应用中使用LVS,复杂的应用,或者重要的应用,仍是应该使用专业的负载均衡软件,如富士通西门子公司的PCL负载均衡软件。
下面转载一下如何使用LVS实现负载均衡:
搭建集群负载均衡系统 (原文:http://www.xxlinux.com/linux/artic ... p/20060707/2519.html)
负载均衡集群是在应用服务器高负载的状况下,由多台节点提供可伸缩的,高负载的服务器组以保证对外提供良好的服务响应;而LVS就是实现这一功能的技 术.实际上LVS是一种Linux操做系统上基于IP层的负载均衡调度技术,它在操做系统核心层上,未来自IP层的TCP/UDP请求均衡地转移到不一样的 服务器,从而将一组服务器构成一个高性能、高可用的虚拟服务器。使用三台机器就能够用LVS实现最简单的集群。
假设一台名为Director的机器是前端负载均衡器,运行LVS,目前只能在Linux下运行.能够针对web、ftp、cache、mms甚至 mysql等服务作load balance;后端两台机器称之为Real Server,是须要负载均衡的服务器,能够为各种系统,Linux、Solaris、Aix、BSD、Windows均可,甚至Director自己也 能够做为Real Server.
本文将经过实际操做,重点介绍如何在Redhat 9上用LVS构建一个负载均衡集群,关于负载均衡集群、LVS的详细内容,可参考以下信息:
安装LVS
RedHat在 9.0之后,就将ipvsadm这些套件去除,所以若是想使用LVS(Linux Virtual Server),就得本身从新编译核心(kernel)。
下载所需软件
下载ipvs补丁包
从RedHat 9开始ipvs再也不被预先编译到了RedHat发行版的内核中,咱们须要从下载新版的ipvs, 这里咱们使用ipvs-1.0.9.tar.gz这个版本.
下载内核linux-2.4.20.tar.gz
这里须要强调的是因为全部的ipvs的补丁包都是为标准内核开发的,因此安装ipvs时不能使用RedHat光盘中的Kernel Source,而是须要去下载标准的内核。因此咱们从 获得standard kernel linux-2.4.20.tar.gz
下载ipvs管理工具ipvsadm
从http://www.linuxvirtualserver.org/ 获得ipvs管理工具ipvsadm-1.21.tar.gz, ipvsadm是设置ipvs转发方式和调度算法的工具.
开始安装
安装内核源码
把linux-2.4.20.tar.gz解压到/usr/src目录,生成了/usr/src/linux目录;若是生成的是/usr/src /linux-2.4.20目录,则要在/usr/src下创建一个链接 ln –s linux-2.4.20 linux,由于在ipvs-1.0.9中的makefile文件中默认指定Kernel Source的路径为:KERNELSOURCE = /usr/src/linux
把ipvs补丁Patch到内核源码中
把ipvs-1.0.9.tar.gz解压缩到某个目录,如/test,生成了/test/ipvs-1.0.9目录;进入/test/ipvs- 1.0.9,依次执行以下命令:make patchkernel、make installsource,将ipvs的Patch加载到kernel的source中。
从新编译支持ipvs的内核
进入/usr/src/linux目录,分别执行:
make mrproper 为建立新的内和配置作好准备
make menuconfig 进行配置
这里请确保IP:Virtual Server Configuration中的选项设定都用M
make dep 检测是否有相关的软件包被使用
make clean 为新内核结构准备源目录树
make bzImage 建立内核引导映像
make modules、make modules_install 生成模块
make install安装新的内核到指定位置并从新配置grub.conf
到这里新内核就安装完毕了,请重启并用此内核引导系统
安装ipvs管理工具ipvsadm
当使用新内核启动后,就能够安装ipvsadm:
tar xzvf ipvsadm-1.21.tar.gz
cd ./ipvsadm-1.21
make
make install
安装完成后,执行ipvsadm命令,若是有以下信息出现则说明安装成功了。
[root@leon c]# ipvsadm
IP Virtual Server version 1.0.9 (size=65536)
Prot LocalAddress:Port Scheduler Flags
->; RemoteAddress:Port Forward Weight ActiveConn InActConn
到如今为止,支持负载均衡功能的director就安装成功了,接下来咱们能够经过ipvsadm来配置一个负载均衡集群。
构建负载均衡集群
这里咱们假设局域网中有两台FTP服务器,IP分别为FTP1:10.83.33.103,FTP2: 10.83.33.2 所提供的资料都是相同的,这能够经过无密码SSH登陆+RSYNC来保证数据一致,这非本文中电,故而略过.咱们提供给用户的虚拟IP是 10.83.33.100,而在后台为这两台FTP服务器实行LVS负载均衡的服务器的IP是10.83.33.83.这三台均安装RedHat9系统.
咱们最终要实现的目标是当用户输入ftp 10.83.33.100时, LVS负载均衡服务器系统会根据当时的负载状况,依据轮换策略来决定Real Server究竟是FTP1仍是FTP2,从而使得整个FTP服务器的负载到达均衡.
目前LVS有三种负载平衡方式,NAT(Network Address Translation),DR(Direct Routing),IP Tunneling。其中,最为经常使用的是DR方式,所以这里只说明DR(Direct Routing)方式的LVS负载平衡。其它两种的详细状况请参考LVS-HOWTO.
Director(即10.83.33.83)上执行的设置
为了方便咱们将全部步骤写成一个shell script.
#!/bin/bash
echo "0" >; /proc/sys/net/ipv4/ip_forward (关闭ip_forward)
echo "1" >; /proc/sys/net/ipv4/conf/all/send_redirects (开启ICMP Redirects)
echo "1" >; /proc/sys/net/ipv4/conf/default/send_redirects (开启ICMP Redirects)
echo "1" >; /proc/sys/net/ipv4/conf/eth0/send_redirects (开启ICMP Redirects)
ifconfig eth0:100 10.83.33.100 broadcast 10.83.33.100 netmask 255.255.255.255
(设置虚拟IP)
route add -host 10.83.33.100 dev eth0:100 (设置达到虚拟Ip的路由)
ipvsadm –C (清空ipvsadm table)
ipvsadm -A -t 10.83.33.100:21 -s wrr (创建service rule, 当前调度算法为加权轮叫调度) ipvsadm -a -t 10.83.33.100:21 -r 10.83.33.76 -g -w 3 (创建转发规则)
ipvsadm -a -t 10.83.33.100:21 -r 10.83.33.2 -g -w 1 (创建转发规则)
ipvsadm (检查当前ipvsadm table)
将此shell script加入到/etc/rc.local中,这样在每次系统启动时均可以自动运行进行设置了。 Realserver(即10.83.33.2和10.83.33.76)上的设置
这里咱们必须先修正real server上arp problem .这是由于在使用VS/DR的时候,real server会在一块网卡上绑定两个IP,但linux在kernel 2.2.14之后就将eth0:1的NOARP FLAG关闭,这使得eth0:1仅仅是eth0的别名,任何对eth0:1的操做都对eth0有效,所以若是此时使eth0:1 NOARP,则也使得eth0 NOARP,这样整个网卡都不会收到数据包,具体的说就是由于我全部的机器都放在同一个网段,当该网段的Router接收到用户对虚拟IP的TCP connection要求(即便用FTP登陆服务器)时,会先在网段中利用Arp request询问谁有VIP的地址,而包含Director与Real Servers上全部的interface,只要他有那个ip,都会发送arp reply回去,形成网段内全部拥有Virtual IP的interface都会reply给Router,最后结果就是看谁的速度快,Router就将该封包送给谁,如此会形成LVS的Server并没有 法发挥其效果,而咱们所但愿的是只有Director上的Virtual IP发送arp reply回去,所以须要利用hidden这个pattch,将real server上的Virtual IP给隐藏起来,如此他就不会对Arp Request进行Reply,就能够解决ARP的问题.具体步骤是:
下载所需的软件包
从http://www.ssi.bg/~ja/ 获得hidden修正包,不一样的核心使用相应的版本.请参考下表
Patch Linux 2.4 Created
hidden-2.4.28-1.diff 2.4.28 - 2.4.30 November 18, 2004
hidden-2.4.26-1.diff 2.4.26 - 2.4.27 February 28, 2004
hidden-2.4.25-1.diff 2.4.25 February 19, 2004
hidden-2.4.20pre10-1.diff 2.4.20pre10 - 2.4.24 October 12, 2002
hidden-2.4.19pre5-1.diff 2.4.19pre5 - 2.4.20pre9 April 7, 2002
hidden-2.4.5-1.diff 2.4.5 - 2.4.19pre4 June 2, 2001
hidden-2.4.4-1.diff 2.4.4 April 29, 2001
Patch Linux 2.6 Created
hidden-2.6.9-1.diff 2.6.9 - 2.6.11 October 19, 2004
hidden-2.6.4-1.diff 2.6.4 - 2.6.8 March 12, 2004
hidden-2.6.3-1.diff 2.6.3 February 19, 2004
hidden-2.5.67-1.diff 2.5.67 - 2.6.2 April 9, 2003
本例使用的内核版本是2.4.20-8,所以下载hidden-2.4.20pre10-1.diff
从新编译内核,修正arp problem
把hidden-2.4.20pre10-1.diff放到/usr/src/linux下,用命令
patch -p1 < hidden-2.4.20pre10-1.diff对kernel进行patch
进入/usr/src/linux目录,分别执行:
make mrproper 为建立新的内和配置作好准备
make menuconfig 进行配置
make dep 检测是否有相关的软件包被使用
make clean 为新内核结构准备源目录树
make bzImage 建立内核引导映像
make modules、make modules_install 生成模块
make install 安装新的内核到指定位置并从新配置grub.conf
到这里新内核就安装完毕了,请重启并用此内核引导系统
设置Real server
为了方便咱们将全部步骤写成一个shell script.
#!/bin/bash
echo "0" >; /proc/sys/net/ipv4/ip_forward (关闭ip_forward)
ifconfig lo:100 10.83.33.100 broadcast 10.83.33.100 netmask 0xffffffff up (设置虚拟IP) route add -host 10.83.33.100 dev lo:100 (设置达到虚拟Ip的路由)
echo "1" >; /proc/sys/net/ipv4/conf/all/hidden (开启No-ARP)
echo "1" >; /proc/sys/net/ipv4/conf/lo/hidden (开启No-ARP)
将此shell script加入到/etc/rc.local中,这样在每次系统启动时均可以自动运行进行设置了。
测试
为了使得咱们清楚地知道访问的是那一台FTP服务器,咱们在FTP1上编辑
/etc/vsftpd/vsftpd.conf,设置 ftpd_banner=Welcome to FTP1 server,在FTP2设置
ftpd_banner=Welcome to FTP2 server,设置完毕后重启服务.
如今在另外一台客户机开几个终端,依次输入ftp 10.83.33.100,咱们能够从欢迎词上看到,每次登陆的FTP服务器都不是固定的,它会在FTP1和FTP2上互相交替,试验成功!
负载均衡软件实现方式之四 - 专业负载均衡软件
看一下专业的负载均衡软件是什么样的:PCL负载均衡软件
详细内容,你们能够本身去看。简单讲,专业负载均衡软件大概有如下特色:
一、它是基于IP隧道的,而不是象URL重定向方式那样。因此,它是独立于应用的
二、它支持不一样平台,即应用能够是基于LINUX,WINDOWS或SOLARIS的,而不是象LVS只能在LINUX上
三、它是实时的,这点与DNS方式有极大的差异。
四、它可以根据系统、应用的状况来决定负载,这一点与硬件负载均衡设备有很大差异。
五、专业负载均衡软件,适用于企业级应用,不管从其可靠性,仍是从其服务保障上,都不是象LVS那样的开源软件可比的。
总结一下,若是是象YAHOO那样的网站应用,能够考虑DNS方式,参见:负载均衡软件实现方式之二 - 基于DNS
若是是特别简单的应用,能够考虑URL重定向方式,参见:负载均衡软件实现方式之一 - URL重定向方式
若是是不过重要的纯LINUX应用,能够考虑LVS,参见:负载均衡软件实现方式之三 - LVS
若是是重要、流量大、应用简单、预算充足的状况,能够考虑硬件方式(好比用F5)(必定要作双机啊!),参见:软件与硬件负载均衡的比较
而若是是重要的企业应用,两台或几十台服务器,应用比较复杂,包括有可能跨平台,则应该考虑专业的负载均衡软件。参见:PCL负载均衡软件-应用集群的理想选择。