heartbeat的工作原理:heartbeat最核心的包括两个。部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务
官方网站:
下载heartbeat
http://www.linux-ha.org/wiki/Download
http://www.linux-ha.org/wiki/Download
Heartbeat-3.X*版本以后被分为了4个模块,这些安装包都可以从官网:
http://www.linux-ha.org/wiki/Downloads下载得到:
目前的这些版本是:
ClusterLabs-resource-agents-v3.9.2-0-ge261943.tar.gz #集群实验资源代理
Heartbeat-3-0-7e3a82377fa8.tar.bz2 # 心跳主程序包
pacemaker-1.1.9-1512.el6.src.rpm # 起搏器
ˈpāsˌmākər 起搏器
Reusable-Cluster-Components-glue--glue-1.0.9.tar.bz2 #可重复使用的群集组件
端口号:**694**
[root@localhost ~]# cat /etc/services | grep 694**
ha-cluster 694/tcp # Heartbeat HA-cluster**
ha-cluster 694/udp # Heartbeat HA-cluster**
IANA 就是指(Internet Assigned Numbers Authority) ,Internet号分配的机构。负责对IP地址分配规划以及对TCP/UDP公共服务的端口定义。
IANA的所有任务可以大致分为三个类型:
IANA管理DNS域名根和.int,.arpa域名以及IDN(国际化域名)资源。
IANA协调全球IP和AS(自治系统)号并将它们提供给各区域Internet注册机构。
注: AS自治系统号,是BGP路由协议中的号。
IANA与各标准化组织一同管理协议编号系统。
官网:http://www.iana.org/
172.17.1.150 主web
172.17.1.152 从web
172.17.1.151 NFS
浮动资源:
准备工作:172.17.1.150 docker-01 172.17.1.152 docker-03
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME=docker-02
[root@docker-02 ~]# vim /etc/hosts
172.17.1.150 docker-01
172.17.1.151 docker-02
172.17.1.152 docker-03
[root@docker-02 ~]# iptables -F
[root@docker-02 ~]# setenforce 0
[root@docker-02 ~]# getenforce
Disabled
[root@docker-02 ~]# yum -y install nfs-utils
[root@docker-02 ~]# mkdir /wwwdir
[root@docker-02 ~]# echo 'yumweimao'> /wwwdir/index.html
[root@docker-02 ~]# cat /etc/exports
/wwwdir 172.17.1.0/20(rw)
[root@docker-02 ~]# ll -d /wwwdir/
drwxr-xr-x 2root root 40969月 2420:46 /wwwdir/
[root@docker-02 ~]# chmod 777 -R /wwwdir/
[root@docker-02 ~]# ll -d /wwwdir/
drwxrwxrwx 2root root 40969月 2420:46 /wwwdir/
启动服务发现报错
[root@docker-02 ~]# service nfs start
Starting NFS daemon: rpc.nfsd: writing fd to kernel failed: errno 111(Connection refused)
解决报错:
[root@docker-02 ~]# service rpcbind restart
[root@docker-02 ~]# service nfs restart
[root@docker-02 ~]# showmount -e #查看一下
Export list fordocker-02:
/wwwdir 172.17.1.0/20
[root@docker-03 ~]# yum install nfs-utils httpd -y
[root@docker-03 ~]# service rpcbind restart
[root@docker-03 ~]# service nfs restart
[root@docker-03 ~]# showmount -e 172.17.1.151
Export list for172.17.1.151:
/wwwdir 172.17.1.0/20
[root@docker-03 ~]# mount -t nfs 172.17.1.151:/wwwdir /var/www/html/
[root@docker-03 ~]# service httpd restart
[root@docker-03 ~]# yum install elinks -y
[root@docker-03 ~]# elinks --dump 172.17.1.152
yumweimao
[root@docker-03 ~]# umount /var/www/html/
[root@docker-03 ~]# service httpd stop
[root@docker-01 ~]# yum install nfs-utils httpd -y
[root@docker-01 ~]# service rpcbind restart
[root@docker-01 ~]# service nfs start
[root@docker-01 ~]# showmount -e 172.17.1.151
Export list for172.17.1.151:
/wwwdir 172.17.1.0/20
[root@docker-01 ~]# mount -t nfs 172.17.1.151:/wwwdir /var/www/html/
[root@docker-01 ~]# service httpd restart
[root@docker-01 ~]# yum install elinks -y
[root@docker-01 ~]# elinks --dump 172.17.1.150
yumweimao
[root@docker-01 ~]# umount /var/www/html/
[root@docker-01 ~]# service httpd stop
Heartbeat 3.0.6
Cluster Glue 1.0.12
Resource Agents 3.9.6
[root@docker-01 ~]# yum install -y bzip2 bzip2-devel gcc gcc-c++ autoconf automake libtool e2fsprogs-devel glib2-devel libxml2 libxml2-devel libtool-ltdl-devel asciidoc libuuid-devel docbook
[root@docker-01 opt]# tar xvf resource-agents-3.9.6.tar
[root@docker-01 opt]# tar -xvf 0a7add1d9996.tar.bz2
[root@docker-01 opt]# tar -xvf 958e11be8686.tar.bz2
[root@docker-01 opt]# ls
0a7add1d9996.tar.bz2 resource-agents-3.9.6
958e11be8686.tar.bz2 resource-agents-3.9.6.tar
Heartbeat-3-0-958e11be8686 Reusable-Cluster-Components-glue--0a7add1d9996
[root@docker-01 Reusable-Cluster-Components-glue--0a7add1d9996]# cd Reusable-Cluster-Components-glue--0a7add1d9996/
[root@docker-01 Reusable-Cluster-Components-glue--0a7add1d9996]# groupadd haclient #创建组
[root@docker-01 Reusable-Cluster-Components-glue--0a7add1d9996]# useradd -g haclient hacluster #创建用户
[root@docker-01 Reusable-Cluster-Components-glue--0a7add1d9996]# ./autogen.sh
[root@docker-01 Reusable-Cluster-Components-glue--0a7add1d9996]# ./configure --prefix=/usr/local/heartbeat/
[root@docker-01 Reusable-Cluster-Components-glue--0a7add1d9996]# make && make install
[root@docker-01 resource-agents-3.9.6]# cd resource-agents-3.9.6
[root@docker-01 resource-agents-3.9.6]# ./autogen.sh
[root@docker-01 resource-agents-3.9.6]# ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
[root@docker-01 resource-agents-3.9.6]# make && make install
[root@docker-01 Heartbeat-3-0-958e11be8686]# cd Heartbeat-3-0-958e11be8686/
[root@docker-01 Heartbeat-3-0-958e11be8686]# ./bootstrap
[root@docker-01 Heartbeat-3-0-958e11be8686]# export CFLAGS="$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib"
[root@docker-01 Heartbeat-3-0-958e11be8686]# ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
[root@docker-01 Heartbeat-3-0-958e11be8686]# make
[root@docker-01 Heartbeat-3-0-958e11be8686]# make install
[root@docker-01 ha.d]# cd /usr/local/heartbeat/etc/ha.d/
[root@docker-01 ha.d]# cp /opt/Heartbeat-3-0-958e11be8686/doc/{ha.cf,haresources,authkeys} .
[root@docker-01 ha.d]# chkconfig --add heartbeat
[root@docker-01 ha.d]# chkconfig heartbeat on
[root@docker-01 ha.d]# chmod 600 /usr/local/heartbeat/etc/ha.d/authkeys
[root@docker-01 ha.d]# mkdir -pv /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat
[root@docker-01 ha.d]# cp /usr/lib/ocf/lib/heartbeat/ocf-* /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/
[root@docker-01 ha.d]# ln -sv /usr/local/heartbeat/lib64/heartbeat/plugins/* /usr/local/heartbeat/lib/heartbeat/plugins/
Heartbeat的配置主要涉及到ha.cf、haresources、authkeys这三个文件。
ha.cf: 主配置文件,
haresource: 用来配置要让Heartbeat托管的服务,
authkey: 是用来指定Heartbeat的认证方式。
[root@docker-01 ha.d]# cd /usr/local/heartbeat/etc/ha.d/
[root@docker-01 ha.d]# grep -v "^#" ha.cf | grep -v "^$"
debugfile /var/log/ha-debug ##用于记录heartbeat的调试信息
logfile/var/log/ha-log ##用于记录heartbeat的日志信息
logfacilitylocal0 ##设置heartbeat的日志,这里用的是系统日志
keepalive 2 ##设定心跳(监测)时间时间为2秒
deadtime 30 ##指定若备用节点在30秒内未收到主节点心跳信号,则接管主服务器资源
warntime 10 ##指定心跳延迟的时间为10秒,10秒内备节点不能接收主节点心跳信号,即往日志写入警告日志,但不会切换服务
initdead 120 ##系统启动或重启后预留的忽略时间段,取值至少为deadtime的两倍
udpport694 ##广播/单播通讯使用的Udp端口
ucast eth0 172.17.1.152 ##采用网卡eth32的udp单播来组织心跳,ip地址为监听对方从web的ip地址
auto_failback on ##定义当主节点恢复后,是否将服务自动切回
nodedocker-01 ##主节点名称
nodedocker-03 ##备用节点名称
ping172.17.0.1 ##通过ping网关检测心跳是否正常,仅用来测试网络(网关地址)
respawn hacluster /usr/local/heartbeat/libexec/heartbeat/ipfail ##指定和heartbeat一起启动、关闭的进程
apiauth ipfail gid=haclient uid=hacluster ##设置启动IPfail的用户和组
Haresources文件用于指定双机系统的主节点、集群IP、子网掩码、广播地址及启动服务集群资源,文件每一行可包含一个或多个资源脚本名,资源间使用空格隔开,参数间使用两个冒号隔开,主节点和备份节点中资源文件haresources要完全一样。
一般格式为:
node-name network <resource-group>
node-name表示主节点的主机名,必须和ha.cf文件中指定的节点名一致。network用于设定集群的
IP地址、子网掩码和网络设备标识等。resource-group用于指定需Heartbeat托管的服务(即这些
服务可由Heartbeat来启动和关闭)。
注意:这里指定的IP地址就是集群对外服务的IP地址
如要托管这些服务,必须将服务写成可通过start/stop来启动或关闭的脚本,放到/etc/init.d/
或/etc/ha.d/resource.d/目录下,Heartbeat会根据脚本名称自动去/etc/init.d或者
/etc/ha.d/resource.d目录下找到相应脚本进行启动或关闭操作。
例:
[root@docker-01 ha.d]# grep -v "^#" haresources | grep -v "^$"
docker-01 IPaddr::172.17.1.170/20/eth0 Filesystem::172.17.1.151:/wwwdir::/var/www/html::nfs httpd #
注:docker-01是主服务器的主机名, docker-03上不需要修改。这样资源默认会加这个主机上。当docker-01坏了,docker-03会再接管。
IPaddr::172.17.1.170/20/eth0 #指定VIP及绑定到哪个网卡上
Filesystem::172.17.1.151:/wwwdir::/var/www/html::nfs #指定要挂载的存储
httpd #指定要启动的服务。这个服务必须是在/etc/init.d下或者/usr/local/heartbeat/etc/ha.d/resource.d目录下
[root@docker-01 ha.d]# grep -v "^#" authkeys | grep -v "^$"
auth 3
3md5 Hello!
注:auth后填序号,可任意填写,但第二行开头必须为序号名,然后为验证方式,支持三种( crc md5 sha1 )方式验证,最后面是自定义密钥。我应该选哪种验证?
如果Heartbeat运行于安全网络之上,如本例中的交叉线,可以使用crc,从资源的角度来看,这是代价最低的方法。如果网络并不安全,但也希望降低CPU使用,则使用md5。最后,如果想得到最好的认证,而不考虑CPU使用情况,则使用sha1,它在三者之中最难破解。
[root@docker-01 ha.d]# vim /usr/local/heartbeat/etc/ha.d/resource.d/httpd
[root@docker-01 ha.d]# cat /usr/local/heartbeat/etc/ha.d/resource.d/httpd
#!/bin/bash
servicehttpd $1
[root@docker-01 ha.d]# scp authkeys ha.cf haresources root@172.17.1.152:/usr/local/heartbeat/etc/ha.d/
[root@docker-01 ha.d]# scp -rp resource.d/httpd root@172.17.1.152:/usr/local/heartbeat/etc/ha.d/resource.d/
[root@docker-03 ha.d]# chmod 600 authkeys
[root@docker-03 ha.d]# vim ha.cf
改:
ucast eth0 172.17.1.152
为:
ucast eth0 172.17.1.150
[root@docker-01 ha.d]# cd /usr/local/heartbeat/etc/ha.d/resource.d/
[root@docker-01 resource.d]# ./IPaddr 172.171.1.170/20/eth0 start
INFO: Using calculated netmask for172.171.1.170: 255.255.240.0
DEBUG: Using calculated broadcast for172.171.1.170: 172.171.15.255
INFO: eval ifconfig eth0:0 172.171.1.170 netmask 255.255.240.0 broadcast 172.171.15.255
DEBUG: Sending Gratuitous Arp for172.171.1.170 on eth0:0 [eth0]
ARPING 172.171.1.170 from 172.171.1.170 eth0
INFO: Success
INFO: Success
[root@docker-01 ha.d]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500qdisc pfifo_fast state UP qlen 1000
link/ether 02:00:31:b2:04:17 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.150/20 brd 172.17.15.255 scope global eth0
inet 172.17.1.170/20 brd 172.17.15.255 scope global secondary eth0:0
[root@docker-01 resource.d]# ./Filesystem 172.17.1.151:/wwwdir /var/www/html/ nfs stop
INFO: Running stopfor172.17.1.151:/wwwdir on /var/www/html
INFO: Trying to unmount /var/www/html
INFO: unmounted /var/www/html successfully
INFO: Success
INFO: Success
##172.17.1.150 172.17.1.151同时启动服务
[root@docker-01 resource.d]# service heartbeat start
[root@docker-01 resource.d]# service httpd start
[root@docker-01 resource.d]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 97G 2.7G 89G 3% /
tmpfs tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/sda1 ext4 190M 52M 129M 29% /boot
172.17.1.151:/wwwdir nfs 97G 2.7G 89G 3% /var/www/html
停止其中一个服务,会自动切换到备机。
heartbeat自带的断网切换的工具-ipfailipfail断网切换的原理:关于ipfail这个断网切换的原理很简单,首先heartbeat要判断自己的网络是否正常其实就是通过ping某个ip,如果可以ping的通,说明网络是通的,如果ping不通了,说明是网络断了,或者是主服务器的网卡坏了,然后执行切换的动作。