Chinaunix首页 | 论坛 | 博客
  • 博客访问: 710873
  • 博文数量: 140
  • 博客积分: 5097
  • 博客等级: 大校
  • 技术积分: 991
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-05 19:13
文章分类

全部博文(140)

文章存档

2018年(1)

2015年(5)

2014年(5)

2013年(2)

2011年(16)

2010年(6)

2009年(9)

2008年(45)

2007年(26)

2006年(25)

分类: 系统运维

2006-01-19 12:24:54

 随着越来越多的商业应用移动Internet上来时,提供高可用性的服务变得越来越重要。高可用性技术就是一种自动检测服务器节点和服务进程错误、失效,并且当发生这种情况时能够自动适当地重新配置系统,使得集群中的其它节点能够自动承担这些服务,以实现服务不中断。
   
    IBM公司的RS6000系列小型机十分畅销,广为市场所接受的原因,一方面是因为其优秀的整机性能,另一方面就是配套的HACMP方案—IBM高可用性解决方案。可见高可用性在关键应用场合的重要性。

1.基于LVS的HA方案


    Linux要进入高端市场就必须在这方面有相应的措施,所以许多公司都这方面加大了研究力度。现在,我们可以使用一些现存的软件去构筑具有高可性的LVS系统。下面列出两种方案,以供参考。
   
    方案一:mon+heartbeat+fake+coda
    我们可以使用"mon"、"heartbeat"、"fake"和"coda"四个软件来构筑具用高可用性的Virtual Server。"mon"是一个大众化的资源管理系统,用来监控网络上的服务器节点和网络服务。"heartbeat"实现在两台计
算机间通过在串行线上使用UDP协议传送"心跳信息"。"Fake"是一个使用ARP欺骗的方法来实现IP接管。具
有高可用性的Linux Virtual Server如下图所示:
 
    当服务器故障时,处理过程如下:
   "mon"进程运行在负载均衡器上,负责监测整个集群的服务器节点和服务进程。在配置文件"fping.monitor"中写入要检测服务器节点, 然后"mon"进程将会t秒检查一下相应的服务器节点是否还活着。另外相关的服务监视器也要做相应的配置,这样"mon"进程将每m秒检测一下所有节点的 相应服务进程。例如,http.monitor用于配置监控http服务;ftp.monitor用于配置监控ftp服务;以此类推。当配置完成后,某个 服务器节点失效或重新生效、服务进程失效或重新生效时都会发送一个通告信息,因此,负载均衡器能够知道服务器节点是否能接受服务。

    现在,负载均衡器成为了整个系统的单点失效。为了防止这一现象,我们必须安装一个负载均衡器的备份服务器。"fake"软件实现当负载均衡器失效 时,备份服务器自动接管IP地址,继续服务。而"heartbeat"则随时根据负载均衡器的状态自动激活/去激活备份服务器上的"fake"进程。在负 载均衡器和备份服务器上都运行着一个"heartbeat"进程,它们通过串行线周期性地发送"I'm alive "消息。如果备份服务器在一个预定时 间内接收不到来自负载均衡器的"I'm alive"信息时,将自动激活"fake"进程接管负载均衡器的IP地址,并开始提供负载均衡服务;而当再次收 到来自负载均衡器的"I'm alive "消息时,备份服务器将自动将"fake"进程去激活,释放出它接管的服务器,负载均衡器重新开始工作。

    但是,如果负载均衡器在客户正在请求时失效,这时会引起客户请求失败,客户必须重新发出请求信
息。

   "coda"是一个容错的分布式文件系统,源于Andrew文件系统。服务器上的目录能够存储在"coda"上,所
以文件能够实现高可用性,并且易于管理。

   配置实例:

   下面是一个基于VS-DR的Virutal Server构筑高可用性的WEB服务器。

   "mon"用于监测集群中的服务器节点和服务进程。例如,"fping.monitor"文件用于监测服务器节点,
"http.monitor"文件用于检测HTTP服务,"ftp.monitor"用于检测FTP服务,以此类推。所以,我们只需往里
增加或删除一个规则。下面是一个配置实例:lvs.alert。
#!/usr/bin/perl 

# lvs.alert - Linux Virtual Server alert for mon 

# It can be activated by mon to remove a real server when the 
# service is down, or add the server when the service is up. 


use Getopt::Std;
getopts ("s:g:h:t:l:P:V:R:W:F:u");
 
$ipvsadm = "/sbin/ipvsadm";
$protocol = $opt_P;
$virtual_service = $opt_V; 
$remote = $opt_R;
 
if ($opt_u) {
    $weight = $opt_W;
    if ($opt_F eq "nat") {
       $forwarding = "-m";
    } elsif ($opt_F eq "tun") {
       $forwarding = "-i";
    } else {
        $forwarding = "-g";
    }
 
    if ($protocol eq "tcp") {
        system("$ipvsadm -a -t $virtual_service -r $remote -w $weight $forwarding");
    } else {
       system("$ipvsadm -a -u $virtual_service -r $remote -w $weight $forwarding");
    }
} else { 
    if ($protocol eq "tcp") {
       system("$ipvsadm -d -t $virtual_service -r $remote");
    } else {
       system("$ipvsadm -d -u $virtual_service -r $remote");
    }
};
       "lvs.alert"文件放在/usr/lib/mon/alert.d目录下。
   "mon"的配置文件(/etc/mon/mon.cf或者/etc/mon.cf)可以象下面所示一样,配置成在集群中监测
HTTP服务和服务器节点的功能。
#
# The mon.cf file
#
#
# global options
#
cfbasedir   = /etc/mon 
alertdir   = /usr/lib/mon/alert.d
mondir     = /usr/lib/mon/mon.d
maxprocs    = 20
histlength = 100
randstart = 30s
 
#
# group definitions (hostnames or IP addresses)
#
hostgroup www1 www1.domain.com 
 
hostgroup www2 www2.domain.com
 
#
# Web server 1

watch www1
    service http 
              interval 10s 
       monitor http.monitor 
       period wd {Sun-Sat} 
           alert mail.alert wensong 
           upalert mail.alert wensong 
           alert lvs.alert -P tcp -V 10.0.0.3:80 -R 192.168.0.1 -W 5 -F dr
           upalert lvs.alert -P tcp -V 10.0.0.3:80 -R 192.168.0.1 -W 5 -F dr
 
#
# Web server 2

watch www2 
    service http 
        interval 10s 
       monitor http.monitor 
       period wd {Sun-Sat} 
           alert mail.alert wensong 
           upalert mail.alert wensong 
           alert lvs.alert -P tcp -V 10.0.0.3:80 -R 192.168.0.2 -W 5 -F dr
           upalert lvs.alert -P tcp -V 10.0.0.3:80 -R 192.168.0.2 -W 5 -F dr
注意:如果目标端口不同,则你需要为"lvs.alert"设置参数,形如:
       "lvs.alert -V 10.0.0.3:80 -R 192.168.0.3:8080" 
    现在,负载均衡器能够将服务器节点失效和服务失效的情况隐藏起来,当它们恢复正常后又自动将其投入使用。

    另外,为了防止负载均衡器成为整个系统的单点失效,我们需要构建一个负载均衡器的备份服务器,让它们周期性地传递"心跳信息"。详细的细节请参考"heartbeat"软件包中带的相关文档,构建两个服务器节点组成"heartbeat"系统是相单简单的。

    例如,我们假定两个负载均衡器有下列的IP地址:
    lvs1.domain.com (负载均衡器) 10.0.0.1 
    lvs2.domain.com (备份服务器) 10.0.0.2 
    (集群服务的虚拟IP) 10.0.0.3 
    在lvs1.domain.com 和lvs2.domain.com两台机器上都安装"heartbeat"软件包,然后新建/etc/hd.d/ha.conf,内容如下:
#
#       keepalive: how many seconds between heartbeats
#
keepalive 2
#
#       deadtime: seconds-to-declare-host-dead
#
deadtime 10
#       hopfudge maximum hop count minus number of nodes in config
hopfudge 1
#
#       What UDP port to use for udp or ppp-udp communication?
#
udpport 1001
#       What interfaces to heartbeat over?
udp     eth0
#
#       Facility to use for syslog()/logger (alternative to log/debugfile)
#
logfacility     local0
#
#       Tell what machines are in the cluster
#       node    nodename ...    -- must match uname -n
node    lvs1.domain.com
node    lvs2.domain.com
 
"/etc/ha.d/haresources"文件内容如下:
        lvs1.domain.com 10.0.0.3 lvs mon
 
"/etc/rc.d/init.d/lvs"文件内容如下:
 
#!/bin/sh
#
# You probably want to set the path to include
# nothing but local filesystems.
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH
 
IPVSADM=/sbin/ipvsadm
 
case "$1" in
    start)
       if [ -x $IPVSADM ]
       then
            echo 1 > /proc/sys/net/ipv4/ip_forward
           $IPVSADM -A -t 10.0.0.3:80
           $IPVSADM -a -t 10.0.0.3:80 -r 192.168.0.1 -w 5 -g
           $IPVSADM -a -t 10.0.0.3:80 -r 192.168.0.2 -w 5 -g
       fi
       ;;
    stop)
       if [ -x $IPVSADM ]
       then
           $IPVSADM -C
       fi
       ;;
    *)
       echo "Usage: lvs {start|stop}"
       exit 1
esac
 
exit 0
 
    最后,确认你已经在负载均衡器和备份服务器上均新建了以上文件,你就可以在两台机器上启动"heartbeat"进程了。

    注意:"fake"已经包含在"heartbeat"包中,所以无需单独地安装"fake"包。当 lvs1.domain.com失效时,lvs2.domain.com将接管所有lvs1.domain.com的"haresources",也就是 使用ARP欺骗接管10.0.0.3,并启动/etc/rc.d/init.d/lvs和/etc/rc.d/init.d/mon脚本。当 lvs1.domain.com恢复正常时,lvs2将释放所有HA资源,lvs1接替工作。

   方案二:ldirectord+heartbeat
   "ldirectord"(Linux Director Daemon)是Jacob Rief编程实现的一个独立进程,以实现对服务和物理服务器的监测,广泛地用于http和https服务。

   "ldirectord"安装简单,能很好地与"heartbeat"很好的配合工作。"ldirectord"程序包含在"ipvs"包中的"contrib"目录中。
   
    下面指出了"ldirectord"的一些优点:
    "ldirectord"是专门撰写的LVS监测程序。
    它从/etc/ha.d/xxx.cf文件中读取所有关于IPVS路由表的配置信息。当"ldirectord"运行起来后,IPVS路由表将会被适当地配置。
    也可以将Virtual service配置放在多个配置文件中,所以可以单独修改某一种服务的参数,而不影响其它的服务。"ldirectord"能被"heartbeat"轻松地管理----启动、关闭。
   
    将"ldirectord"放到/etc/ha.d/resource.d/目录下,然后在/etc/ha.d/haresources中增加一行:
         node1 IPaddr::10.0.0.3 ldirectord::www ldirectord::mail

    "ldirectord"能够手动开启、关闭。可以在无备份负载均衡器的LVS集群中使用它。

    配置实例:

    新建或修改配置文件/etc/ha.d/,使其包含:
     #
     # The /etc/ha.d/ for ldirectord
     #
 
     # the number of second until a real server is declared dead
     timeout = 10
 
     # the number of second between server checks
     checkinterval = 10
 
     #
     # virtual = x.y.z.w:p
     #     protocol = tcp|udp
     #     scheduler = rr|wrr|lc|wlc
     #     real = x.y.z.w:p gate|masq|ipip [weight]
     #     ...
     #     
 
     virtual = 10.0.0.3:80
          protocol = tcp
          scheduler = wlc
          real = 192.168.0.1:80 gate 5
          real = 192.168.0.2:80 gate 5
          request = "/.testpage"
          receive = "test page"
   在 /etc/ha.d/haresources文件中写入以下配置:
   lvs1.domain.com IPaddr::10.0.0.3 ldirectord::www
   同时,必须新建一个.testpage文件放在所有WWW服务器的主目录下:
   使用命令:
   echo "test page" > .testpage
   在主、备两台机器上都启动"heartbeat"进程,如果有任何错误,可以分别检查/var/log/ha-log和
/var/log/ldirector.log两个文件。

2 Xlinux的LATCH HA解决方案


    正如前面所述,高可用性解决方案(HA)是一种极为重要的,许许多多厂商投入了大量的研究,其中Xlinux发行版就提供了LATCH HA解决 方案,能够应用在各种集中式、客户机-服务器模式或OLTP系统中。同时其与市场上各种主流的数据库系统与OLTP软件(如Oracle、 SYSBASE、Informix与Tuxedo)也都保持兼容。LATCH HA同时提供了各种应用程序接口。因此,客户能够在其私有软件中集成各种功 能来保证系统的高可靠性,这样也保护了客户的投资。下面我们就一起看看LATCH HA方案。
  
    LATCH HA解决方案的最典型的系统结构:两台主机A、B共享一个磁盘阵列,A为工作机,B为备份机。它们之间用一根心跳线来连接,这称为 “心跳检测”,主要通过一条RS232检测链路来完成。LATCH HA也采用了网络Ping来验证系统宕机检测的准确性。安装在主机上的HA软件上的 HA软件通过心跳线来实时监测对方的运行状态,一旦正在工作的主机A因为各种硬件故障导致系统发生故障,主机B立即投入工作。怎么样,与IBM的 HACMP有点象吧!

    LATCH HA实现了“高可靠性共享存储”架构。该架构由两个或三个冗余服务器、一个共享冗余磁盘阵列、一个可选DBMS及LATCH HA系 统软件构成。在LATCH HA的保护下,企业的计算机系统能够提供不间断的信息服务,避免由于硬件故障或日常维护所带来的宕机,因而能够首先最佳的可靠 性及最大程度地减少宕机时间。
 
方案应用

    LATCH HA能够应用在各种集中式、客户机-服务器模式或OLTP系统中。同时其与市场上各种主流的数据库系统与OLTP软件-如 Oracle、 SYBASE、 Informix与Tuxedo-也都保持兼容。LATCH HA同时提供了各种应用程序接口。因此,客户能够在其私有 软件中集成各种功能来保证系统的高可靠性。 

    1)  LATCH HA/HS2000 在线待机模式 
 
    在这种模式下,一个服务器作为主服务器。正常情况下其承当所有的服务。另外一台服务器作为待机服务器,正常情况下除了监控主服务器的状态,不进行 其他的操作。一旦主服务器宕机,待机服务器就接手工作,成为新的主服务器。客户仍然可以拥有同样的服务器IP地址、NFS、数据、数据库及其他……这种应 用模式近似于上面介绍的典型应用模式—A与B实际上是在完成同一个功能应用,安装在主机上的HA软件通过心跳线来实时监测对方的运行状态,一旦正在工作的 主机A因为各种硬件故障-如电源失效、主要部件失效或者启动盘失效等导致系统发生故障,主机B立即投入工作。 
 
    2) LATCH HA/DA2000双机就绪模式 
 
    在这种模式下,两个主机都作为主服务器,共享自己的磁盘阵列,各自承当一部分服务。例如服务器A在执行应用A, 服务器B在执行应用B, 两个主 机在正常情况下各自独立运行自己的应用逻辑,两个主机同时又都作为对方的待机服务器,通过心跳线监控对方的状态。一旦某一服务器宕机,另一台服务器就承担 所有的服务,为所有的客户服务。及一旦服务器A发生故障,服务器B马上接管服务器A上原来的应用;或者服务器B发生故障,服务器A马上接管服务器B上原来 的应用,这是一种互为冗余的模式。
 
    很明显,一旦某一服务器宕机,另一台服务器的工作服但就比较重,于是就有了下面的三主机模式。 
 
    3) LATCH HA/HC2000 三主机模式 

    这种应用模式是最高端的HA应用模式,它既保证了系统的设备冗余,避免系统宕机,而且又能保证在一旦宕机的情况下有足够的系统资源以供使用。
 
    在这种模式中,待机服务器C同时监控主服务器A与B的状态。一旦服务器A或B宕机,服务器C将承担其服务,为客户服务。这种系统结构既保证了系统的安全运行,又保证了系统资源。 


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