一,HA定义

      高可用性H.A.(High Availability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性。它与被认为是不间断操作的容错技术有所不同。HA系统是目前企业防止核心计算机系统因故障停机的最有效手段。

随着IT信息系统的不断发展,数据在企业的应用越来越广,如何提高IT系统的高可用性成为建设稳健的计算机算系统的首要任务之一。构成计算机网络系统的三大要素是:网络系统,服务器系统,存储系统。网络系统包括防火墙,路由器等网络设备,服务器系统主要指用户使用的各种服务器系统,存储系统,则是用户最主要的数据存储放的地点。

因此IT系统的高可用建设应包括网络设备高可用性,服务器设备高可用性,及存储设备的高可用性三个方面。

编辑本段高可用性的分类

1:网络高可用

      由于网络存储的快速发展,网络冗余技术被不断提升,提高IT系统的高可用性的关键应用就是网络高可用性,网络高可用性与网络高可靠性是有区别的,网络高可用性是通过匹配冗余的网络设备实现网络设备的冗余,达到高可用的目的。

比如冗余的交换机,冗余的路由器等

2:服务器高可用

      服务器高可用主要使用的是服务器集群软件或高可用软件来实现。

3:存储高可用

      使用软件或硬件技术实现存储的高度可用性。其主要技术指标是存储切换功能,数据复制功能,数据快照功能等。当一台存储出现故障时,另一台备用的存储可以快速切换,达一存储不停机的目的。

编辑本段高可用性(HA)的功能

1、软件故障监测与排除

2、备份和数据保护

3、管理站能够监视各站点的运行情况,能随时或定时报告系统运行状况,故障能及时报告和告警,并有必要的控制手段

4、实现错误隔离以及主、备份服务器间的服务切换

HA的工作方式:HA有主从方式和双工方式两种工作模式

二,heartbeat

       Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里,由 heartbeat 模块实现了这两个功能。

      高可用集群是指一组通过硬件和软件连接起来的独立计算机,它们在用户面前表现为一个单一系统,在这样的一组计算机系统内部的一个或者多个节点停止工作,服务会从故障节点切换到正常工作的节点上运行,不会引起服务中断。从这个定义可以看出,集群必须检测节点和服务何时失效,何时恢复为可用。这个任务通常由一组被称为“心跳”的代码完成。在Linux-HA里这个功能由一个叫做heartbeat的程序完成。

      Heartbeat通过插件技术实现了集群间的串口、多播、广播和组播通信,在配置的时候可以根据通信媒介选择采用的通信协议,heartbeat启动的时候检查这些媒介是否存在,如果存在则加载相应的通信模块。这样开发人员可以很方便地添加新的通信模块,比如添加红外线通信模块。

对于高可用集群系统,如果集群间的通信不可靠,那么很明显集群本身也不可靠。Heartbeat采用UDP协议和串口进行通信,它们本身是不可靠的,可靠性必须由上层应用来提供。那么怎样保证消息传递的可靠性呢?

Heartbeat通过冗余通信通道和消息重传机制来保证通信的可靠性。Heartbeat检测主通信链路工作状态的同时也检测备用通信链路状态,并把这一状态报告给系统管理员,这样可以大大减少因为多重失效引起的集群故障不能恢复。例如,某个工作人员不小心拨下了一个备份通信链路,一两个月以后主通信链路也失效了,系统就不能再进行通信了。通过报告备份通信链路的工作状态和主通信链路的状态,可以完全避免这种情况。因为这样在主通信链路失效以前,就可以检测到备份工作链路失效,从而在主通信链路失效前修复备份通信链路。

三,实验案例(1)模拟HA高可用性网络

2012-10-13_225331

[root@node1 html]# vim /etc/sysconfig/network
 2012-10-11_110109

[root@node1 html]# vim /etc/hosts
2012-10-11_110128
另一台一样

2012-10-11_110204

2012-10-11_110139
安装http
[root@node1 Server]# cd /var/www/html/
[root@node1 html]# vim index.html
2012-10-11_111412
另一台
root@node1 Server]# cd /var/www/html/
[root@node1 html]# vim index.html
 2012-10-11_111618
装heartbeat
[root@node1 ~]# yum localinstall -y heartbeat-2.1.4-9.el5.i386.rpm heartbeat-pils-2.1.4-10.el5.i386.rpm heartbeat-stonith-2.1.4-11.el5.i386.rpm libnet-1.1.4-3.el5.i386.rpm perl-MailTools-1.77-1.el5.noarch.rpm --nogpgcheck
[root@node1 ~]# cd /etc/ha.d/
[root@node1 ha.d]# cd /usr/share/doc/heartbeat-2.1.4/
[root@node1 heartbeat-2.1.4]# cp ha.cf /etc/ha.d/
[root@node1 heartbeat-2.1.4]# cp haresources /etc/ha.d/
[root@node1 heartbeat-2.1.4]# cp authkeys /etc/ha.d/
[root@node1 heartbeat-2.1.4]# cd /etc/ha.d/
[root@node1 ha.d]# vim ha.cf
2012-10-11_131605

2012-10-11_131748
[root@node1 ha.d]# dd if=/dev/random bs=512 count=1 |openssl md5

[root@node1 ha.d]# vim authkeys 
2012-10-11_132239
[root@node1 ha.d]# vim haresources 
2012-10-11_132509

[root@node1 ha.d]# chmod 600 authkeys
[root@node1 ha.d]# cp /etc/init.d/httpd resource.d/
[root@node1 ha.d]# chkconfig heartbeat on
[root@node1 ha.d]# service heartbeat start
[root@node1 ha.d]# ifconfig
2012-10-11_134152
[root@node1 ha.d]# service httpd status
httpd (pid  8700) is running...

注意关闭阿帕奇服务
另一台
[root@node2 ~]#yum localinstall -y heartbeat-2.1.4-9.el5.i386.rpm heartbeat-pils-2.1.4-10.el5.i386.rpm heartbeat-stonith-2.1.4-11.el5.i386.rpm libnet-1.1.4-3.el5.i386.rpm perl-MailTools-1.77-1.el5.noarch.rpm --nogpgcheck
[root@node1 ha.d]# scp ha.cf node2.a.com:/etc/ha.d/
[root@node1 ha.d]# scp haresources node2.a.com:/etc/ha.d/
[root@node1 ha.d]# scp authkeys node2.a.com:/etc/ha.d/
[root@node1 ha.d]# scp /etc/init.d/httpd node2.a.com:/etc/ha.d/resource.d/
[root@node1 ha.d]# service httpd status
httpd is stopped
[root@node1 ha.d]# chkconfig --list |grep hear
[root@node1 ha.d]# chkconfig heartbeat on
[root@node2 ha.d]# service heartbeat start
[root@node2 ha.d]# ifconfig
2012-10-11_134241
[root@node2 ~]# service httpd status
httpd is stopped
测试
主机访问http://192.168.145.101
2012-10-11_140423
模拟网卡失效情况 主设备
测试
节点一
[root@node1 ha.d]# cd /usr/lib/heartbeat/
[root@node1 heartbeat]# ./hb_standby
节点二图
[root@node2 ~]# service httpd status
 2012-10-11_141114
连接图
没断

2012-10-11_141123 
节点2网页测试图

2012-10-11_141224
测试1又好了 模拟争夺
节点一执行另一指令
[root@node1 heartbeat]# ./hb_takeover
节点二图 又stop

2012-10-11_141503
网页测试变回一

2012-10-11_141524

实验案例(2)模拟HA结合LVS群集

去掉两台director中web服务
用LVS
第一台
[root@node1 heartbeat]# service heartbeat stop

[root@node1 heartbeat]# yum install httpd

编辑yum
[root@node1 heartbeat]# vim /etc/yum.repos.d/rhel-debuginfo.repo
2012-10-11_142634
[root@node1 heartbeat]# scp /etc/yum.repos.d/rhel-debuginfo.repo  node2.a.com:/etc/yum.repos.d/拷贝到另一台机子中
[root@node1 heartbeat]# yum install ipvsadm
heartbeat与lvs结合
[root@node1 heartbeat]# ipvsadm -A -t 192.168.145.101:80 -s rr
[root@node1 heartbeat]# ipvsadm -a -t 192.168.145.101:80 -r 192.168.145.200 -g
[root@node1 heartbeat]# ipvsadm -a -t 192.168.145.101:80 -r 192.168.145.201 -g
[root@node1 heartbeat]# service ipvsadm save
[root@node1 heartbeat]# service ipvsadm stop
[root@node1 heartbeat]# scp /etc/sysconfig/ipvsadm node2.a.com:/etc/sysconfig/拷贝到另一表格
[root@node1 heartbeat]# cd /etc/ha.d/
[root@node1 ha.d]# vim haresources
2012-10-11_143811
[root@node1 ha.d]# cp /etc/init.d/ipvsadm resource.d/
[root@node1 ha.d]# scp haresources node2.a.com:/etc/ha.d/
[root@node1 ha.d]# scp /etc/init.d/ipvsadm node2.a.com:/etc/ha.d/resource.d/
两边确认停止状态
[root@node1 ha.d]# ipvsadm -ln
[root@node1 ha.d]# service heartbeat start两边起群集

测试起来没
[root@node1 ha.d]# ipvsadm -ln
 2012-10-11_144658
一边起一边没起

2012-10-11_144727

模拟失效情况
第一台director
[root@node1 ha.d]# cd /usr/lib/heartbeat/
第二台测试

2012-10-11_144916
图起来了
地址也获得了

2012-10-11_145019
开两台server
一台
[root@localhost ~]# route add -host 192.168.145.101 dev lo:0
[root@localhost ~]# service httpd start
两一台同样
[root@localhost ~]# route add -host 192.168.145.101 dev lo:0
[root@localhost ~]# service httpd start
测试图 此时/VAR/WWW/HTML文件为https
2012-10-11_150456
模拟死掉
[root@node1 ha.d]# cd /usr/lib/heartbeat/
[root@node1 heartbeat]# ./hb_standby
测试图

2012-10-11_150830

2012-10-11_150841
改访问https 2

2012-10-11_150851

因为如果server死掉但是有路由表还会继续发包 会有包丢失现象为了不让由此现象 实现DOWN后条目自动消失
利用ldrectord 实现对后方的探测
两边HA停掉
[root@node2 ~]# service heartbeat stop
[root@node1 ~]# rpm -ivh heartbeat-ldirectord-2.1.4-9.el5.i386.rpm
[root@node1 ~]# cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/
要被heartbeat控制
[root@node1 ~]# cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/
[root@node1 ~]# vim /etc/ha.d/ldirectord.cf图

2012-10-11_154003
[root@node1 ha.d]# vim haresources
 2012-10-11_154656

删掉转发规则表
[root@node1 ha.d]# mv /etc/sysconfig/ipvsadm /etc/sysconfig/ipvsadm.old
第二台

[root@node2 ~]# rpm -ivh heartbeat-ldirectord-2.1.4-9.el5.i386.rpm

在第一台向第二台考配
[root@node1 ha.d]# scp ldirectord.cf node2.a.com:/etc/ha.d/
第二台
[root@node2 ~]# mv /etc/sysconfig/ipvsadm /etc/sysconfig/ipvsadm.old
第一台
[root@node1 ha.d]# service heartbeat start
第二台
[root@node2 ha.d]# service heartbeat start
第一台
[root@node1 ha.d]# ipvsadm –ln

 2012-10-11_155609
图看出此时权重为0 这是没有探测页面的结果
又因为静默设置YES不做处理仅仅降低值0

后两台server做探测液面
[root@localhost html]# cd /var/www/html/

第一台

[root@localhost html]# echo "ok" >.test.html
测试 第一台direct
[root@node1 ha.d]# ipvsadm -ln
看出图变为1
第二台后方server
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# echo "ok" >.test.html
测试第一台director

[root@node1 ha.d]# ipvsadm -ln
两个一

2012-10-11_160431

所以进入第一台HA

[root@node1 ha.d]# vim ldirectord.cf
2012-10-11_160830
NO不在沉默
第二台同样改

[root@node2 ~]# vim /etc/ha.d/ldirectord.cf
2012-10-11_160952
测试 模拟后方服务器停掉

[root@localhost html]# service httpd stop

前方第一CA
[root@node1 ha.d]# ipvsadm -ln
有又没了图

测试又好了
[root@localhost html]# service httpd start
HA
[root@node1 ha.d]# ipvsadm -ln
看出好了
 2012-10-11_161138

实验案例3)使用ipsan技术  彻底高可用性网络
对于server改内存和多加网卡

2012-10-11_173840

2012-10-11_172444
server1
加路由
[root@localhost ~]# route add -host 192.168.145.101 dev lo:0

server2同样

[root@localhost ~]# route add -host 192.168.145.101 dev lo:0

 

target

2012-10-11_185927

2012-10-11_172444

装[root@localhost ~]# cd /mnt/cdrom/ClusterStorage/
[root@localhost ftp]# yum install scsi-target-utils -y
[root@localhost ftp]# service tgtd start
[root@localhost ftp]# chkconfig tgtd on
增加磁盘
[root@target ClusterStorage]# fdisk /dev/sda
Command (m for help): n
p
Selected partition 4
First cylinder (1354-2610, default 1354):
Using default value 1354
Last cylinder or +size or +sizeM or +sizeK (1354-2610, default 2610): +2000m
Command (m for help): p
Command (m for help): w
[root@target ClusterStorage]# partprobe /dev/sda
[root@target ClusterStorage]# tgtadm --lld iscsi --op new --mode target --tid 1 --targetname iqn.2012-10.com.a.target:disk
[root@target ClusterStorage]# tgtadm --lld iscsi --op new --mode=logicalunit --tid=1 --lun=1 --backing-store /dev/sda4
ACL:

[root@target ClusterStorage]# tgtadm --lld iscsi --op bind --mode=target --tid=1 --initiator-address=192.168.2.0/24
实现开机启动
[root@target ClusterStorage]# vim /etc/tgt/targets.conf
2012-10-11_193727

前端server1
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/
[root@localhost ~]# cd /mnt/cdrom/Server/
[root@localhost Server]# rpm -ivh iscsi-initiator-utils-6.2.0.871-0.10.el5.i386.rpm
第二台同样安装

[root@localhost Server]# cd /etc/iscsi/
[root@localhost iscsi]# vim initiatorname.iscsi
2012-10-11_195309
[root@localhost iscsi]# service iscsi start
客户端工具
[root@localhost iscsi]# iscsiadm --mode discovery --type sendtargets --portal 192.168.2.100发现target

2012-10-11_195749
[root@localhost iscsi]# iscsiadm --mode node --targetname iqn.2012-10.com.a.target:disk --portal 192.168.2.100:3260 --login
2012-10-11_200310
连接
[root@localhost iscsi]# fdisk -l

target上查看

2012-10-11_200454

[root@target ClusterStorage]# tgtadm --lld iscsi --op show --mode target
2012-10-11_200631

server1

分区对新硬盘
[root@localhost iscsi]# fdisk /dev/sdb
Command (m for help): n
p
Partition number (1-4): 1
First cylinder (1-1019, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1019, default 1019):
Using default value 1019
Command (m for help): p

Disk /dev/sdb: 2006 MB, 2006968320 bytes
62 heads, 62 sectors/track, 1019 cylinders
Units = cylinders of 3844 * 512 = 1968128 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1019     1958487   83  Linux

Command (m for help): w
[root@localhost iscsi]# fdisk -l
2012-10-11_201002
格式化
[root@localhost iscsi]# mkfs -t ext3 /dev/sdb1
挂载点建立
[root@localhost iscsi]# mkdir /mnt/1
[root@localhost iscsi]# mount /dev/sdb
sdb   sdb1 
[root@localhost iscsi]# mount /dev/sdb1 /mnt/1
[root@localhost iscsi]# df –h

2012-10-11_201216 

[root@localhost 1]# cp /etc/passwd ./
[root@localhost 1]# cp /etc/init
init.d/       initlog.conf  inittab      
[root@localhost 1]# cp /etc/inittab ./
考些东西
service2:

[root@localhost Server]# vim /etc/iscsi/initiatorname.iscsi
2012-10-11_201630
[root@localhost Server]# service iscsi start
[root@localhost Server]# iscsiadm --mode discovery --type sendtargets --portal 192.168.2.100
[root@localhost Server]# iscsiadm --mode node --targetname iqn.2012-10.com.a.target:disk --portal 192.168.2.100:3260 --login
再到target上查看连接
[root@target ClusterStorage]# tgtadm --lld iscsi --op show --mode target
2012-10-11_202030
第二个server不用再分区格式化 因为第一个已经做好
[root@localhost Server]# fdisk -l
2012-10-11_202243
[root@localhost Server]# mkdir /mnt/1
[root@localhost Server]# mount /dev/sdb1 /mnt/1
[root@localhost Server]# cd /mnt/1
[root@localhost 1]# ll
2012-10-11_202400
此种磁盘类型没有推送机制和锁机制
解决问题

第二台
[root@localhost 1]# touch jx1
[root@localhost ~]# umount /dev/sdb1
[root@localhost ~]# mount /dev/sdb1 /mnt/1
[root@localhost ~]# cd /mnt/1
[root@localhost 1]# iscsiadm --mode node --targetname iqn.2012-10.com.a.target:disk --portal 192.168.2.100:3260 --logout
target上测试
[root@target ClusterStorage]# tgtadm --lld iscsi --op show --mode target
2012-10-11_203328
第一台同样卸载
[root@localhost ~]# umount /dev/sdb1
[root@localhost ~]# iscsiadm --mode node --targetname iqn.2012-10.com.a.target:disk --portal 192.168.2.100:3260 --logout
target上查看
2012-10-11_203528
再登陆
[root@localhost ~]# iscsiadm --mode node --targetname iqn.2012-10.com.a.target:disk --portal 192.168.2.100:3260 --login
[root@localhost ~]# mount /dev/sdb1 /var/www/html/
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# vim index.html
2012-10-11_204105
[root@localhost html]# vim .test.html
2012-10-11_204116
[root@localhost html]# ll
2012-10-11_204325
第二台机子
重新实现登陆
[root@localhost 1]# iscsiadm --mode node --targetname iqn.2012-10.com.a.target:disk --portal 192.168.2.100:3260 --login
[root@localhost 1]# mount /dev/sdb1 /var/www/html/
[root@localhost ~]# cd /var/www/html/
 2012-10-11_205123

最终测试两台服务器server注意开启阿帕奇
2012-10-11_205544
测试server2http停掉
[root@localhost html]# service httpd stop

前端direct1
[root@node1 ~]# ipvsadm -ln
2012-10-11_205829
发现一台http服务器停掉

测试外部及HTTP
发现还能访问

2012-10-11_205839