一、什么是 heartbeat
HA 即 (high available)高可用,又被叫做双机热备,用于关键性业务。 简单理解就是,有两台机器A和B,正常是A提供服务,B待命闲置,当A宕机或服务宕掉,会切换至B机器继续提供服务。
下面我们使用heartbeat来做HA集群,并且把nginx服务作为HA对应的服务。
二、试验准备
两个机器, 都是centos6.7,网卡eth0 ip如下:
centos 192.168.0.6 backup 192.168.0.12
hostname 设置好,分别为centos 和 backup
关闭防火墙
iptables -F
关闭selinux:
setenforce 0
vi /etc/hosts // 增加如下内容:
192.168.0.6 centos 192.168.0.12 backup
三、安装 heartbeat
两个机器都安装heartbeat / libnet
yum -y install epel-release heartbeat* libnet nginx
四、配置 heartbeat
三个主要的配置文件
1、authkeys // 节点之间认证的密匙key文件,权限为:600
2、ha.cf // 主配置文件
3、haresources // 集群资源管理配置文件
主上(centos)配置
cd /usr/share/doc/heartbeat-3.0.4/ cp authkeys ha.cf haresources /etc/ha.d/ cd /etc/ha.d
authkeys 有3种加密算法:
1、crc
2、sha1
3、md5
随便选择一种就可以了,这里就选择md5加密算法的,以下命令生成一个随机md5值
dd if=/dev/urandom bs=512 count=1 | openssl md5
vi /etc/ha.d/authkeys // 添加以下内容
auth 3 3 md5 9dba97e53862cf5873ff7297a2c4815a
chmod 600 authkeys // 更改权限
vi haresources // 加入
centos 192.168.0.100/24/eth0:0 nginx
192.168.0.100是一个虚拟IP即VIP,eth0:0是虚拟网卡,nginx是接管的服务,可写多个以空格隔开
既然nginx现在由heartbeat接管了,就不应该设置为开机启动
chkconfig --del ngninx chconfig nginx off
为什么heartbeat能够启动nginx是因为heartbeat会在以下两个位置寻找nginx的启动脚本
1. /etc/ha.d/resource.d (根据不同的安装方式可能会有不同)
2. /etc/init.d/
vi ha.cf // 改为如下内容(去掉了不常用的)
debugfile /var/log/ha-debug // heartbeat debug日志存放位置 logfile /var/log/ha-log // heartbeat 日志存放位置 logfacility local0 // 这个是设置heartbeat的日志,这里是用的系统日志 keepalive 2 // 指定心跳间隔时间为2秒(即每两秒钟在eth1上发送一次广播) deadtime 30 // 指定备用节点在30秒内没有收到主节点的心跳信号后,则立即接管主节点的服务资源 warntime 10 // 指定心跳延迟的时间为十秒。当10秒钟内备份节点不能接收到主节点的心跳信号时,就会往日志中写入一个警告日志,但此时不会切换服务 initdead 60 // 在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍 udpport 694 // 监听端口 ucast eth0 192.168.0.12 auto_failback on // 主节点恢复后自动重新接管. node centos // 主节点主机名,须和 uname -n命令的结果一样 node backup // 从节点主机名,须和 uname -n命令的结果一样 ping 192.168.0.1 // 相当于仲裁,比如:主节点不能ping通从节点,那怎么确定是从节点的问题而不是主节点的问题呢?所以这时候需要一个裁判。 respawn hacluster /usr/lib/heartbeat/ipfail // 用于检测和处理网络故障
把主上的三个配置拷贝到从上
cd /etc/ha.d/ scp authkeys ha.cf haresources backup:/etc/ha.d/
到从上(backup) 编辑 ha.cf
vi /etc/ha.d/ha.cf //只需要更改一个地方
ucast eth1 192.168.0.12
改为
ucast eth1 192.168.0.6
另外 authkeys haresources 都是需要不更改的
五、测试 heartbeat
启动heartbeat
先主,后从
service heartbeat start
检查测试
ifconfig 看是否有 eth0:0
ps aux |grep nginx 看是否有nginx进程
现在另外找台电脑ping 192.168.0.100 正常情况是一直都是ping通状态(除了防火墙禁ping)
其它比如 断电、停止heartbeat等等 ping 192.168.0.100 一直都应该是ping通状态
测试的几个方法:
主上故意禁ping:
iptables -I INPUT -p icmp -j DROP
主上停止heartbeat服务
service heartbeat stop
主上关机
poweroff
主上非正常结束heartbeat
killall -9 heartbeat
手动切换:
sh /usr/share/heartbeat/hb_standby
主动通知对方( 我 )已经待机,让对方接管。
还有就是 heartbeat 并不处理进程,比如主上的nginx挂了,但是 heartbeat没有问题,网络也没有问题,那么nginx不会自动重启,也不会切换到从上面去。