Chinaunix

标题: 搭建集群负载均衡系统(学习笔记) [打印本页]

作者: tigerlei    时间: 2005-07-05 16:08
标题: 搭建集群负载均衡系统(学习笔记)
声明:本文是参考大量网上资料以及tigerlei自己的实际操作而写的笔记,仅供大家参考,绝非原创。

搭建集群负载均衡系统

  负载均衡集群是在应用服务器高负载的情况下,由多台节点提供可伸缩的,高负载的服务器组以保证对外提供良好的服务响应;而LVS就是实现这一功能的技术.实际上LVS是一种Linux操作系统上基于IP层的负载均衡调度技术,它在操作系统核心层上,将来自IP层的TCP/UDP请求均衡地转移到不同的服务器,从而将一组服务器构成一个高性能、高可用的虚拟服务器。使用三台机器就可以用LVS实现最简单的集群,如图1所示。  



图1 LVS实现集群系统结构简图

图1显示一台名为Director的机器是前端负载均衡器,运行LVS,目前只能在Linux下运行.可以针对web、ftp、cache、mms甚至mysql等服务做load balance;后端两台机器称之为Real Server,是需要负载均衡的服务器,可以为各类系统,Linux、Solaris、Aix、BSD、Windows都可,甚至Director本身也可以作为Real Server.

本文将通过实际操作,重点介绍如何在Redhat 9上用LVS构建一个负载均衡集群,关于负载均衡集群、LVS的详细内容,可参考如下信息:
http://www.linuxvirtualserver.org/
http://www-900.ibm.com/developerWorks/cn/linux/cluster/lvs/part1/index.shtml
安装LVS
RedHat在 9.0以后,就将ipvsadm这些套件去除,因此如果想使用LVS(Linux Virtual Server),就得自己重新编译核心(kernel)。
下载所需软件
下载ipvs补丁包

从RedHat 9开始ipvs不再被预先编译到了RedHat发行版的内核中,我们需要从http://www.linuxvirtualserver.org/software/kernel-2.4下载新版的ipvs, 这里我们使用ipvs-1.0.9.tar.gz这个版本.
下载内核linux-2.4.20.tar.gz

这里需要强调的是由于所有的ipvs的补丁包都是为标准内核开发的,所以安装ipvs时不能使用RedHat光盘中的Kernel Source,而是需要去下载标准的内核。所以我们从ftp://ftp.kernel.org/pub/linux/kernel/ 得到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 LocalAddressort Scheduler Flags
  ->; RemoteAddressort           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上互相交替,试验成功!

小结
Cluster应用可分为三方面:High-Availability(HA)(高可用性集群)、Load Balance (负载均衡集群)、Scientific(科学集群)。本文只是简单的实现了其中的Load Balance,而High-Availability其实也是非常重要的.比如说如果FTP1死掉了,负责转送封包的DR并不晓得它已经故障无法使用,还是会将封包往故障的FTP1处送,这样将导致用户某此的访问遭到拒绝.其次如果整个集群只有一台Director,那幺这台主机就成为了系统单一失效点(a single failure point of the whole system),万一这部Director死掉了,那幺所有提供的服务都将失败.为了解决这两个问题,我们可以采用Mon+Heartbeat来进行进阶的设置, 从而实现High-Availability,具体做法将在下一篇文章中叙述.
作者: lengi    时间: 2005-07-05 16:18
标题: 搭建集群负载均衡系统(学习笔记)
好东东啊。
作者: wind521    时间: 2005-07-05 17:51
标题: 搭建集群负载均衡系统(学习笔记)
鼓励一下
作者: youth1980    时间: 2005-08-15 21:42
标题: 搭建集群负载均衡系统(学习笔记)
ftp能正确登陆,但是无法进行数据操作,请问如何处理?
作者: jackylau    时间: 2005-08-16 08:19
标题: 搭建集群负载均衡系统(学习笔记)
下一章什么时间出?放在哪?
作者: 天涯明月刀    时间: 2005-08-16 09:04
标题: 搭建集群负载均衡系统(学习笔记)
正好请教一下,当时自己做的时候一直迷茫的

负载均衡好做,但是怎样提供高可用即容错的?不是指ipvs服务器,而是后边的真实的服务器
我怎么确定后边的某台服务器不可用了,而在做均衡的时候不再向它转发连接请求?

一直没找到方法,除非自己写脚本
作者: 天涯明月刀    时间: 2005-08-16 11:28
标题: 搭建集群负载均衡系统(学习笔记)
有没有啥高招?
作者: tigerlei    时间: 2005-08-16 13:00
标题: 搭建集群负载均衡系统(学习笔记)
最简单的就是heartbeat
作者: ceacdong    时间: 2005-08-17 10:16
标题: 搭建集群负载均衡系统(学习笔记)
强烈支持,好东西
作者: 天涯明月刀    时间: 2005-08-17 10:44
标题: 搭建集群负载均衡系统(学习笔记)
[quote]原帖由 "tigerlei"]最简单的就是heartbeat[/quote 发表:

给谁做ha?
偶是问,lvs怎么确定后边的服务器某个不可用了
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  (建立转发规则)
总不能有一个服务器不能用了,还按照规则给它做转发把
作者: chutianyin    时间: 2005-11-29 16:05
lvs实现了负载均衡,文件共享呢?如果网站的访问量不大,就不需要用负载均衡,如果访问量大,才用这个,但是文件的共享和同步不知道兄弟是怎么解决的。
作者: me09    时间: 2005-11-30 10:32
原帖由 youth1980 于 2005-8-15 21:42 发表
ftp能正确登陆,但是无法进行数据操作,请问如何处理?

你采用的调度方法不是很好.ftp最好用 基于源地址 或基于目的地址的调用.
作者: myw58    时间: 2005-12-05 10:49
为什么执行完make install命令、用新内核重新引导,无法启动呢??????
作者: 临风轩主    时间: 2005-12-05 12:22
多谢楼主的共享
作者: linuxunix1    时间: 2005-12-05 12:32
楼主,你的下一篇呢?
作者: myw58    时间: 2005-12-05 16:59
为什么执行完make install命令、用新内核重新引导,无法启动呢??????
有高手知道为什么吗???????????????????????????
作者: inhance    时间: 2005-12-23 16:27
如果有图就更好了
作者: jamesb    时间: 2005-12-23 16:29
标题: 回复 4楼 youth1980 的帖子
显然,你发起连接到一台服务器上,但是数据流连接被转发到另外一台机器上了。在创建lvs server上加上-p的选项
作者: zhaohengai    时间: 2005-12-25 11:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: myw58    时间: 2005-12-25 15:15
具体在那一步加上 -p???望指教~~~
作者: macrodba    时间: 2005-12-26 09:39
支持 一下
作者: Richard1981    时间: 2006-01-11 11:11
谢谢楼主~~!
我照着做了一下,现在出现点问题,请楼主指教

我做的是apache的集群,设置均没问题,可现在就是访问不了。我的均衡器的IP是:192.168.0.111,我在realserver上用netstat -an |grep 80 发现连接已经可以收到。
这是均衡器的状态:
ipvsadm -L --stats
IP Virtual Server version 1.0.8 (size=65536)
Prot LocalAddressort               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddressort
TCP  host111:http                        4       12        0      576        0
  -> 192.168.0.94:http                   1        3        0      144        0
  -> 192.168.0.109:http                  4       12        0      576        0

请楼主和各位高手帮忙分析一下,谢谢了~~!
作者: ljhb    时间: 2006-01-11 12:33
tcpdump 分析一下
作者: jxinter    时间: 2006-03-04 12:48
为什么按你这个做法。内核里面找不到IPVS这项呢?
作者: hzzz    时间: 2006-03-08 17:50
支持,好东西
作者: jxinter    时间: 2006-03-09 11:56
标题: 急!!!
求救。为什么我下拉那内核,下拉那IPVS内按上所述,编内核时里面找不到IPVS这个选项啊?这问题是出在那


作者: newdayhope    时间: 2006-03-23 12:25
下一篇不知道在哪儿
作者: jxinter    时间: 2006-04-10 23:09
标题: 求学
请问在前端调度服务器上虽要打http://www.ssi.bg/~ja/补丁吗
作者: jxinter    时间: 2006-04-14 13:57
标题: lVS
REAL端能用2003系统吗?
作者: szu_papa    时间: 2006-04-28 10:49
原帖由 jxinter 于 2006-4-14 13:57 发表
REAL端能用2003系统吗?

我也想知道REAL端是WINDOWS怎么做?毕竟装3个redhat 很烦啊
作者: gb8007    时间: 2006-05-08 18:15
原帖由 天涯明月刀 于 2005-8-16 09:04 发表
正好请教一下,当时自己做的时候一直迷茫的

负载均衡好做,但是怎样提供高可用即容错的?不是指ipvs服务器,而是后边的真实的服务器
我怎么确定后边的某台服务器不可用了,而在做均衡的时候不再向它转发连接请 ...



而是后边的真实的服务器
我怎么确定后边的某台服务器不可用了,而在做均衡的时候不再向它转发连接请

应该是ipvs这个包在启作用吧,rip服务出现问题,在dip上就看可以看到rip的状况
作者: 0公务员0    时间: 2006-05-09 09:07
我照着做了,可是编译内核总不能引导登录系统,请问该怎么做
作者: linuxkumao    时间: 2007-11-08 14:45
顶。。。。。。。。。。。。。。。。
作者: lysde    时间: 2007-12-25 16:59
收藏,太好了!!!!
作者: xigua    时间: 2007-12-27 09:58
vsdvsdvvdvds
作者: rober_007    时间: 2007-12-27 13:52
很不错!支持!
作者: bighead0088    时间: 2008-03-03 11:33
职业的路过一下!!!!!!!!!!!!!!!!!!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2