This site best when viewed with a modern standards-compliant browser. We recommend Firefox Get Firefox!.


自1999年起为Linux以及其它操作系统提供开放源码的高可用性软件

首页

关于我们

联系我们

版权信息

安全问题

This web page is no longer maintained. Information presented here exists only to avoid breaking historical links.
The Project stays maintained, and lives on: see the Linux-HA Reference Documentation.
To get rid of this notice, you may want to browse the old wiki instead.

2005/09/23 版本2.0.2 已经 发布了!

下载并试用! 感谢您的反馈! 这个版本主要修改了在2.0.1中发现的有关ping node 的问题.

Last site update:
2017-12-13 11:48:11

Linux-HA 入门指南

英文版:Getting Started with Linux-HA

引言

首先,本文中的大部分内容并非原创。撰写本文的目的只是以某种方式作出贡献。我所作的工作只是将Linux-HA的其他文档中(如Volker Wiegand的硬件安装指南)的部分编辑成一份文档,这份文档可以帮助初学者了解Linux-HA, 而不需麻烦Alan Robertson, 并且避免在邮件列表上出现重复的问题。

开始

你首先需要两台电脑,这两台电脑并不需要有相同的硬件(或者内存大小等),但如果相同的话,当某个部件出现故障时会容易处理得多。

接下来您需要决定如何部署。你的集群是通过Heartbeat 软件产生在两台电脑之间心跳信号来建立的。为了传输心跳信号,需要在节点之间存在一条或多条介质通路(串口线通过modem电线,以太网通过交叉线,等等)。

现在可以开始配置硬件了。既然想要获得高可用性(HA),那么您很可能希望避免单点失效。在本例中,可能是您的null modem线/串口,或者网卡(NIC)/ 交叉线。因此便需要决定是否希望为每个节点添加第二条串口null modem连线或者第二条NIC/交叉线连接。制作Cat-5交叉线的方法可参照附录A。我使用一个串口和一块额外的网卡来作为heartbeat的通路,这是因为我只有一条null modem线和一块多余的网卡,并且认为有两种介质类型传输heartbeat信号比较好。

硬件配置完成之后,便需要安装操作系统以及配置网络(我在本文中使用的是RedHat)。假设您有两块网卡,那么有一块应该配置用于常规网络用途,另一块作为集群节点之间的专用网络连接(通过交叉线)。例如,假设集群有如下的IP地址:

节点 1 (linuxha1)

192.168.85.1 (常规的 192x 网络)

10.0.0.1 (heartbeat 专用的 10x 网络)

节点 2 (linuxha2)

192.168.85.2 (192x)

10.0.0.2 (10x)

注意:以上地址都不能是您的“集群地址”-即节点间由heartbeat和Failed over控制的地址。

在大多数*nix系统中,以上步骤在安装过程中都比较容易完成。然而,如果您遇到了任何问题,可以参照Ethernet HOWTO,或者您的发行版的相关文档。输入如下命令检查您的配置:

ifconfig 

这将显示您的网卡及其配置。也可以使用命令“netstat –nr”来获得网络路由信息。

如果一切正常,接下来要确定可以来两个节点之间通过所有接口ping通对方。

如果使用了串口,便需要检测其连接情况。把一个节点作为接收者,输入命令:

cat </dev/ttyS0 

在另一个节点上,输入:

echo hello >/dev/ttyS0 

应该可以在接收节点上看到该文本。如果正常的话交换这两个节点的角色再作一次,否则有可能是使用了错误的设备文件。关于解决串口连接问题的两个比较好的参考文献是Volker的HA Hardware Guide和Serial HOWTO。

安装Heartbeat

接下来便可以安装Heartbeat软件。当你阅读本文档的时候可能已经有了这个软件,如果没有的话可以从如下位置得到: http://linux-ha.org/download

在网站上也有RPM安装包,您也可以选择从源代码编译。取得源代码tar文件或者安装source RPM包,将其解包到某个文件夹。在源代码树的顶端,输入"./ConfigureMe configure", 之后输入"make"和"make install"。如果您在安装网站上发布的RPM包时遇到了问题,并想要创建自己的RPM包,FAQ中的信息会对您有所帮助。

配置Heartbeat

配置ha.cf

在启用Heartbeat之前,需要配置三个文件。第一个是ha.cf,该文件位于在安装后创建的/etc/ha.d目录中。该文件中包括为Heartbeat使用何种介质通路和如何配置他们的信息。在源代码目录中的ha.cf文件包含了您可以使用的全部选项,详述如下:

serial /dev/ttyS0 

使用串口heartbeat-如果不使用串口heartbeat,则必须使用其他的介质,如bcast(以太网)heartbeat。用适当的设备文件代替/dev/ttyS0。

watchdog /dev/watchdog 

可选。通过Watchdog 功能可以获得提供最少功能的系统,该系统不提供heartbeat,可以在持续一份钟的不正常状态后重新启动。该功能有助于避免一台机器在被认定已经死亡之后恢复heartbeat的情况。如果这种情况发生并且磁盘挂载因故障而迁移(fail over),便有可能有两个节点同时挂载一块磁盘。如果要使用这项功能,则除了这行之外,也需要加载“softdog”内核模块,并创建相应的设备文件。方法是使用命令“insmod softdog”加载模块。然后输入“grep misc /proc/devices”并记住得到的数字(应该是10)。然后输入”cat /proc/misc | grep watchdog”并记住输出的数字(应该是130)。根据以上得到的信息可以创建设备文件,“mknod /dev/watchdog c 10 130”。

bcast eth1 

表示在eth1接口上使用广播heartbeat(将eth1替换为eth0,eth2,或者您使用的任何接口)。

keepalive 2 

设定heartbeat之间的时间间隔为2秒。

warntime 10 

在日志中发出“late heartbeat“警告之前等待的时间,单位为秒。

deadtime 30 

在30秒后宣布节点死亡。

initdead 120 

在某些配置下,重启后网络需要一些时间才能正常工作。这个单独的”deadtime”选项可以处理这种情况。它的取值至少应该为通常deadtime的两倍。

baud 19200 

波特率,串口通信的速度。

udpport 694 

使用端口694进行bcast和ucast通信。这是默认的,并且在IANA官方注册的端口号。

auto_failback on 

必须的。对于那些熟悉Tru64 Unix的人来说,heartbeat的工作方式类似于“favored member“模式。在failover之前,haresources文件中列出的主节点掌握所有的资源,之后从节点接管这些资源。当auto_failback设置为on时,一旦主节点重新恢复联机,将从从节点取回所有资源。若该选项设置为off,主节点便不能重新获得资源。该选项与废弃的nice_failback选项类似。如果要从一个nice_failback设置为off的集群升级到这个或更新的版本,需要特别注意一些事项以防止flash cut。请参阅FAQ中关于如何处理这类情况的章节。

node linuxha1.linux-ha.org 

必须的。集群中机器的主机名,与“uname –n”的输出相同。

node linuxha2.linux-ha.org 

必须的。同上。

respawn <userid> <cmd> 

可选的:列出将要执行和监控的命令。例如:要执行ccm守护进程,则要添加如下的内容:

respawn hacluster /usr/lib/heartbeat/ccm 

使得Heartbeat以userid(在本例中为hacluster)的身份来执行该进程并监视该进程的执行情况,如果其死亡便重启之。对于ipfail,则应该是:

respawn hacluster /usr/lib/heartbeat/ipfail 

注意:如果结束进程的退出代码为100,则不会重启该进程。

ping ping1.linux-ha.org ping2.linux-ha.org .... 

可选:列出ping节点。这些节点不是集群节点。他们是用来为ipfail等模块检查网络连接情况的。

ping_group <name> ping1.linux-ha.org ping2.linux-ha.org ....  

可选:指定一个ping节点组。与ping节点类似,但只要节点组中的任何一个节点可用,便认为该节点组可用。组的名字可以是任意字符串,用来唯一标识该组。每个组必须出现在单独的行上。与ping节点类似,节点组也不是集群节点。他们与ping节点的功能相同,也是用来检查网络连接情况的。

配置haresources

配置好ha.cf文件之后,便是haresources文件。该文件列出集群所提供的服务以及服务的默认所有者。 注意:两个集群节点上的该文件必须相同,否则BadThingsWillHappen

在本文中我们假设要配置的HA服务为Apache和Samba。集群的IP地址是必须的,并一定不能在haresources文件以外配置该地址!在haresources文件中需要如下内容:

linuxha1.linux-ha.org 192.168.85.3 httpd smb 

该行指定在启动时,节点linuxha1得到IP地址192.168.85.3,并启动Apache和Samba。在停止时,Heartbeat将首先停止smb,然后停止Apache,最后释放IP地址192.168.85.3。这里假设命令“uname –n”的输出为“linuxha1.linux-ha.org”-如果输出为“linuxha1”,便应使用“linuxha1”。

注意:httpd和smb分别是Apache和Samba的启动脚本。Heartbeat会在以下路径中寻找有相同名字的启动脚本:

/etc/ha.d/resource.d  
/etc/init.d

这些脚本必须通过<scriptname> start来启动服务,以及<scriptname> stop来停止服务。您可以使用任何符合这个标准的脚本来作为服务。

若要向教本传递参数,则格式应该为: <scriptname>::<argument> 因此若我们添加了一个服务“maid”,他需要参数“vacuum”,则haresources文件中的该行需要修改为:

linuxha1 192.168.85.3 httpd smb maid::vacuum 

这种方式为我们将IP地址作为服务提供了灵活性。在上面我们用的其实是简化的符号。该行实际应该是(省略了maid服务):

linuxha1 IPaddr::192.168.85.3 httpd smb 

这里IPaddr是服务脚本的名字,其参数为192.168.85.3。当然,您可以在目录/etc/ha.d/resource.d中找到名为IPaddr的脚本。该脚本也允许您操作IP服务的子网掩码,广播地址和基本接口等参数。要指定有32个地址的子网,您可以定义该服务为(不显式指定IPaddr因为这样不会有问题):

linuxha1 192.168.85.3/27 httpd smb 

这里指定IP地址为192.168.85.3,子网掩码为255.255.255.224,广播地址将取默认值为192.168.85.31(即该子网上的最高地址)。您可以指定的最后一个参数为广播地址。若要以192.168.85.16覆盖默认的广播地址,可以这样写:

linuxha1 192.168.85.3/27/192.168.85.16 httpd smb 

您可能想要知道是否需要指定上面的某个参数,这要视情况而定。如果您已经为服务的IP地址建立了一条合适的路由(独立于Heartbeat),并设置了正确的子网掩码和广播地址,那么您便不需要。然而情况并不总是这样的,这便是这些选项存在的原因。另外,您可能有不止一个网络接口用于IP服务。下面将会讲述Heartbeat如何处理这种情况…

正确配置好haresources文件之后,将ha.cfharesource拷贝到/etc/ha.d目录,接下来便可以启动heartbeat了!

配置ipfail

ipfail插件的用途是检测网络故障,并作出合理的反应,如果需要的话使集群资源failover。为了实现这样的功能ipfail使用ping节点或者ping节点组,这些节点在集群中作为“哑”节点出现。如果HA节点间可以相互通信ipfail便可以可靠地检测到其中一个网络连接失效的情况,并作出补救。

配置ipfail的步骤如下:

  • 1.选择好的候选ping节点。

    • 这步很重要。你的选择越好,则得到的HA集群便越强壮。选择固定的交换机路由器等是一个好主意。不要选择HA集群中的任一个成员,也不要选择其他人的工作站。选择能反映您HA节点的连接状况的ping节点也很重要。如果您要监视两个接口的连接情况,明智的做法是为每个接口选择一个只对该接口可用的ping节点。ipfail-diagram.pdf文件中有对这个思想图形化的描述。

    2.设置auto_failback为on或者off。

    • 只有当Heartbeat被配置为非legacy时ipfail才会起作用。在ha.cf文件中,如下将auto_failback设置为on或者off:

      • auto_failback on 
        
      或者
      • auto_failback off 
        

    3.配置ha.cf使之启动ipfail。

    • ha.cf中增加如下一行(假设您在编译时的PREFIX为/usr):

      • respawn hacluster /usr/lib/heartbeat/ipfail 
        

    4.向ha.cf中加入ping节点:

    • ping pnode1 pnode2 pnodeN 
      
      将pnode1,pnode2,…pnodeN等替换为您ping节点的IP地址。

确保向集群中各个成员的ha.cf中加入以上相同的配置指令。

注意:在使用ping节点之前,最好检查他们的可用性。如果不能从所有的HA节点上ping通该ping节点,便不能使用它。

选择一个接口

为有多个网卡的机器配置haresources文件时,重要的一点是要知道Heartbeat选择网络接口的方式是如何影响对于IP服务地址的支持的。毕竟在haresource文件中没有指定所用的接口。

通过查看路由表,Heartbeat决定使用哪个接口。他尝试选择对于该IP地址代价最低的路由。如果发现了多于一条代价最低的路由,选择发现的第一个路由。对于大多数配置来说,这便意味着默认路由是最后的选择。

配置Authkeys

需要配置的第三个文件authkeys决定了您的认证密钥。共有三种认证方式:crc,md5,和sha1。您可能会问:“我应该用哪个方法呢?”简而言之:

如果您的Heartbeat运行于安全网络之上,如本例中的交叉线,可以使用crc,从资源的角度来看,这是代价最低的方法。如果网络并不安全,但您也希望降低CPU使用,则使用md5。最后,如果您想得到最好的认证,而不考虑CPU使用情况,则使用sha1,它在三者之中最难破解。

文件格式如下:

auth <number>  
<number> <authmethod> [<authkey>]

因此,对于sha1,示例的/etc/ha.d/authkeys可能是

auth 1  
1 sha1 key-for-sha1-any-text-you-want

对于md5,只要将上面内容中的sha1换成md5就可以了。 对于crc,可作如下配置:

auth 2  
2 crc

不论您在关键字auth后面指定的是什么索引值,在后面必须要作为键值再次出现。如果您指定“auth 4”,则在后面一定要有一行的内容为“4 <signaturetype>”。

确保该文件的访问权限是安全的,如600。其实也并不是“any text you want” 都可以,可以使用的字母个数是有限制的。

启动并测试Heartbeat

RedHat系统上,或者其他使用/etc/init.d启动脚本文件的系统,在每个节点上执行/etc/init.d/heartbeat会在所有的节点上启动heartbeat。建议您首先在系统主节点(在本例中是linuxha1)上启动。

如果希望在系统启动时运行heartbeat,根据你所用的发行版,需要作不同的配置。您需要在恰当的启动级别目录中建立启动脚本的链接,不过RPM版本的软件会自动完成这些配置。在我的系统上,Heartbeat以默认的优先级(75,即在服务00-74之后,在服务76-99之前)启动,以默认的优先级(05)停止,并只对运行级 0(停机),6(重启),3(多用户-文本界面),5(多用户-图形界面)起作用。

可以通过如下命令序列完成以上配置(以root身份):

cd /etc/rc.d/rc0.d ; ln -s ../init.d/heartbeat K05heartbeat 
cd /etc/rc.d/rc3.d ; ln -s ../init.d/heartbeat S75heartbeat
cd /etc/rc.d/rc5.d ; ln -s ../init.d/heartbeat S75heartbeat
cd /etc/rc.d/rc6.d ; ln -s ../init.d/heartbeat K05heartbeat

根据我使用Slackware的经验,Slackware系统上并没有/etc/rc.d/init.d目录(也许现在有了),为了实现如上相同的功能,可在/etc/rc.d/rc.local中加入:

/etc/ha.d/heartbeat start  

***这里假设您将ha.rc拷贝至/etc/ha.d/heartbeat。如果在您的系统上没有/etc/rc.d/init.d目录,并且您也不确定进程如何启动,便可以使用刚刚提到的rc.local方法。但使用这种方法时您需要自己处理关闭的情况,但笔者不记得如何去做了…

注意:如果您使用了watchdog功能,也需要在启动时加载其module。可以把以下命令加到/etc/rc.d/rc.sysinit的结尾:

/sbin/insmod softdog  

如果使用的是rc.local,需要把这一行放到启动Heartbeat命令的前面。

在您启动了Heartbeat之后,在测试之前查看您的日志文件(默认位置为/var/log/ha-log)。如果一切正常,服务持有者(本例中的linuxha1)的日志应该有类似如下所列内容:

heartbeat: 2003/02/10_13:52:22 info: Neither logfile nor logfacility found. 
heartbeat: 2003/02/10_13:52:22 info: Logging defaulting to /var/log/ha-log
heartbeat: 2003/02/10_13:52:22 info: **************************
heartbeat: 2003/02/10_13:52:22 info: Configuration validated. Starting heartbeat 0.4.9f
heartbeat: 2003/02/10_13:52:22 info: nice_failback is in effect.
heartbeat: 2003/02/10_13:52:22 info: heartbeat: version 0.4.9f
heartbeat: 2003/02/10_13:52:22 info: Heartbeat generation: 17
heartbeat: 2003/02/10_13:52:22 info: Starting serial heartbeat on tty /dev/ttyS0 (19200 baud)
heartbeat: 2003/02/10_13:52:22 info: UDP Broadcast heartbeat started on port 694 (694) interface eth1
heartbeat: 2003/02/10_13:52:23 info: pid 28140 locked in memory.
heartbeat: 2003/02/10_13:52:23 info: pid 28137 locked in memory.
heartbeat: 2003/02/10_13:52:23 info: pid 28139 locked in memory.
heartbeat: 2003/02/10_13:52:23 notice: Using watchdog device: /dev/watchdog
heartbeat: 2003/02/10_13:52:23 info: pid 28141 locked in memory.
heartbeat: 2003/02/10_13:52:23 info: Local status now set to: 'up'
heartbeat: 2003/02/10_13:52:23 info: pid 28138 locked in memory.
heartbeat: 2003/02/10_13:52:23 info: pid 28134 locked in memory.
heartbeat: 2003/02/10_13:52:25 info: Link linuxha1.linux-ha.org:eth1 up.
heartbeat: 2003/02/10_13:53:23 WARN: node linuxha2.linux-ha.org: is dead
heartbeat: 2003/02/10_13:53:23 info: Dead node linuxha2.linux-ha.org held no resources.
heartbeat: 2003/02/10_13:53:23 info: Resources being acquired from linuxha2.linux-ha.org.
heartbeat: 2003/02/10_13:53:23 info: Local status now set to: 'active'
heartbeat: 2003/02/10_13:53:23 info: Running /etc/ha.d/rc.d/status status
heartbeat: 2003/02/10_13:53:23 info: /usr/lib/heartbeat/mach_down: nice_failback: acquiring foreign resources
heartbeat: 2003/02/10_13:53:23 info: mach_down takeover complete.
heartbeat: 2003/02/10_13:53:23 info: mach_down takeover complete for node linuxha2.linux-ha.org.
heartbeat: 2003/02/10_13:53:23 info: Acquiring resource group: linuxha1.linux-ha.org 192.168.85.3 datadisk::drbd0 datadisk::drbd1 mirror
heartbeat: 2003/02/10_13:53:23 info: Running /etc/ha.d/resource.d/IPaddr 192.168.85.3 start
heartbeat: 2003/02/10_13:53:23 info: /sbin/ifconfig eth0:0 192.168.85.3 netmask 255.255.255.0  broadcast 192.168.85.255
heartbeat: 2003/02/10_13:53:23 info: Sending Gratuitous Arp for 192.168.85.3 on eth0:0 [eth0]
heartbeat: 2003/02/10_13:53:23 /usr/lib/heartbeat/send_arp eth0 192.168.85.3 00304823BD48 192.168.85.3 ffffffffffff
heartbeat: 2003/02/10_13:53:24 info: Running /etc/ha.d/resource.d/datadisk drbd0 start
heartbeat: 2003/02/10_13:53:24 info: Running /etc/ha.d/resource.d/datadisk drbd1 start
heartbeat: 2003/02/10_13:53:25 info: Running /etc/ha.d/resource.d/mirror  start
heartbeat: 2003/02/10_13:53:25 /usr/lib/heartbeat/send_arp eth0 192.168.85.3 00304823BD48 192.168.85.3 ffffffffffff
heartbeat: 2003/02/10_13:53:26 info: Resource acquisition completed.
heartbeat: 2003/02/10_13:53:28 /usr/lib/heartbeat/send_arp eth0 192.168.85.3 00304823BD48 192.168.85.3 ffffffffffff
heartbeat: 2003/02/10_13:53:30 /usr/lib/heartbeat/send_arp eth0 192.168.85.3 00304823BD48 192.168.85.3 ffffffffffff
heartbeat: 2003/02/10_13:53:32 /usr/lib/heartbeat/send_arp eth0 192.168.85.3 00304823BD48 192.168.85.3 ffffffffffff
heartbeat: 2003/02/10_13:53:33 info: Local Resource acquisition completed. (none)
heartbeat: 2003/02/10_13:53:33 info: local resource transition completed.
heartbeat: 2003/02/10_13:56:30 info: Link linuxha2.linux-ha.org:eth1 up.
heartbeat: 2003/02/10_13:56:30 info: Status update for node linuxha2.linux-ha.org: status up
heartbeat: 2003/02/10_13:56:30 info: Running /etc/ha.d/rc.d/status status
heartbeat: 2003/02/10_13:56:30 info: Status update for node linuxha2.linux-ha.org: status active
heartbeat: 2003/02/10_13:56:30 info: remote resource transition completed.
heartbeat: 2003/02/10_13:56:30 info: Running /etc/ha.d/rc.d/status status
heartbeat: 2003/02/10_13:56:31 info: Link linuxha2.linux-ha.org:/dev/ttyS0 up.

注意:你的日志可能根据您何时在linuxha2上启动Heartbeat而有所不同!!!笔者在linuxha2上启动Heartbeat的时间为13:56:30。

现在ping您的集群IP地址(本例中的192.168.85.3)。如果正常,使用ssh登陆到上面并验证您在linuxha1上。接下来确定指定的服务已经绑定在.3的地址上。将您的网页浏览器指向192.168.85.3来测试Apache。对于Samba,假设您已经配置了名为“test“的一个share,则映射驱动器”\\192.168.85.3\test“来测试Samba,具体的步骤可参照Samba的文档。然而,您也可以使用netbios 名参数使得您的Samba share列在集群名字下面而不是集群成员的主机名下面!

注意:如果您不能启用服务的IP地址,并且在ha-log中有类似如下的内容:

SIOCSIFADDR: No such device 
SIOCSIFFLAGS: No such device
SIOCSIFNETMASK: No such device
SIOCSIFBRDADDR: No such device
SIOCSIFFLAGS: No such device
SIOCADDRT: No such device

这意味着您需要在内核中编入IP aliasing支持。在/usr/src/linux/.config文件中查找“CONFIG_IP_ALIAS=y”,如果不存在这项内容将会是“CONFIG_IP_ALIAS is not set”,在这种情况下需要加入IP aliasing支持并重新编译内核。

如果这些都能正常工作,您便得到了可用性(availability)。现在检查是否有高可用性(High Availability)。

使linuxha1离线。切断电源,结束Heartbeat,任何您能想到的方式,但不要将串口和eth1 heartbeat信号线都切断。如果你那样做了,则在两个节点上都会启动服务,当你重新建立heartbeat连接时会产生混乱。现在ping集群IP,大概5-10秒钟之后会再次开始响应。再次远程登陆并验证登陆到了linuxha2上。如果这个过程花费了超过30秒,可能是哪里出了问题。

如果您到了这里,则可能已经正常工作,但也应该检查所有的heartbeat。首先检查串口heartbeat。从用于bcast heartbeat的eth1上拔出交叉线,等待大概10秒钟,然后查看linuxha2的/var/log/ha-log文件,确保没有类似这样的内容:

1999/08/16_12:40:58 node linuxha1.linux-ha.org: is dead  

如果出现了这样的内容,则您的串口heartbeat没有正常工作,而从节点已经进行了接管。为了避免问题出现,在主节点上停止Heartbeat,然后再次运行上面的测试。如果您的日志正常那么很好,重新连接交叉线。之后断开串口连接,等待10秒钟,再次检查linuxha2的日志。如果日志不正常,可以检查/var/log/ha-log和/var/log/ha-debug以获得更多线索。

附录A-制作以太网交叉线

线路图如下所示

连接器A引脚#

连接器B引脚#

1

3

2

6

3

1

4

2

5

7

6

8

7

4

8

5

(c) 2003 Rudy Pawul rpawul (at) iso-ne (dot) com