LVS和Heartbeat的安装配置说明Word格式文档下载.docx
《LVS和Heartbeat的安装配置说明Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《LVS和Heartbeat的安装配置说明Word格式文档下载.docx(16页珍藏版)》请在冰点文库上搜索。
![LVS和Heartbeat的安装配置说明Word格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/64790548-3d27-4354-b4c6-2ce612a1cae1/64790548-3d27-4354-b4c6-2ce612a1cae11.gif)
所以,在REALSERVER的内核中,必须编译支持IPTUNNEL这个选项。
IPTUNNEL也在Networkingoptions里面,如下图所示。
1.2.3.直接路由模式
直接路由模式比较特别,很难说和什么方面相似,前2种模式基本上都是工作在网络层上(三层),而直接路由模式则应该是工作在数据链路层上(二层)。
其原理为,DR和REALSERVER都使用同一个IP对外服务。
但只有DR对ARP请求进行响应,所有REALSERVER对本身这个IP的ARP请求保持静默。
也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的REALSERVER,把目的MAC地址改为REALSERVER的MAC并发给这台REALSERVER。
这时REALSERVER收到这个数据包,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。
由于DR要对二层包头进行改换,所以DR和REALSERVER之间必须在一个广播域,也可以简单的理解为在同一台交换机上。
1.3.LVS的安装和配置
LVS的安装在其官方网站上有详细的说明文档。
网址是:
。
不过一般说来以下网址
1.3.1.让DR内核支持IPVS
2.6及以上内核中已经支持了IPVS功能。
至于2.4的内核则看版本,2.4.23及以上的内核已经有了ipvs,所以不必且不能打包,如果打了就会编译出错。
对于2.4.23以下内核则必须打IPVS补丁。
2.4.23/24的内核有问题,所以不建议使用这两种内核。
IPVS只对DR需要,而RS则不需要。
Ipvs补丁和ipvsadm的下载地址:
http:
//www.linuxvirtualserver.org/software/ipvs.html.
1.3.1.1.打补丁来支持ipvs
对于2.4.23以下内核需要这个步骤,否则请按1.3.1.2步骤。
到http:
//www.linuxvirtualserver.org/software/ipvs.html下载对应的补丁。
假设你使用的内核是2.4.18,那么下载Version1.0.10,包为ipvs-1.0.10.tar.gz。
解包后阅读README文件,按中其中的方法打包。
不过我对这里的说明有点不明白。
下面我说说我的方法:
cd<
ipvs的解压目录>
makepatchkernel
makeinstallsource
或者
cd/usr/src/linux
cp<
/linux_kernel_ksyms_c.diff./
/linux_net_netsyms_c.diff./
patch–p1<
linux_kernel_ksyms_c.diff
linux_net_netsyms_c.diff
然后cd/usr/src/linux
makedep;
makebzImage;
接着重新copy新的内核文件,然后lilo,然后reboot
1.3.1.2.重新配置内核选项来支持IPVS
对于2.4.23及以上的内核已经有了ipvs,所以你可以直接在内核中配置来支持IPVS。
makemenuconfig
对于不同版本的内核来说,各个配置项的路径是不一致的。
对于2.6.8.1菜单路径是:
DeviceDrivers->
Networkingsupport->
Networkingoptions->
IP:
VirtualServerConfiguration。
而在2.4.30的内核中Networkingoptions就在第一层路径下面。
请到目的菜单Networkingoptions下面,如下图所示:
如果你需要IPVS支持IP隧道模式,那么请选择下面这两个选项:
然后再选择:
VirtualServerConfiguration这个选项。
这时出现下图:
请选中所有的选项。
要关注的是IPVSconnectiontablesize,这个东西意思是每个连接的hashtable的大小,大家知道通常hash表越大,一次命中的机会越大。
这里取值范围是2-20,2的2次方到2的20次方。
有的资料建议用20,个人认为默认值就足够了。
由于每个连接需要128BYTE,每个HASH位需要8BYTE,所以(128+8)*2^20=128M+8M=136M,对于我们的系统没问题。
最后的是IPVSapplicationhelper,这种是专门针对多次连接的情况的(可以理解为session),大家都知道一次FTP通讯需要2次连接,所以必须保证这两次都在一台服务器上,否则将连接失败。
这是个明显针对协议,或者说针对应用层的分类。
有点七层交换的味道,希望这个功能尽快把HTTP的SESSION给加上,到时就不用使用后台同步SESSION或者对原地址做HASH定向处理了。
这里负载调度算法的意思请具体参考:
//www.linuxvirtualserver.org/zh/lvs4.html
接着重新copy新的内核文件,然后lilo,然后reboot。
启动时可以看到ipvs提示信息。
1.3.2.RS的NOARP问题解决
直接路由模式肯定要处理NOARP的问题,官方文档《LVS-mini-HOWTO》3.7节指出在如下情况下必须处理:
IF((youareusingLVS-DRorLVS-Tunonthedirector)
AND
(youarerunningaLinux2.2.x,2.4.x,2.6.xkernelonarealserver)
(
theVIPontherealserverisonanethernetdeviceeglo:
0,tunl0:
i.e.packetstotheVIParenotbeingacceptedbytransparentproxy
)
therealserverscananswerarprequestsfrom
theclient/router(therealserversareonthesame
pieceofwire|network|segmentasthedirector)
))
THEN{YOUMUSTHANDLETHEARPPROBLEM}
FI
对于这断话的,我不太理解。
下面引用其它的文档说明。
在使用LVS中的DR与IPTunnel的时候,会需要有一块网络卡要设定两个IP的情形,但是Linux在2.2.14之后,就将eth0:
1的-NOARP这个FLAG关闭。
也就是说在kernel2.2.14以后,eth0:
1就视为eth0的别名,任何对eth0:
1的设定也同样作用在eth0,换句话说,我对eth0:
1下-NOARP,同样也会对eth0有作用,这样会使得整张网络卡收不到封包。
在直接路由、IP隧道模式下,因为我所有的机器都放在同一个网段,当该网段的Router接收到客户端(Client)对虚拟IP(VirtualIP)的TCPconnection要求时,会先在网段中利用Arprequest询问谁有VIP的地址,而包含Director与RealServers上所有的interface(不管Primary还是Subinterface),只要他有那个ip,都会发送arpreply回去,造成网段内所有拥有VirtualIP的interface都会reply给Router,最后结果就是看谁的速度快,Router就将该封包送给谁,如此会造成LVS的Server并无法发挥其效果,因此需要利用hidden这个pattch,将Subinterface上的VirtualIP给隐藏起来,如此他就不会对ArpRequest进行Reply,如此就可以解决ARP的问题,而这个NOARP的问题,kernel发展小组认为不重要,所以以后都不会修改,要用请自行编译。
所以从http:
//www.ssi.bg/~ja/#hidden下载对应的补丁,对于2.6.8.1的内核我选择hidden-2.6.4-1.diff。
cphidden-2.6.4-1.diff/usr/src/linux
hidden-2.6.4-1.diff
makebzImage;
copy新的内核文件到相应的启动目录。
再lilo。
最后reboot。
当然解决noarp的问题,不止这一种。
譬如leofan在内核中通过以下四个命令解决,前提条件是有这些设备:
echo"
1"
>
/proc/sys/net/ipv4/conf/lo/arp_ignore
2"
/proc/sys/net/ipv4/conf/lo/arp_announce
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
不过我在2.6.8.1的内核中试了一下好像不行。
Lvs把包固定发给了rs1这台机器,估计rs1arpreply响应最快。
1.3.3.安装ipvsadm
这是一个IPVS的管理工具,提供了一个和IPVS打交道的接口,包括配置IPVS和连接信息统计。
到地址:
//www.linuxvirtualserver.org/software/ipvs.html去下载相应的版本。
对于2.6.8.1内核,下了ipvsadm-1.24-5.src.rpm。
rpmipvsadm的存放路径/ipvsadm-1.24-5.src.rpm
cd/usr/src/rpm/SOURCE/
tar–zxvfipvsadm-1.24.tar.gz
cdipvsadm-1.24
make;
makeinstall
然后:
ipvsadm,如果出现以下提示说明已经安装成功。
IPVirtualServerversion1.2.0(size=4096)
ProtLocalAddress:
PortSchedulerFlags
->
RemoteAddress:
PortForwardWeightActiveConnInActConn
ipvsadm的具体用法可参考manipvsadm.
1.3.4.Ipvsadm的配置
根据节和5结节的说明,Ipvsadm的配置可以用官方的配置脚本配置,配置脚本可在以手工敲入命令配置。
官方的脚本使用perl写的,配置脚本的命令为包中文件名为cofigure的文件,包中的lvs_dr.conf.one_NIC_one_network等文件是一些配置信息,作为configure的参数传入.下面这个命令对应两台realserver的配置,需要自己修改lvs_dr.conf.one_NIC_two_network中的信息.
./configurelvs_dr.conf.one_NIC_two_network
不过本人试了一下自动配置没有成功,就手工配置了.读者有兴趣可自行研究如何使用官方配置脚本配置。
1.3.4.1.DR的配置
对于前台负载均衡服务器DirecrtServer(DR)的配置,我自己做一个配置脚本config_vs.sh。
里面的参数请自己替换。
#/bin/sh
#file:
config_vs.sh这里默认使用网卡eth0,如果想用其它网卡请自行替换即可。
VIP=172.30.31.200#DR的虚拟服务IP
DIP=172.30.31.68#DR的eth0真实地址
RS1=172.30.31.66#realserver1的真实地址
RS2=172.30.31.67#realserver2的真实地址
GW=172.30.31.1#DR使用的网关或路由的地址
SERVICE=22#你的服务端口
cat/proc/sys/net/ipv4/ip_forward#脚本调试信息
0"
>
/proc/sys/net/ipv4/ip_forward
/proc/sys/net/ipv4/conf/all/send_redirects#脚本调试信息
cat/proc/sys/net/ipv4/conf/all/send_redirects#脚本调试信息
/proc/sys/net/ipv4/conf/default/send_redirects
cat/proc/sys/net/ipv4/conf/default/send_redirects#脚本调试信息
/proc/sys/net/ipv4/conf/eth0/send_redirects
cat/proc/sys/net/ipv4/conf/eth0/send_redirects#脚本调试信息
/sbin/ifconfigeth0${DIP}#配置所使用的网卡IP
#配置虚拟服务IP
/sbin/ifconfigeth0:
0${VIP}broadcast${VIP}netmask255.255.255.255
/sbin/routeadd-host${VIP}deveth0:
0#添加虚拟IP的路由
/sbin/routeadddefaultgw${GW}#添加本地路由
0#脚本调试信息,显示虚拟IP配置
#/bin/ping-b${VIP}#脚本调试信息,看看虚拟IP是否可以ping通
/sbin/route-n#脚本调试信息,显示路由信息
/sbin/ipvsadm–C#清除虚拟服务器表,也就是清除IPVS的原配置
#添加服务及轮调调度算法,-t:
tcp服务,-A:
添加服务;
-srr:
指定调度算法为轮调
/sbin/ipvsadm-A-t${VIP}:
${SERVICE}-srr
#添加realserver,-a:
添加一台RS,-t:
tcp服务,-r:
RS的地址,-g:
直接路由模式。
#这里语句个数随realserver的个数而定
/sbin/ipvsadm-a-t${VIP}:
${SERVICE}-r${RS1}-g
${SERVICE}-r${RS2}-g
ping-c1${RS1}#脚本调试信息
ping-c1${RS2}#脚本调试信息
/sbin/ipvsadm#脚本调试信息
#endofconfig_vs.sh
补:
由于DR是个单点,为了保证高可用幸,我们使用了开源包Heartbeat来保证。
所以有两台DR,一台为主,一台为辅。
各自都可用这个脚本来配置,不过DIP要该成各自的真实地址,其它选项必须完全相同。
1.3.4.2.RS的配置
对于realserver(RS)的配置,我自己做一个配置脚本config_rs.sh。
config_rs.sh这里默认使用网卡eth0,如果想用其它网卡请自行替换即可。
#DR的eth0真实地址,作用是在配置时测试DR的IP是否有效。
但是DR切换后,DIP变了,所以这项取消了。
#DIP=172.30.31.68
LOCALIP=172.30.31.66#realserver1的真实地址
GW=172.30.31.1#realserver使用的网关或路由的地址
/sbin/ifconfigeth0${LOCALIP}#配置eth0的本地IP
/sbin/routeadddefaultgw${GW}#添加默认路由
/bin/netstat-rn#脚本调试信息
ping-c1${GW}#脚本调试信息,是否可以ping通网关
cat/proc/sys/net/ipv4/ip_forward#脚本调试信息,ip_forward是否配置正确
ping-c1${DIP}#脚本调试信息,是否可以ping通DR的真实地址
ping–c1${VIP}#是否可以ping通虚拟DR的IP
#按照realserver的虚拟IP
/sbin/ifconfiglo:
0${VIP}broadcast${VIP}netmask0xffffffffup
#配置出口
#在lo:
0上添加去虚拟IP的路由
/sbin/routeadd-host${VIP}devlo:
/proc/sys/net/ipv4/conf/all/hidden
cat/proc/sys/net/ipv4/conf/all/hidden#脚本调试信息
/proc/sys/net/ipv4/conf/lo/hidden
cat/proc/sys/net/ipv4/conf/lo/hidden#脚本调试信息
#endofconfig_rs.sh
不同realserver配置时只要改变LOCALIP选项就可以了。
我只添加了172.30.31.66(realserver1)和172.30.31.67(realserver2)两台机器。
DR的主节点名称为heatbeat1,副节点名称为heartbeat2
1.4.试运行结果
安装上面的说明走完所有的步骤后,我用ssh测试了一下。
奇数次去了172.30.31.66这台机器,偶数次去了172.30.31.67这台机器
2.heartbeat
2.1.heartbeat的介绍
这里的heartbeat就是linux-ha项目,被许多高可用系统采用。
我们这里lvs必须是个高可用系统,所以我们采用heartbeat。
本文也以lvs作为高可用服务来说明heartbeat的使用。
Heartbeat的高版本可以负责3个及以上的节点。
本文2个节点来说明,在你的两台机器(一台作为主节点,另一台为从节点)上运行heartbeat,并配置好相关的选项,最重要的是lvs资源一定要配置进去。
那么开始时主节点提供lvs服务,一旦主节点崩溃,那么从节点立即接管lvs服务。
如果是自己开启了其它的服务资源,那么接管的时候,该服务资源相应的tcp连接必须重连,而且主从节点的应用层逻辑状态有应用层自己保证一致。
Lvs不存在应用层的逻辑状态。
具体介绍请参考:
//www.linux-ha.org/
2.2.libnet的安装
安装heatbeat前必须先安装libnet包,请到址下载。
libnet提供了一些高层的api,让应用程序开发者可以修改网络包。
我下的包为libnet.tar.gz,版本为1.1.2.1
cd存放路径
tar–zxvflibnet.tar.gz
cdlibnet
./configure;
make;
2.3.heartbeat的安装
//linux-ha.org/download/index.html下载相应的版本,对于2.6.8.1我下载了最新的稳定版本heartbeat-2.0.2.tar.gz。
tar–zxvfheartbeat-2.0.2.tar.gz
cdheartbeat-2.0.2
./Configuremeconfigure