当前位置: > Linux集群 >

利用heartbeat实现三台主机自动切换网络参数

时间:2014-03-14 00:26来源:linux.it.net.cn 作者:IT网
一、环境

node0
eth0:192.168.32.30 service vip1:192.168.32.21 VMAC1:00:1E:68:1E:99:5E
eth1:10.160.100.30 heart RMAC:00:18:8B:8E:04:E2

node1
eth0:192.168.32.31 service vip1:192.168.32.21 VMAC1:00:1E:68:1E:99:5E
eth1:10.160.100.31 heart vip2:192.168.32.22 VMAC2:00:1E:68:1E:88:5E RMAC:00:1E:68:1E:19:5E

node2
eth0:192.168.32.32 service vip2:192.168.32.22 VMAC2:00:1E:68:1E:88:5E
eth1:10.160.100.32 heart RMAC:00:1E:68:1E:16:7E



实验要求:
1、当node0的网络出现故障时,node1自动切换将自己的ip、hostname、mac地址改成vip1、vman1、 nodevir1;故障恢复后node0自动切换回来,将自己的ip、hostname、mac改成vip1、vman1、nodevir,node1恢 复自身的网络参数
2、当node2的网络出现故障时,node1自动切换将自己的ip、hostname、mac地址改成vip2、vman2、 nodevir2;故障恢复后node0自动切换回来,将自己的ip、hostname、mac改成vip2、vman2、nodevir2,node1 恢复自身的网络参数

二、heartbeat安装(三台node操作一样)

1、安装libnet
[root@node1 ~]# tar -zxvf libnet-1.1.4.tar.gz
[root@node1 ~]# cd libnet-1.1.4
[root@node1 libnet-1.1.4]# ./configure
[root@node1 libnet-1.1.4]# make;make install
#libnet是一个高层次API工具,使用heartbeat需要用到他

2、安装heartbeat
[root@node1 ~]# tar -zxvf heartbeat-2.1.3.tar.gz
[root@node1 ~]# cd heartbeat-2.1.3
[root@node1 heartbeat-2.1.3]# ./ConfigureMe configure --disable-swig --disable-snmp-subagent
[root@node1 heartbeat-2.1.3]# make ; make install
[root@node1 heartbeat-2.1.3]# cp doc/ha.cf doc/haresource doc/anthkeys /etc/ha.d/
[root@node1 heartbeat-2.1.3]# cp ldirectord/ldiretord.cf /etc/ha.d/  
[root@node1 heartbeat-2.1.3]# grouadd -g 694 haclient
[root@node1 heartbeat-2.1.3]# useradd -u 694 -g 694 hacluster
#heartbeat的安装包中默认包含ldirectord插件,该插件主要用于管理负载均衡,为保证ldirectord可用还行安装perl-Mailtools

三、配置

1 node0配置
1.1 创建网络参数修改脚本(/etc/ha.d/resource.d/Remac1)
[root@node0 resource.d]# vim /etc/ha.d/resource.d/Remac1   #Remac1也可存放在/etc/rc.d/init.d目录
#!/bin/bash
#discription : Start Real Server
VMAC=00:1E:68:1E:99:5E
RMAC=00:1E:68:1E:19:5E
GATEWAY=192.168.32.254
. /etc/rc.d/init.d/functions
case "$1" in
  start)
  echo "Replace eth0's Real Mac addr to Virtual Mac addr"
  /sbin/ifconfig eth0 down
  /sbin/ifconfig eth0 hw ether $VMAC
  /sbin/ifconfig eth0 up
  /sbin/ifconfig eth0 192.168.32.21 broadcast 192.168.32.255 netmask 255.255.255.0
  /bin/hostname nodevir
  /sbin/route add default gw $GATEWAY
  ;;
  stop)
echo "Restore eth0's Real Mac addr"
  /sbin/ifconfig eth0 down
  /sbin/ifconfig eth0 hw ether $RMAC
  /sbin/ifconfig eth0 up
  /sbin/ifconfig eth0 192.168.32.31 broadcast 192.168.32.255 netmask 255.255.255.0
  /bin/hostname node1
  /sbin/route add default gw $GATEWAY
  ;;
  *)
  echo "Usage : $0 {start|stop}"
  exit 1
esac

1.2 heartbeat主配置文件(/etc/ha.d/ha.cf)
[root@node1 ha.d]# vim /etc/ha.d/ha.cf
#debugfile /var/log/ha-debug 
logfile /var/log/ha-log  
#指名heartbeat的日志存放位置。
#crm yes    
#是否开启Cluster Resource Manager(集群资源管理)功能。 
bcast eth1  
#指明心跳使用以太网广播方式,并且是在eth1接口上进行广播。 
keepalive 2
#指定心跳间隔时间为2秒(即每两秒钟在eth1上发送一次广播)。 
deadtime 60
#指定备用节点在30秒内没有收到主节点的心跳信号后,则立即接管主节点的服务资源。 
warntime 20
#指定心跳延迟的时间为十秒。当10秒钟内备份节点不能接收到主节点的心跳信号时,就会往日志中写入一个警告日志,但此时不会切换服务。 
initdead 240 
#在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。  
udpport 694   #设置广播通信使用的端口,694为默认使用的端口号。 
#baud 19200    #设置串行通信的波特率。 
#serial /dev/ttyS0   #选择串行通信设备,用于双机使用串口线连接的情况。如果双机使用以太网。 
#ucast eth0 192.168.1.2 #采用网卡eth1的udp单播来组织心跳,后面跟的IP地址应为双机对方的IP地址。
#mcast eth0 225.0.0.1 694 1 0 #采用网卡eth0的Udp多播来组织心跳,一般在备用节点不止一台时使用。Bcast、ucast和mcast分别代表广播、单播和多播,是组织心跳的三种方式,任选其一即可。
auto_failback on
#用来定义当主节点恢复后,是否将服务自动切回,heartbeat的两台主机分别为主节点和备份节点。主节点在正常情况下占用资源并运行所有 的服务,遇到故障时把资源交给备份节点并由备份节点运行服务。在该选项设为on的情况下,一旦主节点恢复运行,则自动获取资源并取代备份节点,如果该选项 设置为off,那么当主节点恢复后,将变为备份节点,而原来的备份节点成为主节点。 
#stonith baytech /etc/ha.d/conf/stonith.baytech  
# stonith的主要作用是使出现问题的节点从集群环境中脱离,进而释放集群资源,避免两个节点争用一个资源的情形发生。保证共享数据的安全性和完整性。 

#watchdog /dev/watchdog
#该选项是可选配置,是通过Heartbeat来监控系统的运行状态。使用该特性,需要在内核中载入"softdog"内核模块,用来生成实际的设备文件,
如果系统中没有这个内核模块,就需要指定此模块,重新编译内核。编译完成输入"insmod softdog"加载该模块。然后输入"grep misc /proc/devices"(应为10),输入"cat /proc/misc |grep watchdog"(应为130)。最后,生成设备文件:"mknod /dev/watchdog c 10 130" 。即可使用此功能。
node node0   #主节点主机名,可以通过命令“uanme –n”查看。 
node node1   #备用节点主机名。 
ping 192.168.32.254
#选择ping的节点,ping 节点选择的越好,HA集群就越强壮,可以选择固定的路由器作为ping节点,但是最好不要选择集群中的成员作为ping节点,ping节点仅仅用来测试网络连接。 
ping_group group1 192.168.12.251 192.168.12.239   #类似于ping。 
#respawn hacluster /usr/local/ha/lib/heartbeat/ipfail 
#apiauth pingd gid=haclient uid=hacluster
apiauth pingd gid=root uid=root
respawn hacluster /usr/local/ha/lib/heartbeat/pingd -m 100 -d 5s
#该选项是可选配置,列出与heartbeat一起启动和关闭的进程,该进程一般是和heartbeat集成的插件,这些进程遇到故障可以自动 重新启动。最常用的进程是pingd,此进程用于检测和监控网卡状态,需要配合ping语句指定的ping node来检测网络的连通性。其中hacluster表示启动pingd进程的身份。
#下面的配置是关键,也就是激活crm管理,开始使用v2 style格式 
crm respawn  
#注意,还可以使用crm yes的写法,但这样写的话,如果后面的cib.xml配置有问题 
#会导致heartbeat直接重启该服务器,所以,测试时建议使用respawn的写法 
#下面是对传输的数据进行压缩,是可选项 
compression     bz2 
compression_threshold 2 
#注意,v2 style不支持ipfail功能,须使用pingd代替 

1.3 资源文件(/etc/ha.d/haresources)
[root@node0 ha.d]# vim /etc/ha.d/haresources
node0 Remac1   

#haresources文件用于指定双机系统的主节点、集群IP、子网掩码、广播地址以及启动的服务等集群资源,文件每一行可以包含一个或多个资源脚本名,资源之间使用空格隔开,参数之间使用两个冒号隔开,在两个HA节点上该文件必须完全一致,此文件的一般格式为:
node-name network  <resource-group>

#node-name表示主节点的主机名,必须和ha.cf文件中指定的节点名一致,network用于设定集群的IP地址、子网掩码、网络设 备标识等,需要注意的是,这里指定的IP地址就是集群对外服务的IP地址,resource-group用来指定需要heartbeat托管的服务,也就 是这些服务可以由heartbeat来启动和关闭,如果要托管这些服务,必须将服务写成可以通过start/stop来启动和关闭的脚步,然后放到 /etc/init.d/或者/etc/ha.d/resource.d/目录下,heartbeat会根据脚本的名称自动去/etc/init.d或者 /etc/ha.d/resource.d/目录下找到相应脚步进行启动或关闭操作。

#LSB: Linux标准脚本文件(init script),通常放在/etc/init.d/目录下,heartbeat1.x版本之前的管理脚本一半放在/etc/ha.d /resource.d,在这里是/usr/local/ha/etc/ha.d/resource.d
OCF:Open Cluster Framework,默认放在/usr/lib/resource.d/heartbeat/目录下;在这里是/usr/local/ha/etc/ha.d/resource.d

#下面介绍一下ocf和lsb格式的区别:
LSB格式的脚本必须支持status功能,必须能接收start,stop,status,三个参数;而如果是OCF格式,则必须支持start,stop,monitor三个参数.其中status和monitor参数是用来监控资源的,非常重要.
例如LSB风格的脚本,运行./Mysql status时候, 返回值包含OK或则running则表示资源正常,返回值包含stopped或者No则表示资源不正常。 假如是OCF风格的脚本,运行./Mysql monitor时候, 返回0表示资源是正常的, 返回7表示资源出现问题.

#下面对配置方法进行具体说明:
node1 IPaddr::192.168.60.200/24/eth0/  Filesystem::/dev/sdb5::/webdata::ext3  httpd tomcat

#其中,node1是HA集群的主节点,IPaddr为heartbeat自带的一个执行脚步,heartbeat首先将执行/etc/ha.d/resource.d/IPaddr 192.168.60.200/24 start的操作,也就是虚拟出一个子网掩码为255.255.255.0,IP为192.168.60.200的地址,此IP为heartbeat对外提供服务的网络地址,同时指定此IP使用的网络接口为eth0,接着,heartbeat将执行共享磁盘分区的挂载操作,“Filesystem::/dev/sdf1::/data1::ext3”相当于在命令行下执行mount操作,即“mount –t ext3 /dev/sdf1 /data1”,最后依次启动httpd和tomcat服务。

1.4 认证文件(/etc/ha.d/authkeys)
[root@node0 resource.d]# vim /etc/ha.d/authkeys
auth 1
1 crc
#2 sha1 HI!
#3 md5 Hello!

#authkeys文件用于设定heartbeat的认证方式,共有三种可用的认证方式:crc、md5和sha1,三种认证方式的安全性依次提高,但是占用的系统资源也依次增加。如果heartbeat集群运行在安全的网络上,可以使用crc方式,如果HA每个节点的硬件配置很高,建议使用sha1,这种认证方式安全级别最高,如果是处于网络安全和系统资源之间,可以使用md5认证方式。这里我们使用crc认证方式,设置如下:
auth 1 
1 crc 
#2 sha1 sha1_any_password 
#3 md5 md5_any_password
#需要说明的一点是:无论auth后面指定的是什么数字,在下一行必须作为关键字再次出现,例如指定了“auth 6”,下面一定要有一行“6 认证类型”。最后确保这个文件的权限是600(即-rw-------)。

2 node1配置
2.1 创建网络参数修改脚本(/etc/ha.d/resource.d/Remac1&2)
[root@node1 ~]# vim /etc/ha.d/resource.d/Remac1    #备份node0的网络参数修改脚本
#!/bin/bash
#discription : Start Real Server
VMAC=00:1E:68:1E:99:5E 
RMAC=00:1E:68:1E:19:5E                              #注意:与node0中Remac1中RMAC不一样
GATEWAY=192.168.32.254
. /etc/rc.d/init.d/functions
case "$1" in
  start)
  echo "Replace eth0's Real Mac addr to Virtual Mac addr"
  /sbin/ifconfig eth0 down
  /sbin/ifconfig eth0 hw ether $VMAC
  /sbin/ifconfig eth0 up
  /sbin/ifconfig eth0 192.168.32.21 broadcast 192.168.32.255 netmask 255.255.255.0
  /bin/hostname nodevir
  /sbin/route add default gw $GATEWAY
  ;;
  stop)
echo "Restore eth0's Real Mac addr"
  /sbin/ifconfig eth0 down
  /sbin/ifconfig eth0 hw ether $RMAC
  /sbin/ifconfig eth0 up
  /sbin/ifconfig eth0 192.168.32.31 broadcast 192.168.32.255 netmask 255.255.255.0
  /bin/hostname node1
  /sbin/route add default gw $GATEWAY
  ;;
  *)
  echo "Usage : $0 {start|stop}"
  exit 1
esac


[root@node1 ~]# cat /etc/ha.d/resource.d/Remac2   #备份node2的网络参数修改脚本
#!/bin/bash
#discription : Start Real Server
VMAC=00:1E:68:1E:88:5E
RMAC=00:1E:68:1E:19:5E                            #注意:与node中Remac1中RMAC不一样
GATEWAY=192.168.32.254
. /etc/rc.d/init.d/functions
case "$1" in
  start)
  echo "Replace eth0's Real Mac addr to Virtual Mac addr"
  /sbin/ifconfig eth0 down
  /sbin/ifconfig eth0 hw ether $VMAC
  /sbin/ifconfig eth0 up
  /sbin/ifconfig eth0 192.168.32.22 broadcast 192.168.32.255 netmask 255.255.255.0
  /bin/hostname nodevir2
  /sbin/route add default gw $GATEWAY
  ;;
  stop)
echo "Restore eth0's Real Mac addr"
  /sbin/ifconfig eth0 down
  /sbin/ifconfig eth0 hw ether $RMAC
  /sbin/ifconfig eth0 up
  /sbin/ifconfig eth0 192.168.32.31 broadcast 192.168.32.255 netmask 255.255.255.0 
  /bin/hostname node1
  /sbin/route add default gw $GATEWAY
  ;;
  *)
  echo "Usage : $0 {start|stop}"
  exit 1
esac

2.2 主配置文件(/etc/ha.d/ha.cf)
[root@node1 ~]# vim /etc/ha.d/ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility     local0
keepalive 2
deadtime 60
warntime 20
initdead 240
udpport 694
auto_failback on
node    node0            #主node0,排列顺序越靠前越优先
node    node2            #主node2
node    node1            #备node1 
ping 192.168.32.254
respawn root /usr/lib/heartbeat/ipfail
apiauth ipfail gid=root uid=root
deadping 60
#注意:由于修改网络参数需要重启网卡,需要大量的时间,所以在此将所有时间参数设置比较长。

2.3 资源文件(/etc/ha.d/haresource)
[root@node1 ~]# cat /etc/ha.d/haresources
node0 Remac1
node2 Remac2
#备份nod0用Remac1脚本,备份node2用Remac2脚本

2.4 认证文件(/etc/ha.d/authkeys)
同node0

3 node2配置
3.1 创建网络参数修改脚本(/etc/ha.d/resource.d/Remac2)
[root@node2 ~]# cat /etc/ha.d/resource.d/Remac2 
#!/bin/bash
#discription : Start Real Server
VMAC=00:1E:68:1E:88:5E
RMAC=00:1E:68:1E:16:7E
GATEWAY=192.168.32.254
. /etc/rc.d/init.d/functions
case "$1" in
  start)
  echo "Replace eth0's Real Mac addr to Virtual Mac addr"
  /sbin/ifconfig eth0 down
  /sbin/ifconfig eth0 hw ether $VMAC
  /sbin/ifconfig eth0 up
  /sbin/ifconfig eth0 192.168.32.22 broadcast 192.168.32.255 netmask 255.255.255.0
  /bin/hostname nodevir2
  /sbin/route add default gw $GATEWAY
  ;;
  stop)
echo "Restore eth0's Real Mac addr"
  /sbin/ifconfig eth0 down
  /sbin/ifconfig eth0 hw ether $RMAC
  /sbin/ifconfig eth0 up
  /sbin/ifconfig eth0 192.168.32.32 broadcast 192.168.32.255 netmask 255.255.255.0
  /bin/hostname node2
  /sbin/route add default gw $GATEWAY
  ;;
  *)
  echo "Usage : $0 {start|stop}"
  exit 1
esac

3.2 主配置文件(/etc/ha.d/ha.cf)
[root@node1 ~]# vim /etc/ha.d/ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility     local0
keepalive 2
deadtime 60
warntime 20
initdead 240
udpport 694
auto_failback on
node    node2            #主node2,排列顺序越靠前越优先
node    node1            #备node1 
ping 192.168.32.254
respawn root /usr/lib/heartbeat/ipfail
apiauth ipfail gid=root uid=root
deadping 60
#注意:由于修改网络参数需要重启网卡,需要大量的时间,所以在此将所有时间参数设置比较长。

3.3 资源文件(/etc/ha.d/haresource)
[root@node1 ~]# cat /etc/ha.d/haresources
node2 Remac2

3.4 认证文件(/etc/ha.d/authkeys)
同node0

四、测试heartbeat的高可用功能

    如何才能得知HA集群是否正常工作,模拟环境测试是个不错的方法,在把Heartbeat高可用性集群放到生产环境中之前,需要做如下几个步骤的测试,从而确定HA是否正常工作:
1 正常关闭和重启主节点的heartbeat
  首先在主节点node1上执行“service heartbeat stop”正常关闭主节点的Heartbeat进程,此时通过ifconfig命令查看主节点网卡信息,正常情况下,应该可以看到主节点已经释放了集群的 服务IP地址,同时也释放了挂载的共享磁盘分区,然后查看备份节点,现在备份节点已经接管了集群的服务IP,同时也自动挂载上了共享的磁盘分区。
   在这个过程中,使用ping命令对集群服务IP进行测试,可以看到,集群IP一致处于可通状态,并没有任何延时和阻塞现象,也就是说在正常关闭主节点的情况下,主备节点的切换是无缝的,HA对外提供的服务也可以不间断运行。
   接着,将主节点heartbeat正常启动,heartbeat启动后,备份节点将自动释放集群服务IP,同时卸载共享磁盘分区,而主节点将再次接管集 群服务IP和挂载共享磁盘分区,其实备份节点释放资源与主节点绑定资源是同步进行的。因而,这个过程也是一个无缝切换。

2  在主节点上拔去网线
   拔去主节点连接公共网络的网线后,heartbeat插件ipfail通过ping测试可以立刻检测到网络连接失败,接着自动释放资源,而就在此时,备用节点的ipfail插件也会检测到主节点出现网络故障,在等待主节点释放资源完毕后,备用节点马上接管了集群资源,从而保证了网络服务不间断持续运行。
   同理,当主节点网络恢复正常时,由于设置了“auto_failback on”选项,集群资源将自动从备用节点切会主节点。

3 关闭主节点的系统
  在主节点拔去电源后,备用节点的heartbeat进程会立刻收到主节点已经shutdown的消息,备用节点就开始进行资源的接管,这种情况其实和主节点网络故障的现象类似。

4 让主节点系统内核崩溃
  当主节点系统崩溃后,网络也就失去了响应,那么备用节点的heartbeat进程就会立刻检测到主节点网络故障,然后进行资源切换,但是由于主节点系统内 核崩溃,导致自身不能卸载所占有的资源,例如共享磁盘分区、集群服务IP等,那么此时如果没有类似Stonith设备的话,就会出现资源争用的情况,但是 如果有Stonith备,Stonith设备会首先将故障的主节点电源关闭或者重启此节点等操作,这样就让主节点释放了集群资源,当Stonith设备 完成所有操作时,备份节点才拿到接管主节点资源的所有权,从而接管主节点的资源。
(责任编辑:IT)
------分隔线----------------------------