下面介绍一个lvs集群的组件。
pulse: 这是控制启动其他守护进程的过程所需的。正常情况下它是在系统启动时,在lvs路由上通过/etc/rc.d/init.d/pulse脚本启动。通过pulse,提供一种简单的心跳检测,非活动的lvs路由决定活动的路由是否健康,是否需要启动failover。
lvs : lvs守护进程在lvs路由上运行。它读入配置文件,调用ipvsadm来建立和维护ipvs路由选择表。
nanny :nanny将监视在活动的lvs路由上运行的守护进程。通过这个守护进程,活动的路由决定每个真实服务器是否健康,同时获得服务器的工作量。它是一个被每个虚拟服务器使用的,独立的在每个真实服务器上运行的进程。
/etc/lvs.cf :只是lvs集群的配置文件。直接或间接的,所有的守护进程都从这个文件中获得它们的配置信息。
piranha :这是一个图形化的监视,配置和管理lvs集群的工具。通常情况下,你将用这个工具来维护/etc/lvs.cf,重新启动运行的守护进程,监视一个lvs集群。
ipvsadm :这个工具用来更新核心中的ipvs路由选择表。lvs守护进程通过调用ipvsadm向ipvs路由选择表添加,改变或删除项目来建立和管理一个lvs集群。
lvs集群的背景
redhat lvs集群是基于linux社团直接的贡献,要不然就是linux社团工程使它的成分更富于灵感,更丰富。 lvs集群主要是源于wensong zhang的linux虚拟服务器核心选择规则(请看http://www.linuxvirtualserver.org)。当前redhat lvs支持的功能:
建立虚拟的服务器:公共网络中的服务请求到达的地址,采用浮动ip地址。
虚拟服务器上的服务请求到真实服务器上的路由选择。
负载平衡
包转发中的网络地址翻译。
lvs的创新被redhat lvs集群所支持,它以很多的技术为基础,包括网络地址的翻译(nat),ip伪装,端口转发。对于一般性的讨论和相关howto的索引以及有关的主题,请看http://www.linas.org/linux/load.html
硬件/网络的要求
一个lvs集群由一个或两个lvs路由,一些提供web和ftp服务的真实服务器组成。下面描述了连接和硬件的要求。
lvs路由
一个基本的lvs路由的要求是一个linux服务器。这台机器要有两个网络适配器,一个与公共网络连接而另一个与真实服务器的内部网络连接。
如果要有failover功能,你需要有第二个linux服务器来作为备份lvs路由。这台机器也需要两块适配器来连接公共网络和有真实服务器的内部网络。两个lvs路由中的适配器设备必须相匹配。因此,如果主lvs路由设备eth0和eth1分别与公共网和内部网相连,在备份lvs路由中的相同设备也要分别与公共网和内部网连接。注意,备份lvs路由是个纯热候补机器。
真实服务器
lvs路由连接的内部网包括一定数量的web/ftp服务器主机。寻址到虚拟服务器上的工作被重定向到真实的服务器,这些服务器可以是各种各样的,运行任何操作系统或是web服务器的计算机平台。
在配置过程中,你对每个真实服务器的砝码进行赋值。这是一个反映每个服务器处理能力的,与其它服务器相关联在一起的整数(以内存,处理器速度,处理器个数,等等为基础)。它们是成比例的(2/1,20/10,200/100),这很有效。例如,分配的砝码是2000的服务器表示它的计算能力是砝码为1000的服务器的两倍。通过两个有效的任务计划规则(表一所示),以装载信息为基础来分配砝码,从而动态的调节砝码。你应该准备制定一个准确的砝码。
[目录]
路由的必要条件
lvs路由的必要条件
lvs路由要求redhat linux6.1或更高的版本。在lvs路由上,packet-forwarding,packet defragmenting和ip masquerading必须是激活的。
激活packet-forwarding和defragmenting,确定/etc/sysconf/network中由这两行:
FORWARD_IPV4=yes
DEFRAG_IPV4=yes
这些行将使/etc/rc.d/rc.sysinit在路由启动时执行:
echo 1 >; /proc/sys/net/ipv4/ip_forward
echo 1 >; /proc/sys/net/ipv4/ip_always_defrag
激活ip masquerading,用这个命令:
ipchains -A forward -j MASQ -s n.n.n.n/type -d 0.0.0.0/0
其中:
n.n.n.n是内部子网的真实服务器的连接地址。
类型是8.16.24.32,他们表示地址的类型和掩码: netmask | type | Subnet
~~~~~~~~~~~~~~~~|~~~~~~|~~~~~~~~~~~~~~~
255.0.0.0 | 8 | Class A
255.255.0.0 | 16 | Class B
255.255.255.0 | 24 | Class C
255.255.255.255 | 32 | Point-to-point
你也许要将ipchains命令加入到init脚本中去(例如,/etc/rc.d/rc.local),这样在lvs路由系统启动时masquerading将被配置好。
ipchains是一个在核心的tcp栈中设定的,用来产生和管理防火墙规则的工具。masquerading使用这些规则的一个小的部分,它允许机器通过内部网络的ip与外面的网络通信。使用ipchains对系统的安全有很大的影响。如果你对系统安全有兴趣,请阅读ipchains howto。(http://www.linuxdoc.org/HOWTO/IPCHAINS-HOWTO.html).
[目录]
节点内部连接的必要条件
在配置过程中,你选择的工具集(rsh或ssh)将被用于在lvs路由中对/etc/lvs.cf
配置文件进行同步。选择的工具必须在lvs路由中被激活,如此这样每个路由上的root才可在没有管理者介入的情况下登陆到另外的路由上去。
并且在配置过程中,你也要选择工具(uptime,ruptime,或rup)在活动的路由上用来监视真实服务器上的工作量。在真实服务器上激活这些被选中的工具。如果不能做到这点(例如,你的一个真实服务器是windows/nt web服务器),集群将仍然提供高性能的服务。然而,weighted round robin 和weighted least-connections(表一介绍的)运算规则将受到影响。换句话说,因为装载的信息将不再有效,用户分配的砝码将静态的被应用而不是动态的基于服务器工作量来调整。
表二描述了在通常情况下,你要在源主机和目标主机上做什么来激活这些工具。要了解详细的情况,请看man文件。注意,用rsh和ssh,root必须能在网络中登陆。为了在redhat linux系统中激活远程登陆,从文件/etc/pam.d/login中移去下面这一行:
auth required /lib/security/pam_security.so
这是个安全漏洞,虽然很小。确信你的lvs节点有一个合适的防火墙,这样可以允许值得信赖的节点登陆。
rsh
在目标主机上的根目录下创建一个.rhosts文件,其属性为600,注明源 主机和用户(例如,foo.host1.com root)。
ssh
获得并安装工具,由于法律原因没有在国际的linux版本发行。在源主机和目标主机上禁止通过所有其它的方式远程登陆,使用./ssh/authorized_keys建立基于rsa的认证,然后启动sshd。
uptime
如上所示的方法,在每一个真实服务器上激活rsh或是ssh。
ruptime
设置在启动时,每一个lvs路由和真实服务器上启动rwhod。
rup
设置在启动时,每一个真实服务器启动rpc.rstatd。
[目录]
安装软件
安装软件
lvs集群的软件包含三个发行的rpm软件包:
piranha(程序)
piranha-gui(图形界面的配置工具)
piranha-docs(文档) 你可用这命令从6.1的光盘中安装这些软件包:
#rpm -Uvh /mnt/cdrom/RedHat/RPMS/piranha*.rpm
因为你的硬件平台的缘故,获得这些软件包合理的升级,请访问redhat的网站http://www.redhat.com/corp/support/errata/rh61-errata-updates.html
[目录]
配置
配置一个lvs集群
你可以从lvs路由通过编辑配置文件和启动或重新启动pulse守护进程,来安装和维护lvs集群。特别的几个步骤是:
在主路由上,编辑配置文件/etc/lvs.cf。
拷贝编辑好的配置文件到备份路由上。
首先在主路由上启动(或重启)pulse守护进程,然后是备份路由。
你可用你喜欢的编辑器编辑配置文件,从shell中执行这几步。在shell中的启动重启和停止的命令是:
/etc/rc.d/init.d/pulse start
/etc/rc.d/init.d/pulse restart
/etc/rc.d/init.d/pulse stop
当需要时,pulse守护进程启动或重启其他的lvs集群守护进程,它们的配置文件信息是直接或间接的从当前的配置文件中获得的。
如果你停止pulse(为了关闭集群),首先要停止在备份路由上的pulse。这将阻止有可能备份路由代替激活的路由。
作为一种选择,你可用piranha来建立,监视和管理你的lvs集群。可在它的窗口中设置或是改变/etc/lvs.cf中的一些行,这里还有启动,停止和重启集群的按钮。使用piranha的要求是你的lvs路由必须配置好了x window系统。使用piranha的好处是它可同步主路由和备份路由上的配置文件,你可在激活的路由上执行所有的管理任务执行。
下一章将描述lvs集群的配置文件。如果你要手工配置这些文件,请阅读这一章。如果你选择使用piranha,请看 the section called Using the Piranha Configuration Tool.
编辑配置文件
/etc/lvs.cf文件有三个部分。全局部分,在表三中描述,建立lvs路由和特殊的网络和心脏跳动检测参数。这有一组集群的参数。预设虚拟服务器一部分,在表四中描述,定义虚拟服务器的地址,建立虚拟服务器和真实服务器之间的关联,还有特别的任务计划参数。对每个被定义的虚拟服务器都有一组独立的参数。预设真实服务器一部分在表五中描述,定义从每个虚拟服务器到真实服务器的路由选择。对每个虚拟服务器有一组参数。
Table 3. Setting Global Parameters
参数 描述
primary =
输入通过连接主lvs路由到公共网络的适配器的ip地址。
backup = backup=
输入通过连接备份lvs路由到公共网络的适配器的ip地址。
heartbeat_port =
输入在主路由和备份路由上使用心脏跳动检测的端口号。
keepalive =
输入心脏跳动检测时间间隔是多少秒。
deadtime =
输入在等待几秒后宣布无响应路由死亡并且启动failover
rsh_command = [rsh|ssh]
输入熟悉的命令以同步主路由和备份路由的配置文件。重点:在表二中讲述,你必须在主路由和备份路由上激活被选择的命令。
network = [nat|direct|tunnel]
现在只有网络地址翻译被支持。
nat_router =
输入浮动ip地址和nat路由设备。这个ip地址必须是每个真实服务器和活动lvs路由通信的默认路由。连接lvs路由到内部网络上的真实服务器的设备是ip地址的别名(例如,eth1:1)。在两个lvs路由上的设备必须是相同的(例如,eth1)。
Table 4. Setting Per-Virtual-Server Parameters
参数 描述
name
输入一个唯一定义的虚拟服务器名字
address =
输入虚拟服务器的ip地址:一个与全称域名相关联的浮动ip地址
active = [0|1]
激活(1)或屏蔽(0)这个ip地址
load_monitor = [uptime|ruptime|rup]
选择在活动路由上用于监视真实服务器工作量的工具(默认是uptime)。重点:如表二中所述,除非你在真实服务器上激活选好的命令,使用动态载入信息的运行规则,将被应用于静态的砝码上,而不是通过载入信息来调整砝码。如果你选择默认方式(uptime),这个你为了"rsh_command"而指定的工具,在登陆到真实服务器上时使用。在真实服务器端,这个工具必须被激活。
timeout =
输入在真实服务器被确定死亡而移出路由表之前的一个失效时间(默认是10秒)
reentry =
输入一个以恢复的真实服务器被重新加入到路由表中之前的持续正常的秒数(默认是180秒)。
port = [http/80|ftp/21]
输入在虚拟服务器上的监听端口:http用80(默认)或ftp用21端口。或是你也可输入数字。
scheduler = [wlc|lc|wrr|rr]
选择从虚拟服务器上到真实服务器,分配任务的运行规则(默认是wlc)选项在表一中描述。
Table 5. Setting Per-Real-Server Parameters
参数 描述
name
输入唯一的真实服务器名字
address =
输入真实服务器在内部网络中的ip地址
active = [0|1]
激活(1)或是屏蔽(0)真实服务器
weight =
输入一个指定这台服务器的处理能力的整数(默认是1),它与其它真实服务器相关联。
使用piranha配置工具
启动piranha的方法时,成为root用户然后打入piranha &。当你这样做了后,它的主窗口将被打开。窗口由四个标签:
控制/监视--第一个标签。用于start/stop/restart集群守护进程和监视运行状态。看 the section called Controls/Monitoring Tab.
Global Settings --
用于设定主lvs路由和nat路由的ip地址。请看 the section called Global Settings Tab.
Redundancy --
设定备份路由的地址和心脏跳动检测的参数。请看 the section called Redundancy Tab.
Virtual Servers --
用于设定服务器地址,建立服务器地址和真实的web/ftp服务器主机之间的路由选择。请看 the section called Virtual Servers.
piranha窗口有一些这样的按钮:
OK -- 应用改变同时退出窗口。
Apply -- 应用改变但不退出窗口。
Close -- 不应用改变而退出窗口。
Controls/Monitoring Tab
区域/按钮 描述
Start/Stop
当集群守护进程还没有运行时,这个按钮标记为开始:点击它来启动集群。当集群守护进程没有运行时,这个按钮标记为停止:点击它停止集群守护进程。
Add pulse daemon to this runlevel
选择在这个运行级中,在系统启动时启动pulse。
Update information now
点击来显示当前核心路由表的信息。
Auto-update
选择在特定的时间间隔内自动显示核心路由表信息。
Global Settings Tab
区域/按钮 描述
Primary LVS server IP
包含了lvs主路由的公共ip地址
NAT Router IP
包含了与连接虚拟服务器网络到真实服务器网络的网络适配器相关联的浮动ip地址。这个地址被用作真实服务器与虚拟服务器通信的网关。如果这个节点失败,其地址将被lvs备份路由节点所继承。
NAT Router Device
与nat路由ip地址相联系的设备的名字。这个通过地址别名来实现。例如,nat路由的ip可以为物理设备eth1化名为eth1:1。
Sync tool
选择用来同步主路由和备份路由的工具。你选的工具必须激活,这样lvs路由才可相互登陆而不用输入密码。一般的过程请看表二 。
Redundancy Tab
区域/按钮 描述
Enable redundant server
选择激活failover。
Redundant LVS server
IP 包含备份路由的公共ip。
Heartbeat interval (seconds)
包含了两次心脏跳动检测之间的秒数:备份lvs节点检测主lvs节点看是否还活着的时间间隔。
Assume dead after (seconds)
如果时间用完了主lvs节点还无响应,备份路由将启动failover。在failover过程中,备份路由接管所有的在主lvs路由上处理的虚拟服务器的ip,无条件广播arps,通知它的mac地址作为寻址到主路由包的目标地址。
Heartbeat port
输入在主路由和备份路由中用于心跳检测的端口。
Virtual Servers
屏幕显示一排当前被定义的虚拟服务器的信息。点击一排信息来选择它。在屏幕右边的按钮是应用当前选择的虚拟服务器。点击删除是移去选择的虚拟服务器。
区域/按钮 描述
Status
显示激活或屏蔽。点击屏蔽来关闭一个激活的虚拟服务器。点击激活来启动一个选择的虚拟服务器。改变状态后,你必须要重启pulse守护进程来使改变生效。要这样做的话,到controls/monitoring tab,点击停止按钮(它的名字变为了启动),而后点击启动。
Name
包含一个唯一定义的虚拟服务器名。
Port
包含监听到来的服务请求的端口。
Protocol
当前只有tcp被支持。
Add/Edit a Virtual Server
点击添加按钮来创建一个新的未被定义的虚拟服务器。点击编辑按钮(或是双击这排信息)来定义或修改一个虚拟服务器。点击真实服务器标签来观看或是修改被选好的与真实服务器相关联的虚拟服务器。
区域/按钮 描述
Name
输入对这个虚拟服务器唯一定义的名字
Application
点击选择http或是ftp
Port
输入监听到来的服务请求的端口
Address
输入服务请求到达的浮动ip地址。这个服务请求到达的地址已和一个全称的域名相关联。
Device
一个连接lvs路由到公共网络,其浮动ip地址通过ip别名相关联的适配器设备的名字(例如,eht0:1)。如果活动路由失败,在这期间虚拟服务器地址和端口将转到在备份路由上的对应设备上,从而备份路由成为活动路由。
Re-entry Time
输入一个以恢复的真实服务器被重新加入到路由表中之前的持续正常的秒数(默认是180秒)。
Service timeout
输入一个以秒为单位的时间,在这段时间里真实服务器必须响应一个重定向请求。如果主机超过了这个时间,它将被宣布为死亡并从集群中移除。
每个两秒钟在活动路由上运行的nanny进程发送一个心脏跳动检测(必要的ping连接)到每个真实服务器。如果成功了,服务连接(必要的一个telnet连接)将被送到一个特定的服务端口。如果nanny收到从真实服务器返回的任何响应,真实服务器和提供的服务被推定为活着。如果无响应服务超时超过了有效秒数,那么这个真实服务器将被推定为死亡并被一除出路由表。但是nanny通过每两秒钟发送一次心跳检测继续监视着服务器和它提供的服务。如果,在一次成功的ping以后,一个被移出去的服务器保持"re-entery time"时间的存活,它将被重新加入到核心路由表中去。
Load monitoring tool
选择用于决定在真实服务器上工作量的工具(uptime,ru,或ruptime)。在表二的表格中描述了激活这些工具的一般过程。
Scheduling
选择从虚拟服务器到真实服务器上的请求的路由选择规则。在表以中描述了选项。
Real Servers
屏幕显示了每个当前被定义的真实服务器的一排信息。点击这一排信息来选定它。屏幕右边的按钮是应用当前选择的一排。点击删除来移去一个被选择的真实服务器。
区域/按钮 描述
Status
显示激活或屏蔽。点击屏蔽来关闭一个激活的虚拟服务器。点击激活来启动一个选择的虚拟服务器。改变状态后,你必须要重启pulse守护进程来使改变生效。要这样做的话,到controls/monitoring tab,点击停止按钮(它的名字变为了启动),而后点击启动。
Name
显示服务器在集群中的名字。
Address
显示服务器的ip地址。
Add/Edit a Real Server
点击添加按钮来创建一个新的未被定义的真实服务器。点击编辑按钮(或是双击这排信息)来定义或修改一个真实服务器。
区域/按钮 描述
Name
输入一个描述名字。
Address
输入一个才内部网络中的真实服务器的ip地址。
Weight
输入一个指定这台服务器的处理能力的整数,它与其它真实服务器相关联。
例子---建立一个5节点的集群
这一节将一步步地介绍怎样建立一个由两个lvs路由和三个web/ftp服务器的集群。首先,收集信息然后照着接下来一节说明的一样来建立五个系统。然后是从shell方式对这个例子加以补充(在 the section called Implementing the Example from the Shell中解释)或是启动一个图形界面的配置工具(在 the section called Implementing the Example with Piranha说明) 。
图三显示了在你装完lvs路由和真实服务器后将出现的网络。所有显示的网络地址是为了阐述得更明白。
Figure 3. Layout of the Example Network
|-------|------------------------------------------|---------| Public network
|eth0=1.2.3.2 |eth0=1.2.3.3
|eth0:1=1.2.3.1 (vs1) |
------|----- -------|-----
| active | | backup |
| router | | router |
| | | |
------|----- -------|-----
|eth1=192.168.1.1 |eth1=192.168.1.2
|eth1:1=192.168.1.254 (NAT router) |
|-------|-|------------------|-----------------|---|----------| Private network
|eth0=192.168.1.3 |eth0=192.168.1.4 |eth0=192.168.1.5
| | |
|---------| |---------| |---------|
| rs1 | | rs2 | | rs3 |
|_________| |_________| |_________|
初步设置
从网络管理员那获得虚拟服务器的ip地址。在我们的例子中将是1.2.3.1。在lvs集群中的服务请求将被寻址到一个和这个地址相关联的全称域名上。
定位五个服务器和指定它们的角色:1个主lvs路由,1个备份路由,3个真实服务器。lvs路由必须装上了linux系统,运行red hat 6.1或更高。真实服务器可以是任何平台,运行任何操作系统和web服务器。
3-7步建立lvs路由。
在每个lvs路由上,装有两个以太网卡,eth0和eth1。在eth0上建立一个公共ip界面和一个内部ip界面。公共界面的设备(eth0)是用于心脏跳动检测的设备。虚拟服务器的地址是这个设备的别名。
Primary node Backup node
eth0 1.2.3.2 1.2.3.3
eth1 192.168.1.1 192.168.1.2
为路由上连接活动路由到内部网络的设备(eth1)制定一个ip地址(192.168.1.254)。这个浮动ip地址将在路由设备上化名为eth1:1,同时将成为每个真实服务器与活动路由通信的默认路由和内部网络的网关。
在每个lvs路由上:
激活package forwarding。在系统启动时执行,确信文件/etc/sysconf/newwork包含了这以行forward_ipv4=yes。激活package forwarding而不用重启,登陆为root输入下面命令:
echo "1" >; /proc/sys/net/ipv4/ip_forward
激活packet defragmenting。在系统启动时便执行,确信文件/etc/sysconf/network包含这一行defrag_piv4=yes。激活package defragmenting而不用重启,登陆为root输入下面的命令:
echo "1" >; /proc/sys/net/ipv4/ip_always_defrag
伪装内部网络。输入下面这条命令到/etc/rc.d/rc.local:
ipchains -A forward -j MASQ -s 192.168.1.0/24 -d 0.0.0.0
决定是否使用类似于rsh或ssh进行lvs集群文件同步。验证你的选择是否安装,这样lvs路由才可登陆到其他的路由上,而不用管理者介入。在这个例子中,我们选择rsh。
在每个lvs路由上,验证lvs集群软件是否装好。
8-11步是建立真实服务器。
在每个真实服务器上,装有一个以太网卡,eth0。照第3步在同一个内部子网络中建立一个ip地址,为每个服务器分配一个砝码,这是一个反映每个服务器处理能力的,与其它服务器相关联在一起的整数。在这个例子中,rs1有两倍于rs2和rs3的处理能力(两个处理器)
rs1 rs2 rs3
eth0 192.168.1.3 192.168.1.4 192.168.1.5
weight 2000 1000 1000
在每个真实服务器上验证在第四步中注明的地址是它与活动路由通信的默认路由。
决定用哪个程序(uptime,ruptime,rup)在活动路由上运行,用来监视真实服务器上的工作量。如果选择uptime,每个lvs路由必须在无管理员介入的情况下与每个真实服务器连接,在第6步中使用你选择的类似的工具。得到一般的激活指令请看表二。如果你选择的工具不能被激活(例如,其中一个真实服务器是一个nt系统),使用动态装载信息的计划规则仍将工作,但是用户分配的砝码将静态的被应用而不是动态的基于服务器工作量来调整。
验证每个真实服务器上安装和配置了http服务。注意:真实服务器必须监听与虚拟服务器对应的同一个端口(如例中的80)。
验证(例中用telnet或ping)每个真实服务器可到达公共网络上的主机。如果一个在内部网络上的真实服务器不可达到,这预示着服务器与活动路由间的通信失败了。看8和9步。
确定运行参数。对于这里的一些参数,你也许需要测试一定的时间来获得一个恰当的值。在这个例子中,我们用了列表中的值。
取值 参数描述
1050
主路由和备份路由心跳检测的监听端口。
2
心跳检测的时间间隔秒数 。
10
宣布无响应路由死亡并且启动failover的等待秒数。
10
无响应真实服务器被确定死亡而移出路由表的等待秒数 。
180
当一个真实服务器被移出路由表后开始又有了响应,在被重新加入到路由表的等待秒秒数。
wlc
使用weight least-connections负载平衡规则(考虑其动态调整的砝码,分配较多的工作给不忙的服务器)。对选项的描述请看表一。
http
应用程序。可选项有ftp。
80
虚拟服务器上的端口数。在虚拟服务器上的监听端口,在真实服务器上也是同样的。
现在我么准备补充一个例子。你可向下一节中的例子一样在shell下工作。或者你也可象例( the section called Implementing the Example with Piranha.)中的用图形界面的配置工具。
补充一个shell下配置的例子
用你喜欢的编辑器,打开/etc/lvs.cf文件,设置如下所示的值。 右边的数字是在 the section called Preliminary Setup 中讨论配置的每步的链接。
# Global section
primary = 1.2.3.2 3
backup = 1.2.3.3 3
keepalive = 2 13
deadtime = 10 13
heartbeat_port = 1050 13
rsh_command = rsh 6
network = nat
nat_router = 192.168.1.254 eth1:1 4
# Per-virtual-server section
virtual server vs1 { 8
address = 1.2.3.1 1
active = 1
load_monitor = ruptime 10
timeout = 10 13
reentry = 180 13
port = 80 13
scheduler = wlc 13
# Per-real-server section
server rs1 { 8
address = 192.168.1.3 8
active = 1
weight = 2000 8
}
server rs2 { 8
address = 192.168.1.4 8
active = 1
weight = 1000 8
}
server rs3 { 8
address = 192.168.1.5 8
active = 1
weight = 1000 8
}
}
拷贝编辑好的配置文件到备份路由上。
在主路由上,用这个命令启动pulse守护进程:
/etc/rc.d/init.d/pulse start
在备份路由上启动pulse守护进程。
补充一个用piranha的例子
在主路由上,登陆为root,打入piranha &启动图形配置工具。
点击global settings标签输入下面的值:
Field Enter: See Step:
Primary LVS server IP 1.2.3.2 3
NAT Router IP 192.168.1.254 4
NAT Router Device eth1:1 4
Sync tool rsh 6
点击redundancy标签输入下面的值:
Field Enter: See Step:
Enable Redundant server (select)
Redundant LVS server IP 1.2.3.3 3
Heartbeat interval 2 13
Assume dead after 10 13
Heartbeat port 1050 13
点击virtual servers标签。在标签上,点击add,然后是edit,输入下面
的值:
Field Enter: See Step:
Name vs1
Application http 13
Port 80 13
Address 1.2.3.1 1
Device eth0:1 3
Re-entry time 180 13
Service timeout 10 13
Load monitoring tool ruptime 10
Scheduling weighted least-connections 13
点击real servers标签。在标签上,点击add,然后是edit,输入下面的值:
Field Enter: See Step:
Name rs1 8
Address 192.168.1.3 8
Weight 2000 8
在rs2和rs3上重复第5步。对于他们来说,输入砝码为1000,这表示了rs1的运算能力是rs2和rs3的两倍。
点击close回到real servers标签。在这里,选择每一个真实服务器点击activate来激活它。
点击close回到virtual servers标签。在这里,选择每一个虚拟服务器点击activate来激活它。
点击controls/monitoring标签:
点击start按钮(名字改变为stop)。
如果你选中"add pulse daemon to this runlevel"集群将在系统启动时启动,在piranha启动时,上面的按钮通常将被标为stop。
登陆到备份路游泳这条命令启动pulse:
/etc/rc.d/init.d/pulse start
如果你正确的输入了上面所示的值,piranha将在配置文件最后产生一个如下结构的信息,这些将在虚拟服务器和它的真实服务器上使用。
network = nat
nat_router = 192.168.1.254 eth1:1
virtual vs1 {
address = 1.2.3.1 eth0:1
active = 1
scheduler = wlc
load_monitor = ruptime
timeout = 5
server rs1 {
address = 192.168.1.3
active = 1
weight = 2000
}
server rs2 {
address = 192.168.1.4
active = 1
weight = 1000
}
server rs3 {
address = 192.168.1.5
active = 1
weight = 1000
}
}
简单实例
通过Linux LVS,实现WWW,Telnet服务的负载平衡。这里实现Telnet集群服务仅为了测试上的方便。
LVS有三种负载平衡方式,NAT(Network Address Translation),DR(Direct Routing),IP Tunneling。其中,最为常用的是DR方式,因此这里只说明DR(Direct Routing)方式的LVS负载平衡。
网络拓扑结构。
为测试方便,4台机器处于同一网段内,通过一交换机或者集线器相连。实际的应用中,最好能够将虚拟服务器vs1和真实服务器rs1, rs2置于于不同的网段上,即提高了性能,也加强了整个集群系统的安全性。
服务器的软硬件配置
首先说明,虽然本文的测试环境中用的是3台相同配置的服务器,但LVS并不要求集群中的服务器规格划一,相反,可以根据服务器的不同配置和负载情况,调整负载分配策略,充分利用集群环境中的每一台服务器。
这3台服务器中,vs1作为虚拟服务器(即负载平衡服务器),负责将用户的访问请求转发到集群内部的rs1,rs2,然后由rs1,rs2分别处理。
client为客户端测试机器,可以为任意操作系统。
4台服务器的操作系统和网络配置分别为:
vs1: RedHat 6.2, Kernel 2.2.19
vs1: eth0 192.168.0.1
vs1: eth0:101 192.168.0.101
rs1: RedHat 6.2, Kernel 2.2.14
rs1: eth0 192.168.0.3
rs1: dummy0 192.168.0.101
rs2: RedHat 6.2, Kernel 2.2.14
rs2: eth0 192.168.0.4
rs2: dummy0 192.168.0.101
client: Windows 2000
client: eth0 192.168.0.200
其中,192.168.0.101是允许用户访问的IP。
虚拟服务器的集群配置
大部分的集群配置工作都在虚拟服务器vs1上面,需要下面的几个步骤:
重新编译内核。
首先,下载最新的Linux内核,版本号为2.2.19,下载地址为:http://www.kernel.org/,解压缩后置于/usr/src/linux目录下。
其次需要下载LVS的内核补丁,地址为:http://www.linuxvirtualserver.org/software/ipvs-1.0.6-2.2.19.tar.gz。这里注意,如果你用的Linux内核不是2.2.19版本的,请下载相应版本的LVS内核补丁。将ipvs-1.0.6-2.2.19.tar.gz解压缩后置于/usr/src/linux目录下。
然后,对内核打补丁,如下操作:
[root@vs2 /root]# cd /usr/src/linux
[root@vs2 linux]# patch -p1 ;
*
· Prompt for development and/or incomplete code/drivers
2 Networking部分:
· Kernel/User netlink socket
· Routing messages
; Netlink device emulation
*
· Network firewalls
· Socket Filtering
; Unix domain sockets
*
· TCP/IP networking
· IP: multicasting
· IP: advanced router
[ ] IP: policy routing
[ ] IP: equal cost multipath
[ ] IP: use TOS value as routing key
[ ] IP: verbose route monitoring
[ ] IP: large routing tables
[ ] IP: kernel level autoconfiguration
*
· IP: firewalling
[ ] IP: firewall packet netlink device
*
· IP: transparent proxy support
*
· IP: masquerading
--- Protocol-specific masquerading support will be built as modules.
*
· IP: ICMP masquerading
--- Protocol-specific masquerading support will be built as modules.
*
· IP: masquerading special modules support
* ; IP: ipautofw masq support (EXPERIMENTAL)(NEW)
* ; IP: ipportfw masq support (EXPERIMENTAL)(NEW)
* ; IP: ip fwmark masq-forwarding support (EXPERIMENTAL)(NEW)
*
· IP: masquerading virtual server support (EXPERIMENTAL)(NEW)
· IP Virtual Server debugging (NEW) ; IPVS: round-robin scheduling (NEW)
* ; IPVS: weighted round-robin scheduling (NEW)
* ; IPVS: least-connection scheduling (NEW)
* ; IPVS: weighted least-connection scheduling (NEW)
* ; IPVS: locality-based least-connection scheduling (NEW)
* ; IPVS: locality-based least-connection with replication scheduling (NEW)
*
· IP: optimize as router not host
* ; IP: tunneling
; IP: GRE tunnels over IP
· IP: broadcast GRE over IP
· IP: multicast routing
· IP: PIM-SM version 1 support
· IP: PIM-SM version 2 support
*
· IP: aliasing support
[ ] IP: ARP daemon support (EXPERIMENTAL)
*
· IP: TCP syncookie support (not enabled per default)
--- (it is safe to leave these untouched)
; IP: Reverse ARP
· IP: Allow large windows (not recommended if ; The IPv6 protocol (EXPERIMENTAL)
上面,带*号的为必选项。
然后就是常规的编译内核过程,不再赘述,请参考编译 Linux 教程
在这里要注意一点:如果你使用的是RedHat自带的内核或者从RedHat下载的内核版本,已经预先打好了LVS的补丁。这可以通过查看/usr/src/linux/net/目录下有没有几个ipvs开头的文件来判断:如果有,则说明已经打过补丁。
编写LVS配置文件,实例中的配置文件如下: #lvs_dr.conf (C) Joseph Mack mack@ncifcrf.gov
LVS_TYPE=VS_DR
INITIAL_STATE=on
VIP=eth0:101 192.168.0.101 255.255.255.0 192.168.0.0
DIRECTOR_INSIDEIP=eth0 192.168.0.1 192.168.0.0 255.255.255.0 192.168.0.255
SERVICE=t telnet rr rs1:telnet rs2:telnet
SERVICE=t www rr rs1:www rs2:www
SERVER_VIP_DEVICE=dummy0
SERVER_NET_DEVICE=eth0
#----------end lvs_dr.conf------------------------------------
将该文件置于/etc/lvs目录下。
使用LVS的配置脚本产生lvs.conf文件。该配置脚本可以从http://www.linuxvirtualserver.org/Joseph.Mack/configure-lvs_0.8.tar.gz 单独下载,在ipvs-1.0.6-2.2.19.tar.gz包中也有包含。
脚本configure的使用方法:
[root@vs2 lvs]# configure lvs.conf
这样会产生几个配置文件,这里我们只使用其中的rc.lvs_dr文件。
修改/etc/rc.d/init.d/rc.local,增加如下几行:
echo 1 >; /proc/sys/net/ipv4/ip_forward
echo 1 >; /proc/sys/net/ipv4/ip_always_defrag
# 显示最多调试信息
echo 10 >; /proc/sys/net/ipv4/vs/debug_level
配置NFS服务。这一步仅仅是为了方便管理,不是必须的步骤。
假设配置文件lvs.conf文件放在/etc/lvs目录下,则/etc/exports文件的内容为:
/etc/lvs ro(rs1,rs2)
然后使用exportfs命令输出这个目录:
[root@vs2 lvs]# exportfs
如果遇到什么麻烦,可以尝试:
[root@vs2 lvs]# /etc/rc.d/init.d/nfs restart
[root@vs2 lvs]# exportfs
这样,各个real server可以通过NFS获得rc.lvs_dr文件,方便了集群的配置:你每次修改lvs.conf中的配置选项,都可以即可反映在rs1,rs2的相应目录里。
修改/etc/syslogd.conf,增加如下一行: kern.* /var/log/kernel_log
这样,LVS的一些调试信息就会写入/var/log/kernel_log文件中.
real server的配置
real server的配置相对简单,主要是是以下几点:
配置telnet和WWW服务。telnet服务没有需要特别注意的事项,但是对于www服务,需要修改httpd.conf文件,使得apache在虚拟服务器的ip地址上监听,如下所示:
Listen 192.168.0.101:80
关闭real server上dummy0的arp请求响应能力。这是必须的,具体原因请参见ARP problem in LVS/TUN and LVS/DR(http://www.linuxvirtualserver.org/arp.html)。关闭dummy0的arp响应的方式有多种,比较简单地方法是,修改/etc/rc.d/rc.local文件,增加如下几行: echo 1 >; /proc/sys/net/ipv4/conf/all/hidden
ifconfig dummy0 up
ifconfig dummy0 192.168.0.101 netmask 255.255.255.0 broadcast 192.168.0.0 up
echo 1 >; /proc/sys/net/ipv4/conf/dummy0/hidden
再次修改/etc/rc.d/rc.local,增加如下一行:(可以和步骤2合并)
echo 1 >; /proc/sys/net/ipv4/ip_forward
四 LVS的测试
好了,经过了上面的配置步骤,现在可以测试LVS了,步骤如下:
分别在vs1,rs1,rs2上运行/etc/lvs/rc.lvs_dr。注意,rs1,rs2上面的/etc/lvs目录是vs2输出的。如果您的NFS配置没有成功,也可以把vs1上的/etc/lvs/rc.lvs_dr复制到rs1,rs2上,然后分别运行。
确保rs1,rs2上面的apache已经启动并且允许telnet。
然后从client运行telnet 192.168.0.101,如果登录后看到如下输出就说明集群已经开始工作了:(假设以guest用户身份登录)
[guest@rs1 guest]$-----------说明已经登录到服务器rs1上。
再开启一个telnet窗口,登录后会发现系统提示变为:
[guest@rs2 guest]$-----------说明已经登录到服务器rs2上。
然后在vs2上运行如下命令:
[root@vs2 /root]ipvsadm
运行结果应该为:
IP Virtual Server version 1.0.6 (size=4096)
Prot LocalAddress
ort Scheduler Flags
->; RemoteAddress
ort Forward Weight ActiveConn InActConn
TCP 192.168.0.101:telnet rr
->; rs2:telnet Route 1 1 0
->; rs1:telnet Route 1 1 0
TCP 192.168.0.101:www rr
->; rs2:www Route 1 0 0
->; rs1:www Route 1 0 0
至此已经验证telnet的LVS正常。
然后测试一下WWW是否正常:用你的浏览器查看http://192.168.0.101/是否有什么变化?为了更明确的区别响应来自那个real server,可以在rs1,rs2上面分别放置如下的测试页面(test.html): ;
;
我是real server #1 or #2
;
;
然后刷新几次页面(http://192.168.0.101/test.html),如果你看到“我是real server #1”和“我是real server #2”交替出现,说明www的LVS系统已经正常工作了。
但是由于Internet Explore 或者Netscape本身的缓存机制,你也许总是只能看到其中的一个。不过通过ipvsadm还是可以看出,页面请求已经分配到两个real server上了,如下所示:
IP Virtual Server version 1.0.6 (size=4096)
Prot LocalAddress
ort Scheduler Flags
->; RemoteAddress
ort Forward Weight ActiveConn InActConn
TCP 192.168.0.101:telnet rr
->; rs2:telnet Route 1 0 0
->; rs1:telnet Route 1 0 0
TCP 192.168.0.101:www rr
->; rs2:www Route 1 0 5
->; rs1:www Route 1 0 4
或者,可以采用linux的lynx作为测试客户端,效果更好一些。如下运行命令:
[root@client /root]while true; do lynx -dump http://10.64.1.56/test.html; sleep 1; done
这样,每隔1秒钟“我是realserver #1”和“我是realserver #2”就交替出现一次,清楚地表明响应分别来自两个不同的real server。
五调试技巧
如果您的运气不好,在配置LVS的过程中也许会遇到一些困难,下面的技巧或许有帮助:
首先确定网络硬件没有问题,尤其是网线,ping工具就足够了。
使用netstat查看端口的活动情况。
使用tcpdump查看数据包的流动情况。
查看/var/log/kernel_log文件