服务器 频道

用Heartbeat配置Linux高可用性集群(下)

    【IT168 专稿】接上篇)本文继续介绍使用Heartbeat 2.0如何配置Linux高可用性集群。

三、配置Stonith

    Stonith 即shoot the other node in the head使Heartbeat软件包的一部分,该组件允许系统自动地复位一个失败的服务器使用连接到一个健康的服务器的遥远电源设备。Stonith设备是一种能够自动关闭电源来响应软件命令的设备。图-1是Heartbeat与配置Stonith示例。


    图 -1 Heartbeat与配置Stonith示例

    Stonith设备清单如下表-1:


    查看当前支持Stonith设备清单的命令:
    #/usr/sbin/stonith -L
    查看当前支持Stonith设备其他情况的命令
    例如查看rps10的设备配置的命令: 
    # /usr/sbin/stonith -l -t rps10 test
    命令输出:
STONITH: Cannot open /etc/ha.d/rpc.cfg STONITH: Invalid config file for rps10 device. STONITH: Config file syntax: <serial_device> <server> <outlet> [ <server> <outlet> [...] ] All tokens are white-space delimited. Blank lines and lines beginning with # are ignored
    所以在rps10设备在/etc/ha.d/ha.cf 配置文件中的格式如下:
    STONITH_host backupserver rps10 /dev/ttyS0 primaryserver.mydomain.com 0
四、 配置内核看门狗支持Heartbeat

    1 Linux下watchdog的工作原理

    Watchdog在实现上可以是硬件电路也可以是软件定时器,能够在系统出现故障时自动重新启动系统。在Linux 内核下, watchdog的基本工作原理是:当watchdog启动后(即/dev/watchdog 设备被打开后),如果在某一设定的时间间隔内/dev/watchdog没有被执行写操作, 硬件watchdog电路或软件定时器就会重新启动系统。

    /dev/watchdog 是一个主设备号为10, 从设备号130的字符设备节点。 Linux内核不仅为各种不同类型的watchdog硬件电路提供了驱动,还提供了一个基于定时器的纯软件watchdog驱动。 驱动源码位于内核源码树drivers\char\watchdog\目录下。

    2 硬件与软件watchdog的区别

    硬件watchdog必须有硬件电路支持, 设备节点/dev/watchdog对应着真实的物理设备, 不同类型的硬件watchdog设备由相应的硬件驱动管理。软件watchdog由一内核模块softdog.ko 通过定时器机制实现,/dev/watchdog并不对应着真实的物理设备,只是为应用提供了一个与操作硬件watchdog相同的接口。

    硬件watchdog比软件watchdog有更好的可靠性。 软件watchdog基于内核的定时器实现,当内核或中断出现异常时,软件watchdog将会失效。而硬件watchdog由自身的硬件电路控制, 独立于内核。无论当前系统状态如何,硬件watchdog在设定的时间间隔内没有被执行写操作,仍会重新启动系统。

    一些硬件watchdog卡如WDT501P 以及一些Berkshire卡还可以监测系统温度,提供了 /dev/temperature接口。 对于应用程序而言, 操作软件、硬件watchdog的方式基本相同:打开设备/dev/watchdog, 在重启时间间隔内对/dev/watchdog执行写操作。即软件、硬件watchdog对应用程序而言基本是透明的。

    在任一时刻, 只能有一个watchdog驱动模块被加载,管理/dev/watchdog 设备节点。如果系统没有硬件watchdog电路,可以加载软件watchdog驱动softdog.ko。

    3 Linux内核中关于watchdog的配置

    在/usr/src/linux目录运行命令:makemenu config
    确保在下面的菜单已经启用Software Watchdog选项
Character Devices Watchdog Cards ---> [*] Watchdog Timer Support [M] Software Watchdog (NEW)
    如图2 。


    图 2 编译内核支持Software Watchdog选项

    4 加载模块

    #insmod softdog

    说明:watchdog能让系统在出现故障1分钟后重启该机器。这个功能可以帮助服务器在确实停止心跳后能够重新恢复心跳。 如果使用该特性,则在内核中装入"softdog"内核模块,用来生成实际的设备文件,输入"insmod softdog"加载模块。 输入"grep misc /proc/devices"(应为10),输入"cat /proc/misc | grep watchdog"(应为130)。 生成设备文件:"mknod /dev/watchdog c 10 130" 。

    5 测试软件狗

    编辑文件 /etc/ha.d/ha.cf
    如掉下面一行的注释号:
    watchdog /dev/watchdog
    重新启动Heartbeat
    #service heartbeat restart
    使用命令杀掉heartbeat进程
    killall -9 heartbeat
    此时日志文件中应当出现一行:
   Softdog: WDT device closed unexpectedly. WDT will not stop!
     表示软件狗生效。另外使用命令lsmod可以看到软件狗已经加载。如图3 。


    图-3

    6 删除软件狗的方法

    使用命令可以从内核中删除软件狗:
    #modprobe -r softdog五、测试Heartbeat配置

    在你把你的Heartbeat的高可用性服务器放到生产中之前,这里是对试图的一些事情:

    1. 在主服务器上拔去电源线

    在备份服务器上的Heartbeat应该从主要的服务器发现heartbeat若干数据包损失,并且开始故障转移。 使用Stonith,备份服务器应该把电源关闭或者复位到主要的服务器。 在备份服务器上的Heartbeat然后应该运行适当的资源脚本(当Stonith事件有“清除”时或者完成)拿资源的所有权。 在备份服务器上的Heartbeat也应该发送ARP广播通知顾客或者网络设备MAC地址因为资源IP地址已变化。

    2. 测试hb_standby命令的行为

    使用在主要的服务器上的hb_standby命令把资源强迫到迁移到备份服务器。 然后再一次在备份服务器上使用命令来把资源往回强迫迁移到主服务器. ipfail如果hb_standby命令不适当地工作,也将不适当地工作。

    3. 拔去在主服务器上的网络电缆

    使用ipfail可以检测到网络联系失败,并且应该被发现到备份服务器,并且资源和IP别名迁移到备份服务器。

    4. 在两个服务器之间删除所有heartbeat路径

    当你在两个服务器之间删除所有heartbeat路径时,什么会发生? 如果你使用Stonith,备份服务器将假定主要的服务器已死去,开始一个Stonith事件,而接管资源。

    5. 在主要的服务器( 使用命令:killall - 9 heartbeat )上杀死heartbeat 守护进程

    当你使用IP别名到提供资源到顾客计算机时,Stonith是尤其重要的。 备份服务器必须Stonith或者在试图假定资源的所有权避免裂痕脑条件之前复位主服务器。

    6. 重新引导两个服务器六、配置Mon

    1 什么是Mon

    mon是针对linux开发的工具,但众所周知在sorlaris下他也可以工作。因为客户和服务端都是由perl语言书写,因此在轻便性上不会有问题。

    简单来说Heartbeat用来实现心跳和高可用性,Mon用来监控服务 。

    2 Mon方案

    图 4 是基于集群监视的Mon方案。


    图 5 是Mon检查每个集群节点MIB的过程


    3 首先自行搜尋以下的 Perl 模块
perl-Mon-0.11-2.2.el5.rf.noarch.rpm perl-Convert-BER-1.31.01-1.2.el5.rf.noarch.rpm perl-Net-Telnet-3.03-1.2.el5.rf.noarch.rpm perl-Time-HiRes-1.55-3.i386.rpm perl-Time-Period-1.20-2.el5.rf.noarch.rpm

    安装命令:
#perl -MCPAN -e shell cpan>install Time::Period cpan>install Time::HiRes cpan>install Convert::BER cpan>install Mon::Protocol cpan>install Mon::SNMP cpan>install Mon::Client
    4 下载安装fping

     Ping命令大概是网管员最常用的命令了,使用Ping可以监测网络的通断、设备是否宕机,遗憾的是每次只能针对一台设备。在一个拥有20余台服务器和80多个可网管交换机的局域网内,Ping上一遍是很艰难的事情,而运行在Linux下的Fping(http://www.fping.com)可以轻松完成这一工作。Fping 命令与Ping命令非常相似,使用ICMP回应请求和应答来确定系统的可达性。它提供了一些Ping没有的特殊功能,比如,Fping可以在命令行上指定主机名或IP地址的列表、可以处理一个包含主机名或IP地址清单的文件。Fping并不是发送一个请求到单一目标(Ping的做法),而是用循环的方法发送ICMP请求到每个目标。另外,Fping可以用于脚本编程中。
#wget http://www.kernel.org/pub/software/admin/mon/fping-2.2b1.tar.bz2 #bunzip2 fping-2.2b1.tar.bz2 #./configure #make #make check #make install
    5 下载安装Mon
#wget ftp://ftp.kernel.org/pub/software/admin/mon/mon-0.99.2.tar.gz #tar -xzf mon-0.99.2.tar.gz #cd mon-0.99.2 #mkdir /etc/mon #cp auth.cf mon.cf /etc/mon #mkdir /usr/lib/mon #cp -r alert.d mon.d state.d mon /usr/lib/mon
    建立Mon报告目录和Mon报告文件
#mkdir /usr/lib/mon/log.d #vi /etc/mon/auth.cf
    内容如下:
disable: root dump: root enable: root get: root loadstate: root reset: root savestate: root set: root start: root stop: root term: root
    #vi /etc/mon/mon.cf

    内容如下:
    不要写跟随他们的箭和数字; 他们仅仅出现在这里说明参数。
alertdir = /usr/lib/mon/alert.d ← [1] mondir = /usr/lib/mon/mon.d ← [2] logdir = /usr/lib/mon/logs ← [3] histlength = 500 ← [4] dtlogging = yes ← [5] dtlogfile = /usr/lib/mon/logs/dtlog ← [6] hostgroup clusternodes clnode1 clnode2 clnode3 ← [7] ← [8] watch clusternodes ← [9] service cluster-ping-check [10] interval 5s [11] monitor fping.monitor [12] period wd {Sa-Su} [13] alert mail.alert alert@domain.com ← [14] upalert mail.alert alert@domain.com ← [15] alertevery 1h ← [16]

    说明如下:

    [ 1 ]警报脚本的路径。
    [ 2 ]监视器脚本的路径。
    [ 3 ]报告文件的路径。
    [ 4 ]→事件的最大限度数字在报告中节省。
    [ 5 ]→启用宕机的日志记录成为可能。
    [ 6 ]→报告到宕机事件。
    [ 7 ]被分配到一组的丛群节点的列表。
    [ 8 ]→在每个主机之后要求空的行。
    [ 9 ]→监视组观看所有节点。
    [ 10 ]→称为服务任何事物你想要。
    [ 11 ] fping的工作频率。
    [ 12 ]→使用fping.monitor脚本。
    [ 13 ]→针对语法输入:perldoc Time::Period
    [ 14 ]→当节点之一断开时。
    [ 15 ]→当节点之一连接时。
    [ 16 ]→每小时仅仅发送警报的电子邮件一次。
    Vi /etc/services,添加两行:
    mon 2583/tcp # MON
    mon 2583/udp # MON traps

    6 通过手工运行fping.monitor和mail.alert脚本的测试

    脚本命令如下:
#/usr/lib/mon/mon.d/fping.monitor clnode1 输出如下: start time: <current date> end time : <current date> duration : 0 seconds -------------------------------------------------------- reachable hosts rtt -------------------------------------------------------
209.100.100.2 58.10 ms
    上面的报告IP地址为209.100.100.2以58.10个秒响应fping。
    如果这脚本不适当地工作,你能需要告诉Perl找到fping的工具。编辑fping.monitor文件:
    my $CMD = "/usr/local/sbin/fping -e -r $RETRIES -t $TIMEOUT";
    要测试电子邮件警报,输入:
    #echo "Testing 123" | /usr/lib/mon/alert.d/mail.alert alert@domain.com
    alert@domain.com 是电子邮件的发送地址。

    7 使用调试方式时开始Mon测试

    #/usr/lib/mon/mon -d
    正常输出如下:
    PID 8211 (clusternodes/cluster-ping-check) exited with [0]
    Mon发送的电子邮件警报如下:
    Subject: ALERT clusternodes/process-check: localhost:ntpd,ypbind

    Summary output : localhost:ntpd,ypbind

    Group : clusternodes
    Service : process-check
    Time noticed : <Time and Date>
    Secs until next alert :
    Members : localhost

    Detailed text (if any) follows:
    -------------------------------

    localhost:ntpd Count=0 Min=0 Max=0
    localhost:ypbind Count=0 Min=0 Max=0


    到此为止笔者简单介绍了使用Heartbeat 2.0配置Linux高可用性集群的从部署到监视完整过程。
0
相关文章