[关闭]
@zhanjindong 2014-03-19T13:15:37.000000Z 字数 5299 阅读 3977

Linux-HA实战(1)— Heartbeat安装

内容


接触Heartbeat主要是因为之前项目中使用了TFS,最近想给nameserver做HA,因为TFS官方用的Heartbeat,所以刚好了解下,参考了网络上很多内容,这里简单记录下。

环境和软件包

我的机器是两台64位的CentOS,其它Linux机器应该差不多可以参考官方的说明。

从Heartbeat 2.1.4之后原先的项目被拆分成了三个子项目:cluster-glueresource-agentsheartbeat,导致了配置更加复杂。下面列出了我使用的各个软件包版本并提供了下载(后面具体安装提供了官方的下载地址,这里自己做个备份)。

Heartbeat源码安装

  1. # yum install gcc gcc-c++ autoconf automake libtool glib2-devel libxml2-develbzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel make wget docbook-dtds docbook-style-xsl
  1. # groupadd haclient
  2. # useradd -g haclient hacluster -M -s /sbin/nologin
  1. # yum install libaio-devel
  1. # wget http://hg.linux-ha.org/glue/archive/glue-1.0.9.tar.bz2
  2. # tar jxvf glue-1.0.9.tar.bz2
  3. # cd Reusable-Cluster-Components-glue--glue-1.0.9/
  4. # ./autogen.sh
  5. # ./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat libdir=/usr/local/heartbeat/lib64 LIBS='/lib64/libuuid.so.1'
  6. # make & make install l

resource-agents为集群资源的访问提供了一系列标准的接口。

  1. # wget https://codeload.github.com/ClusterLabs/resource-agents/zip/v3.9.2
  2. # unzip v3.9.2
  3. # cd resource-agents-3.9.2/
  4. # ./autogen.sh
  5. # ./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat libdir=/usr/local/heartbeat/lib64 CFLAGS=-I/usr/local/heartbeat/include LDFLAGS=-L/usr/local/heartbeat/lib64 LIBS='/lib64/libuuid.so.1'
  6. //建立一个软连接,避免编译时找不到所需要的包
  7. # ln -s /usr/local/heartbeat/lib64/* /lib64/

注意:LDFLAGS的空格,否则configure时不会报错但make时报错。

  1. # wget http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/7e3a82377fa8.tar.bz2
  2. # tar jxvf 7e3a82377fa8.tar.bz2
  3. # cd Heartbeat-3-0-7e3a82377fa8/
  4. # ./bootstrap
  5. # ./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat CFLAGS=-I/usr/local/heartbeat/include LDFLAGS=-L/usr/local/heartbeat/lib64 LIBS='/lib64/libuuid.so.1'
  6. # vi /usr/local/heartbeat/include/heartbeat/glue_config.h
  7. // 删除 glue_config.h 最后一行定义的配置文件路径,避免编译时产生的路径重复定义错误,Shift+g 跳到末行,dd删除
  8. # make && make install

将配置文件复制到 /etc/heartbeat/ 下,并使用sed 修改路径

  1. # cp doc/ha.cf /etc/heartbeat/ha.d/
  2. # cp doc/haresources /etc/heartbeat/ha.d/
  3. # cp doc/authkeys /etc/heartbeat/ha.d/
  4. # chkconfig --add heartbeat
  5. # chkconfig heartbeat on
  6. # chmod 600 /etc/heartbeat/ha.d/authkeys
  7. # sed -i 's#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g' /etc/heartbeat/ha.d/shellfuncs
  8. # sed -i 's#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g' /etc/heartbeat/ha.d/resource.d/hto-mapfuncs
  9. # sed -i 's#/usr/lib/ocf#/usr/local/heartbeat/usr/lib/ocf#g' /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/ocf-shellfuncs
  1. # ln -s /usr/local/heartbeat /usr/lib/ocf

2.3.1.2 Heartbeat配置

Heartbeat的配置主要涉及到ha.cf、haresources、authkeys这三个文件。其中ha.cf是主配置文件,haresource用来配置要让Heartbeat托管的服务,authkey是用来指定Heartbeat的认证方式,具体参考:http://ixdba.blog.51cto.com/2895551/548625

需要注意几点:

  1. # auth 1 //认证序号1
  2. # 1 md5 password //序号1 采用MD5 后面是密钥

auth 后面填写序号,可任意填写,但第二行开头必须为序号名,然后为验证方式,支持三种( crc md5 sha1 )方式验证,最后面是自定义密钥。

  1. # chmod 600 /etc/heartbeat/ha.d/authkeys
  1. # scp –r node1:/etc/heartbeat/ha.d/* /etc/heartbeat/ha.d/
  2. //node1为主节点的主机名(uname -n)

测试

  1. # vi /etc/heartbeat/ha.d/resource.d/test1

输入如下内容:

  1. #!/bin/bash
  2. logger $0 called with $1
  3. case "$1" in
  4. start)
  5. # Start commands go here
  6. echo "start!!!";
  7. ;;
  8. stop)
  9. # Stop commands go herer
  10. echo "stop!!!";
  11. ;;
  12. status)
  13. # Status commands go here
  14. echo "status!!!";
  15. ;;
  16. esac

增加相应的权限:

  1. # chmod 755 test1

使用下面的命令可以执行该脚本:

  1. # ./test1 start

此处输入图片的描述

  1. # vi /etc/heartbeat/ha.d/haresources
  2. # 输入下面的内容
  3. # ydhl-test1 test1

其中ydhl-test1为uname –n输出的结果。

  1. debugfile /var/log/ha-debug
  2. # 用于记录heartbeat的调试信息
  3. logfile /var/log/ha-log
  4. # 用于记录heartbeat的日志信息
  5. logfacility local0
  6. keepalive 2
  7. # 设置心跳间隔
  8. watchdog /dev/watchdog
  9. deadtime 30
  10. # 在30秒后宣布节点死亡
  11. warntime 10
  12. # 在日志中发出“late heartbeat“警告之前等待的时间,单位为秒
  13. initdead 120
  14. # 网络启动时间
  15. udpport 694
  16. # 广播/单播通讯使用的udp端口
  17. #baud 19200
  18. #serial /dev/ttyS0
  19. # 使用串口heartbeat
  20. bcast eth0
  21. # 使用网卡eth0发送心跳检测
  22. auto_failback on
  23. # 当主节点从故障中恢复时,将自动切换到主节点
  24. watchdog /dev/watchdog
  25. # 该指令是用于设置看门狗定时器,如果节点一分钟内都没有心跳,那么节点将重新启动
  26. node HA-01
  27. node HA-02
  28. # 集群中机器的主机名,与“uname –n”的输出相同。
  29. ping 192.168.0.254
  30. # ping 网关或路由器来检测链路正常
  31. respawn hacluster /usr/local/heartbeat/lib64/heartbeat/ipfail
  32. # respawn调用 ipfail 来主动进行切换
  33. apiauth ipfail gid=haclient uid=hacluster
  34. # 设置启动ipfail的用户和组

现在两台机器上分别安装ntpdate
然后让一台机器指向另一台就可以了:

  1. # ntpdate 192.168.71.51

在启动之前用下面的命令在主从节点上面测试一下配置是否正确,ReourceManager在Heartbeat安装目录的share/heartbeat目录下。

  1. # ./ResourceManager listkeys `/bin/uname -n`
  2. 测试通过后启动主节点和从节点Heartbeat
  3. # service heartbeat start

通过查看 /var/log/messages可以看到Hearbeat的很多信息:
此处输入图片的描述

可以看到我们前面的测试脚本test1输出的信息。

当通过service heartbeat stop命令停止一个节点的Heartbeat的时候,从日志中可以看到另外一个节点已经感知到了:
此处输入图片的描述

重启后可以看到:

此处输入图片的描述

FAQ

A 为什么在/var/log/messages里看到很多下面这样的警告?

此处输入图片的描述

Q 这种情况是因为部署Heartbeat是直接从其它机器上拷贝过来导致的。直接拷过来会导致两个节点上的uuid冲突,解决方法是强制某个Hearbeat重新生成uuid,先停止Heatbeat然后删除hb_uuid这个文件(可以通过find命令查找)重启就好了:

  1. # rm –rf /usr/local/heartbeat/var/lib/heartbeat/hb_uuid

A 什么是“脑裂”问题?

Q 采用keepalive等心跳软件,需要注意“脑裂”问题:
“在“双机热备”高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障,2个节点上的HA软件像“裂脑人”一样,“本能”地争抢“共享资源”、争起“应用服务”,就会发生严重后果:或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。

参考链接

http://czmmiao.iteye.com/blog/1180851

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注