基于linux 源码的LVS 搭建
前言:本文乃作者原创,参考了一些博客和相关的书籍,作如下说明:
本文的参考资料:1 lvs 官方网站 2 部分网站的博客 3 The Linux Enterprise Cluster 作者: 、 、 、 、arp_announce 、arp_filter 、hidden 就属于这个文件系统
本文描述了基于linux 源码的LVS -DR 集群转发telnet 服务(此服务也可是其它的服务:http 、mail 和ftp )搭建过程,并给出了搭建过程中可能遇到问题的解决办法。每个命令笔者都亲自在机器上运行过。对其中的一些命令给出图解说明,以帮助读者更好地理解搭LVS 的过程。整个搭建过程可以分以下五个大步骤:
(1 ) 为linux 源码打lvs 补丁(本文的linux 源码是不带ipvs 补丁的)。
(2 ) 配置内核编译选项和编译linux 内核。这个过程将产生内核镜像(bzImage) 、系统符号表(System.map) 、启动镜像(initrd.img) 。
(3 ) 配置/boot/grub/grub.conf 文件,引导新内核。(当然也可以通过LILO 引导系统)
(4 ) 安装ipvsadm, 配置director 服务器脚本director 和realserver 脚本realserver 。其中脚本diretor 需要配置对telnet 服务的转发。
(5 ) 运行telnet 服务去测试新搭建的telnet 集群系统。
硬件要求:三台pc 机器,一台做director (转发client 请求的服务器),两台做realserver 服务器。本文用三台虚拟机模拟三个pc 机。
软件要求: linux-2.4.20.tar.gz 、 ipvs-1.0.9.tar.gz.tar 、 ipvsadm-1.21.tar.gz 这三个包官方网站都可以下载到,谁要是找不到的,把邮箱告诉我,我发给你。
作者的编译环境:2.4.20 kernel 和 3.2.2 gcc 。
下面就开始搭建集群系统了:
1 cd /usr/src 。
2 解压缩三个压缩文件:tar -zxvf 压缩包文件名。
3 将ipvs 补丁打到linux-2.4.20 内核中:做个软连接linux ,因为ipvs 默认要打补丁的内核路径为/usr/src/linux( 具体可用vi 查看ipvs Makefile 内核配置路径)ln -s /usr/src/linux-2.4.20 linux 。 运行make patchkernel 和make installsource ,第一个命令是为内核打补丁,第二命令是copy ipvs 源码到内核(具体看Makefile 伪标签patchkernel 和installsource )。我一般把两个命令抽象成一个命令(或者说作用 吧)来理解:就是打ipvs 补丁到kernel 。
注:(1 )如果要用hidden 屏蔽realsever 的ARP 缓存问题,需要加载hidden 模块。进入/usr/src 运行gunzip linux-2.4.21-ipvs-1.0.10.patch.gz |patch -p0 命令(linux-2.4.21-ipvs-1.0.10.patch.gz 要到网上下载)。
(2 )linux 2.6 kernel 可用arp_igore 来解决ARP 缓存问题。Kernel 2.4 上没有arp_ignore 的,但可以用arp_filter 来解决ARP 问题。本文是用arp_filter 来解决realserver ARP 缓存问题。
4 cd /usr/src/linux/ 运行make mrproper( 删除.o 文件,为新内核做准备。首次编译也可以不运行)。运行make menuconfig 进行内核配置,如下图:
(1 )配置 ext3 文件系统:
(2 )配置以太网卡驱动模块pcnet32
(3 )配置ipvs 模块
注:第三个图片所有配置选项都选中。最后单击保存所有的配置。
运行make dep 命令( 生成源码文件的依赖关系,有兴趣的读者,可以看看makefile) 。
make bzImage( 产生内核镜像文件) 。 bzImage 主要是有关进程调度、内存管理等核心程序代码。网络驱动的模块不会在这里生成。
make modules 编译生成配置好的模块,如ipvs ,pcnet32 。
Make modules_install 安装生成2.4.20 模块(会在/lib/modules 产生2.4.20 的夹子)
在/boot/ 下产生bzImage-2.4.20-ipvs 、initrd-2.4.20-ipvs 、System.map
运行命令 [root@SLAVE linux]# cp ./arch/i386/boot/bzImage /boot/bzImage-2.4.20-ipvs
编辑 /etc/modules.conf 注释掉含有mptbase 和mptscsih 的行(原因是新内核无这两个模块)。如果不注释掉的话,下面的命令无法运行。如下图:
运行命令 mkinitrd /boot/initrd-2.4.20-ipvs 2.4.20 (产生initrd-2.4.20-ipvs 文件系统,它包含一些驱动程序,并作为临时文件系统来加载真正的根文件系统)
备份原来的System.map
mv /boot/System.map /boot/System.map.bak
运行命令 cp ./System.map /boot/System.map
5 用grub 引导新内核
编辑/boot/grub/grub.conf 配置文件,红色圈起的部分为新增的引导配置。如下图:
特别注意: root=/dev/hda2 这里hda2 为根文件系统(笔者机器文件系统为ext3 )所在的分区,如果你机器上文件系统所在的分区的hda3 ,这里就填hda3 。(如对硬盘分区不熟悉的,可以查看相关资料,这里就不累赘了。) root(hd0,0) 表示第一块硬盘的第一个分区(grub 分区和linux 的有所不同),也就是linux 中的hda1 。这里的hda1 为/boot 分区,grub 中的kernel 命令可指定绝对路径,也可以指定相对路径(/boot ), 这里取相对路径。可用df -lT 命令查看哪个分区挂载到哪个路径下,如下图:
在shell 下运行grub 命令,执行root (hd0,0 )和setup (hd0 ) 命令。主要是将新更新的配置放到MBR 中。quit 退出grub ,关机,重启( 记得选中2.4.20 -ipvs, 否则系统默认进入老系统) 。新的内核支持ipvs 了^_^ 。
6 配置redirector & realserver
(1 )执行下面命令,安装ipvsadm :
tar xzvf ipvsadm-1.21.tar.gz
cd ./ipvsadm-1.21
make
make install
(2 )Lvs 原理简述:director 服务器接受client 的telnet 请求,然后用round-roubin 的方式,把telnet 服务分发到realserver ,由realserver 提供telnet 服务。Realserver 对于client 来说是透明的,client 并不知道realserver 的存在。
物理架构如下图(本文的director 和realserver 在一个子网里面):
其中DIP 为director 的真实IP ,VIP 为director 的虚IP ,配置在eth0:0 上。而realserver 的VIP 配置在lo:0 上。RIP 为realserver 的真实IP 。
Dierctor 的脚本(脚本名为director )下图:
两个 realserve (脚本名为 realserver )的配置如下图:
把上面三个脚本放到各自的 /etc/init.d/ 下,分别运行:
Service director restart service realserver restart service realserver restart
好了,到此为止 LVS 集群服务搭建成功了,下面让我们去测试 LVS 吧,哈哈 !!!
( 6 )测试 LVS
停掉 redirctor 上的 telnet 服务, service xinetd stop 。编辑 /etc/xinetd.d/telnet , 设置 disable = no, 然后,开启两个真实服务机器上的 telnet 服务 service xinetd restart 。
运行命令: telnet 219.223.167.40(VIP)
若能登入,说明了 telnet 服务是 realserver 提供的,而不是 redirector 提供的,因为我们干才已经在 director 服务器上关闭了 telnet 服务。
有兴趣的可以对 LVS 做个压力测试。本篇到此终于完了!!!
如需转载,请注明原文链接
2009年 8月 15日