Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135871
  • 博文数量: 58
  • 博客积分: 1411
  • 博客等级: 上尉
  • 技术积分: 750
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-25 11:41
文章分类
文章存档

2010年(20)

2009年(37)

2008年(1)

我的朋友

分类: LINUX

2010-05-05 17:07:50

   LVS负载均衡配置

1、什么是LVS?
首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实他是一种丛集(Cluster)的技术,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。
为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。一般来说,LVS集群采用三层结构.
2、LVS主要组成部分为:
负载调度器(load balancer/ Director),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
服务器池(server pool/ Realserver),是一组真正执行客户请求的服务器,执行的服务一般有WEB、MAIL、FTP和DNS等。
共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
3、LVS负载均衡方式:
Virtual Server via NAT
VS/NAT是一种最简单的方式,所有的RealServer只需要将自己的网关指向Director即可。客户端可以是任意操作系统,但此方式下,一个Director能够带动的RealServer比较有限。在VS/NAT的方式下,Director也可以兼为一台RealServer。

Virtual Server via IP Tunneling
IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。

它的连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况,动态地选择一台服务器,将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的服务器;服务器收到报文后,先将报文解封获得原来目标地址为 VIP 的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。

Virtual Server via Direct Routing
VS/DR方式是通过改写请求报文中的MAC地址部分来实现的。Director和RealServer必需在物理上有一个网卡通过不间断的局域网相连。 RealServer上绑定的VIP配置在各自Non-ARP的网络设备上(如lo或tunl),Director的VIP地址对外可见,而RealServer的VIP对外是不可见的。RealServer的地址即可以是内部地址,也可以是真实地址。

4、三种负载均衡方式优缺点比较:

Virtual Server via NAT
VS/NAT 的优点是服务器可以运行任何支持TCP/IP的操作系统,它只需要一个IP地址配置在调度器上,
服务器组可以用私有的IP地址。缺点是它的伸缩能力有限,当服务器结点数目升到20时,调度器本身
有可能成为系统的新瓶颈,因为在VS/NAT中请求和响应报文都需要通过负载调度器。 我们在Pentium
166 处理器的主机上测得重写报文的平均延时为60us,性能更高的处理器上延时会短一些。假设TCP
报文的平均长度为536 Bytes,则调度器的最大吞吐量为8.93 MBytes/s. 我们再假设每台服务器的吞
吐量为800KBytes/s,这样一个调度器可以带动10台服务器。(注:这是很早以前测得的数据)

基于 VS/NAT的的集群系统可以适合许多服务器的性能要求。如果负载调度器成为系统新的瓶颈,可以
有三种方法解决这个问题:混合方法、VS/TUN和 VS/DR。在DNS混合集群系统中,有若干个VS/NAT负
载调度器,每个负载调度器带自己的服务器集群,同时这些负载调度器又通过RR-DNS组成简单的域名。
但VS/TUN和VS/DR是提高系统吞吐量的更好方法。

对于那些将IP地址或者端口号在报文数据中传送的网络服务,需要编写相应的应用模块来转换报文数
据中的IP地址或者端口号。这会带来实现的工作量,同时应用模块检查报文的开销会降低系统的吞吐
率。
Virtual Server via IP Tunneling
在VS/TUN 的集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应答的数据直
接返回给用户。这样,负载调度器就可以处理大量的请求,它甚至可以调度百台以上的服务器(同等规
模的服务器),而它不会成为系统的瓶颈。即使负载调度器只有100Mbps的全双工网卡,整个系统的最
大吞吐量可超过 1Gbps。所以,VS/TUN可以极大地增加负载调度器调度的服务器数量。VS/TUN调度器
可以调度上百台服务器,而它本身不会成为系统的瓶颈,可以用来构建高性能的超级服务器。

VS/TUN技术对服务器有要求,即所有的服务器必须支持“IP Tunneling”或者“IP Encapsulation”
协议。目前,VS/TUN的后端服务器主要运行Linux操作系统,我们没对其他操作系统进行测试。因为
“IP Tunneling”正成为各个操作系统的标准协议,所以VS/TUN应该会适用运行其他操作系统的后端
服务器。
Virtual Server via Direct Routing
跟VS/TUN方法一样,VS/DR调度器只处理客户到服务器端的连接,响应数据可以直接从独立的网络路
由返回给客户。这可以极大地提高LVS集群系统的伸缩性。

跟VS/TUN相比,这种方法没有IP隧道的开销,但是要求负载调度器与实际服务器都有一块网卡连在同
一物理网段上,服务器网络设备(或者设备别名)不作ARP响应,或者能将报文重定向(Redirect)到
本地的Socket端口上。

注:以上三种方法所能支持最大服务器数目的估计是假设调度器使用100M网卡,调度器的硬件配置与
后端服务器的硬件配置相同,而且是对一般Web服务。使 用更高的硬件配置(如千兆网卡和更快的处
理器)作为调度器,调度器所能调度的服务器数量会相应增加。当应用不同时,服务器的数目也会相应
地改变。所以,以 上数据估计主要是为三种方法的伸缩性进行量化比较。

4、安装与配置LVS:
      IPVS负载调度器一般使用直接路由方法,即VS/DR方法,所以这里我们只介绍VS/DR的安装与配置。
1)、VS/DR的体系结构
VS/DR的体系结构如图3.6所示:调度器和服务器组都必须在物理上有一个网卡通过不分断的局域网相连,如通过交换机或者高速的HUB相连。VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。
2)、VS/DR的工作流程
VS/DR的工作流程如图3.7所示:它的连接调度和管理与VS/NAT和VS/TUN中的一样,它的报文转
发方法又有不同,将报文直接路由给目标服务器。在VS/DR中,调度器根据各个服务器的负载情况,动态
地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,
再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务
器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网
络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

LVS DR模式Web服务器配置
Kernel: Linux sl-test2 2.6.18-128.el5
Virtual        IP: 172.18.5.244   (虚拟服务器)
Server1     IP: 172.18.5.239   (负载服务器)
Realserver 01: 172.18.5.240   (集群服务器)
Realserver 02: 172.18.5.241   (集群服务器)
实验目的:
在负载服务器上,配置LVS(DR模式),做web服务器的集群。实现最终用户访问虚拟IP,负载服务器,将请求分发到集群下的服务器,由集群服务器轮流提供web服务。

1. 安装
modprobe -l |grep ipvs                
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs.ko
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_dh.ko
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_ftp.ko
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_lblc.ko
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_lblcr.ko
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_lc.ko
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_nq.ko
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_rr.ko
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_sed.ko
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_sh.ko
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_wlc.ko
/lib/modules/2.6.18-128.el5/kernel/net/ipv4/ipvs/ip_vs_wrr.ko
//检查Kernel中是否包含ipvs 模块,如果出现以上信息,表明kernel中已经包含了ipvs模块,不用重新编译内核

tar zxvf ipvsadm-1.24.tar.gz
cd ipvsadm-1.24
make
make install
注意在make时可能会出现很多错误的信息,请按照如下操作就可以正常编译
ln -s /usr/src/kernels/2.6.18-128.el5-i686 /usr/src/linux

2. 配置
两台集群服务器器都安装配置好Apache,分别编辑/usr/local/apache2211/htdocs/index.html文件,内容分别为:
240:

[172.18.5.240] It works!


244:

[172.18.5.241] It works!

负载服务器---172.18.5.239
编写脚本:
vi /tmp/lvs.sh
#!/bin/bash
vip=172.18.5.244
rs1=172.18.5.240
rs2=172.18.5.241
#set virttual ip address
/sbin/ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
/sbin/route add -host $vip dev eth0:0
#clear ipvs tables
/sbin/ipvsadm -C
#set LVS Server
/sbin/ipvsadm -A -t $vip:80 -s rr
/sbin/ipvsadm -a -t $vip:80 -r $rs1:80 -g
/sbin/ipvsadm -a -t $vip:80 -r $rs2:80 -g
#run lvs
/sbin/ipvsadm
-------------------
sh /tmp/lvs.sh
-------------------------------------------------------------------
集群服务器---172.18.5.240
编写脚本:
vi /tmp/lvs.sh
vip=172.18.5.238
/sbin/ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
/sbin/route add -host $vip dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p
------------------
sh /tmp/lvs.sh
启动Apache服务
-------------------------------------------------------------------
集群服务器---172.18.5.241
编写脚本:
vi /tmp/lvs.sh
vip=172.18.5.238
/sbin/ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
/sbin/route add -host $vip dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p
------------------
sh /tmp/lvs.sh
启动Apache服务
-------------------------------------------------------------------
3. 测试
在客户端反复访问:http:.//172.18.5.234, 如果能轮流显示出 172.18.5.240 和 172.18.5.241 的http测试文件,即LVS(DR模式)配置完成。

##########################################################################################################################################################################
LVS DR模式Mysql服务器配置
Kernel: Linux sl-test2 2.6.18-128.el5
Virtual          IP: 172.18.5.244 (虚拟服务器)
Server1       IP: 172.18.5.239 (负载服务器)
Realserver 01: 172.18.5.240 (集群服务器)
Realserver 02: 172.18.5.241 (集群服务器)
实验目的:
在负载服务器上,配置LVS(DR模式),做web服务器的集群。实现最终用户访问虚拟IP,负载服务器,将请求分发到集群下的服务器,由集群服务器轮流提供web服务。
1. 配置
两台集群服务器器都安装配置好Mysql,分别创建数据库,名称:LVS_240 LVS_241
负载服务器---172.18.5.239
编写脚本:
vi /tmp/lvs.sh
#!/bin/bash
vip=172.18.5.244
rs1=172.18.5.240
rs2=172.18.5.241
#set virttual ip address
/sbin/ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
/sbin/route add -host $vip dev eth0:0
#clear ipvs tables
/sbin/ipvsadm -C
#set LVS Server
/sbin/ipvsadm -A -t $vip:3306 -s rr
/sbin/ipvsadm -a -t $vip:3306 -r $rs1:3306 -g
/sbin/ipvsadm -a -t $vip:3306 -r $rs2:3306 -g
#run lvs
/sbin/ipvsadm
-------------------
sh /tmp/lvs.sh
-------------------------------------------------------------------------------
集群服务器---172.18.5.240
编写脚本:
vi /tmp/lvs.sh
vip=172.18.5.238
/sbin/ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
/sbin/route add -host $vip dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p
-------------------
sh /tmp/lvs.sh
启动Mysql服务,添加访问权限 GRANT ALL PRIVILEGES ON *.* TO " IDENTIFIED BY "bestwiz"
---------------------------------------------------------------------------------
集群服务器---172.18.5.241
编写脚本:
vi /tmp/lvs.sh
vip=172.18.5.238
/sbin/ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
/sbin/route add -host $vip dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p
--------------------
sh /tmp/lvs.sh
启动Mysql服务,添加访问权限 GRANT ALL PRIVILEGES ON *.* TO " IDENTIFIED BY "bestwiz"
----------------------------------------------------------------------------------
2. 测试
在IP地址为172.18.5.238的机器上执行
mysql -h172.18.5.244 -uroot -pbestwiz
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| LVS_240           |
| mysql                 |
| test                     |
+--------------------+
4 rows in set (0.02 sec)  
mysql> quit;   退出

mysql -h172.18.5.244 -uroot -pbestwiz
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| LVS_241            |
| mysql                |
| test                   |
+--------------------+
4 rows in set (0.00 sec)

显示的数据库名称不同,测试成功。
------------------------------------------------------------------------------------
远程连接mysql数据库时速度很慢,mysql默认开启了DNS的反向解析,解决方法:
vi /etc/my.cnf
[mysqld]
skip-name-resolve
连接速度会变快。

阅读(976) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~