引言
首先,本文中的大部分内容并非原创。撰写本文的目的只是以某种方式作出贡献。我所作的工作只是将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在另一个节点上,输入:
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可选的:列出将要执行和监控的命令。例如:要执行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_groupping1.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这些脚本必须通过
start 来启动服务,以及stop 来停止服务。您可以使用任何符合这个标准的脚本来作为服务。若要向教本传递参数,则格式应该为:
:: 因此若我们添加了一个服务“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.cf和haresource拷贝到/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[ ]
因此,对于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
确保该文件的访问权限是安全的,如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 |