您的位置:首页 > 运维架构 > 网站架构

heartbeat实现web高可用

2015-07-31 14:44 561 查看
heartbeat 概述:

官方网站:http://www.linux-ha.org/
下载 heartbeat:http://www.linux-ha.org/wiki/Download

下载得到: 目前的这些版本是:
Heartbeat-3-0-7e3a82377fa8.tar.bz2 # 心跳主程序包
Reusable-Cluster-Components-glue--glue-1.0.9.tar.bz2 #可重复使用的群集组件

端口号:694

[root@silence81 ~]# vim /etc/services


扩展: 谁管理着 TCP/UDP 公共服务的端口定义

IANA 就是指(Internet Assigned Numbers Authority) ,Internet 号分配的机构。负责对 IP 地址分 配规划以及对 TCP/UDP 公共服务的端口定义。
官网:http://www.iana.org/

IANA 的所有任务可以大致分为三个类型:
一、域名。IANA 管理 DNS 域名根和.int,.arpa 域名以及 IDN(国际化域名)资源。
二、数字资源。IANA 协调全球 IP 和 AS(自治系统)号并将它们提供给各区域 Internet 注册机构。 注: AS 自治系统号,是 BGP 路由协议中的号。(管理国家跟国家之间的流量)
三、协议分配。IANA 与各标准化组织一同管理协议编号系统。



silence80 主 web
silence84 从 web
silence81 NFS

浮动资源:
1. 公网 IP 地址
2. HTTP 服务
3. 存储:NFS 挂载

准备工作:silence80,silence84
1. 修改主机名,永久生效
# vim /etc/sysconfig/network
HOSTNAME=silence80
2. 解析
# vim /etc/hosts
192.168.1.80silence80
192.168.1.84silence84

3. 关防火墙,关掉 selinux
# iptables -F
# getenforce
Permissive

配置 silence81 为 NFS 服务器,提供存储资源 安装 NFS 服务器

[root@silence81 ~]# rpm -qf /etc/init.d/nfs nfs-utils-1.2.3-15.el6.x86_64

[root@silence81 ~]# mkdir /wwwdir
[root@silence81 ~]# echo "heartbeathttpha" > /wwwdir/index.html
[root@silence81 ~]#cat /etc/exports
/wwwdir192.168.1.0/24(rw)
配置好目录权限:
[root@silence81 ~]# ll -d /wwwdir/
drwxr-xr-x 2 root root 4096 May 29 18:52 /wwwdir/ [root@silence81 ~]# chmod 777 -R /wwwdir/ [root@silence81 ~]# ll -d /wwwdir/
drwxrwxrwx 2 root root 4096 May 29 18:52 /wwwdir/

开启 nfs 服务
[root@silence81 ~]# service nfs restart

[root@silence81 ~]# chkconfig nfs on

silence80 测试 nfs 存储挂载并安装 httpd web 服务器:

[root@silence80 ~]# yum install httpd -y
[root@silence80 ~]# showmount -e 192.168.1.81
Export list for 192.168.1.81:
/wwwdir 192.168.1.0/24
[root@silence80 ~]# mount -t nfs 192.168.1.81:/wwwdir /var/www/html/ [root@silence80 ~]# service httpd restart

测试:
[root@silence80 ~]# yum install elinks -y
[root@silence80 ~]# elinks --dump 192.168.1.80
heartdeat http ha

卸载资源:后期这些资源通过 heartbeat 直接加载
[root@silence80 ~]# umount /var/www/html/
[root@silence80 ~]# service httpd stop
[root@silence80 ~]# chkconfig httpd off

silence84 测试 nfs 存储挂载并安装 httpd web 服务器:

[root@silence84 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=silence84
[root@silence80 ~]# scp /etc/hosts 192.168.1.84:/etc/
root@192.168.1.84's password:
hosts100% 2130.2KB/s00:00

[root@silence84 ~]# yum install httpd -y
[root@silence84 ~]# showmount -e 192.168.1.81
Export list for 192.168.1.81:
/wwwdir 192.168.1.0/24

[root@silence84 ~]# mount -t nfs 192.168.1.81:/wwwdir /var/www/html/
[root@silence84 ~]# service httpd restart
测试:
[root@silence84 ~]# yum install elinks -y
[root@silence84 ~]# elinks --dump 192.168.1.84 heartdeat http ha
heartdeat http ha

卸载资源:后期这些资源通过 heartbeat 直接加载
[root@silence84 ~]# umount /var/www/html/
[root@silence84 ~]# service httpd stop
[root@silence84 ~]# chkconfig httpd off

silence80 安装 heartbeat
配置好 yum 源:
[root@silence80 ~]# cat /etc/yum.repos.d/rhel-source.repo
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source baseurl=file:///mnt/
enabled=1 gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[rhel-ha] name=Red ha baseurl=file:///mnt/HighAvailability enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[root@silence80 ~]#
#说明,如果不配置这个 baseurl=file:///mnt/HighAvailabilit ,则无法使用 yum 安装 cluster-glue和 resource-agents
centos 6.2 或6.5 的源里 cluster-glue、resource-agents、pacemaker 都有,就是没有 heartbeat。 幸好 heartbeat 的 source 里提供了.spec 可以用 rpmbuild 来生成 rpm 包。

接下来,安装 heartbeat

上传 Heartbeat-3-0-7e3a82377fa8.tar.bz2 到 silence80 上
[root@silence80 ~]# tar -jxvf Heartbeat-3-0-958e11be8686.tar.bz2
[root@silence80 ~]# cd Heartbeat-3-0-958e11be8686
[root@silence80 Heartbeat-3-0-958e11be8686]# rpmbuild -ba heartbeat-fedora.spec # 虽然报了错,但是帮你生成了目录:/root/rpmbuild/SOURCES/ 。如你系统本身就有此目录,可以直 接拷贝这个压缩包到这个目录
error: File /root/rpmbuild/SOURCES/heartbeat.tar.bz2: No such file or directory

生成/root/rpmbuild/SOURCES/heartbeat.tar.bz2 文件:
[root@silence80Heartbeat-3-0-958e11be8686]#tar-jxvf /root/Heartbeat-3-0-958e11be8686.tar.bz2 -C /root/rpmbuild/SOURCES/
[root@silence80 Heartbeat-3-0-958e11be8686]# cd /root/rpmbuild/SOURCES/
[root@silence80 SOURCES]# mv Heartbeat-3-0-958e11be8686 heartbeat #一定要改为heartbeat,否则编译包的时候回报错
[root@silence80SOURCES]#tar-jcvfheartbeat.tar.bz2heartbeat#生成heartbeat.tar.bz2 软件包,如果直接使用源码包,生成 rpm 包时,会报错。
如:
[root@silence80 SOURCES]# cd /root/rpmbuild/SOURCES/heartbeat/ [root@silence80 heartbeat]# rpmbuild -ba heartbeat-fedora.spec
error: File /root/rpmbuild/SOURCES/heartbeat.tar.bz2: No such file or directory

# 解决依赖

[root@silence80 SOURCES]# yum install ncurses-devel openssl-devel gettext bison flex mailx cluster-glue-libs-devel docbook-dtds docbook-style-xsl libtool-ltdl-devel libuuid-devel -y

# 开始生成 RPM 包
参数:rpmbuild 参数 (-bb 只编译二进制 rpm 包 -bs 只编译源码 srpm 包 -ba 同时编译二进制和 源码 srpm 包)
[root@silence80 SOURCES]# pwd
/root/rpmbuild/SOURCES
[root@silence80 SOURCES]# cd heartbeat
[root@silence80 heartbeat]# rpmbuild -ba heartbeat-fedora.spec

在 silence80 和 silence84 上都安装:heartbeat

在 silence80 上安装:heartbeat

[root@silence80 ~]# cd /root/rpmbuild/RPMS/x86_64/
[root@silence80 x86_64]# yum install -y cluster-glue resource-agents
[root@silence80 x86_64]# rpm -ivh heartbeat-libs-3.0.6-1.el6.x86_64.rpm
[root@silence80 x86_64]# rpm -ivh heartbeat-3.0.6-1.el6.x86_64.rpm

silence84 上都安装:heartbeat

把软件包和 yum 配置文件拷贝到 silence84 上:

[root@silence80 ~]#cd /root/rpmbuild/RPMS/x86_64/
[root@silence80 ~]# scp -r ./* 192.168.1.84:/root/
[root@silence80~]#scp/etc/yum.repos.d/rhel-source.repo
192.168.1.84:/etc/yum.repos.d/

silence84 配置:heartbeat
[root@silence84 ~]# yum install ncurses-devel openssl-devel gettext bison flex mailx cluster-glue-libs-devel docbook-dtds docbook-style-xsl -y
[root@silence84 ~]# rpm -ivh heartbeat-libs-3.0.5-1.el6.x86_64.rpm
[root@silence84 ~]# yum install -y cluster-glue resource-agents
[root@silence84 ~]# rpm -ivh heartbeat-3.0.6-1.el6.x86_64.rpm

查看生成的用户和组:

[root@silence80 ha.d]# grep haclient /etc/group haclient:x:489:
[root@silence80 ha.d]# id hacluster
uid=495(hacluster) gid=489(haclient) groups=489(haclient)

配置 heartbeat :silence80

生成 heartbeat 配置文件

在 silence80 上配置好 3 个配置文件,然后拷给 silence84 即可。 生成配置文件:
[root@silence80 x86_64]# cp /usr/share/doc/heartbeat-3.0.6/ha.cf /etc/ha.d/ #主配置文件
[root@silence80 ~]# cp /usr/share/doc/heartbeat-3.0.6/authkeys /etc/ha.d/ #主备节点 间通信时所使用的验证文件,保证安全性
[root@silence80 ~]# cp /usr/share/doc/heartbeat-3.0.6/haresources /etc/ha.d/ #定义浮动资源的配置文件

1、设置主备节点间通信时所使用的验证文件,保证安全性。主备节点配置要求一致。
[root@silence80 ~]# vim /etc/ha.d/authkeys
改:
#auth 3
#1 crc
#2 sha1 HI!
#3 md5 Hello!
为:
auth 3
#1 crc
#2 sha1 HI!
3 md5 mkkey
查看:
[root@silence80 ~]# grep ^[^#] /etc/ha.d/authkeys
auth 3
3 md5 Hello!
[root@silence80 ~]# chmod 600 /etc/ha.d/authkeys #此文件权限必须是 600,否则启动不成功

注:
/etc/ha.d/authkeys 文件决定了认证密钥。共有三种认证方式:crc,md5,和 sha1。 互动:“我应该用哪个方法呢?”
如果 Heartbeat 运行于安全网络之上,如本例中的交叉线,可以使用 crc,从资源的角度来看,这是代 价最低的方法。如果网络并不安全,但也希望降低 CPU 使用,则使用 md5。最后,如果想得到最好的认 证,而不考虑 CPU 使用情况,则使用 sha1,它在三者之中最难破解。

2.定义浮动资源,注意添加的顺序,::表示分隔符

[root@silence80 ~]#vim /etc/ha.d/haresources
改:
44 #node-name resource1 resource2 ... resourceN
为:
silence80 IPaddr::192.168.1.88/24/eth0 Filesystem::192.168.1.81:/wwwdir::/var/www/html::nfs httpd

注:
node-name 填的是主服务器的主机名。 silence84 上不需要修改。这样资源默认会加一这个主机 上。当 silence80 坏了,silence84 会再接管。
IPaddr::192.168.1.88/24/eth0 #指定 VIP 及绑定到哪个网卡上
Filesystem::192.168.1.81:/wwwdir::/var/www/html::nfs #指定要挂载的存储
httpd #指定要启动的服务。 注,这个服务必须是/etc/init.d 下,可以通过 service 去启动或关闭

测试: 手动加载 VIP 192.168.1.88 到 eth0:0 上

[root@silence80 ~]# ll /etc/ha.d/resource.d/IPaddr

-rwxr-xr-x 1 root root 2273 Jul 29 20:49 /etc/ha.d/resource.d/IPaddr

[root@silence80 ~]# /etc/ha.d/resource.d/IPaddr 192.168.1.88/24/eth0:0 start

IPaddr[7142]: INFO: Using calculated netmask for 192.168.1.88: 255.255.255.0
IPaddr[7142]: DEBUG: Using calculated broadcast for 192.168.1.88: 192.168.1.255
IPaddr[7142]: INFO: eval ifconfig eth0:0 192.168.1.88 netmask 255.255.255.0 broadcast
192.168.1.255
IPaddr[7142]: DEBUG: Sending Gratuitous Arp for 192.168.1.88 on eth0:0 [eth0] ARPING 192.168.1.88 from 192.168.1.88 eth0
IPaddr[7116]: INFO: Success
INFO: Success

查看 VIP:
[root@silence80 x86_64]# ifconfig#可以看到 eth0:0 的 IP 为:192.168.1.88

测试: 手动加载 NFS 存储资源到/var/www/html
[root@silence80~]#/etc/ha.d/resource.d/Filesystem192.168.1.81:/wwwdir
/var/www/html/ nfs start
Filesystem[23575]: INFO: Running start for 192.168.1.81:/wwwdir on /var/www/html
Filesystem[23567]: INFO: Success
INFO: Success
[root@silence80 ~]# ls /var/www/html/index.html
/var/www/html/index.html
[root@silence80 ~]# mount
.....
192.168.1.81:/wwwdiron/var/www/htmltypenfs
(rw,vers=4,addr=192.168.1.81,clientaddr=192.168.1.80)

测试: 手动启动 httpd 服务
[root@silence80 ~]# /etc/init.d/httpd restart

3.定义/etc/ha.d/ha.cf
[root@silence80 ~]# grep ^[^#] /etc/ha.d/ha.cf #默认只开启了以下两行内容
logfacilitylocal0 auto_failback on
#auto_failback on #为 on 时,主结点恢复正常后,资源自动转给主结点。 建议设为 auto_failback off ,等主节点恢复正常后,在业务不繁忙时,切换回来。防止主节点恢复正常时,回切时,再次影起网 络中断。

[root@silence80 ha.d]# vim /etc/ha.d/ha.cf#将配置文件中,以下内存前面的#号去掉
24 debugfile /var/log/ha-debug
29 logfile /var/log/ha-log
48 keepalive 2 #设定 heartbeat 之间的时间间隔为 2 秒。
56 deadtime 30 #在 30 秒后宣布节点死亡。
61 warntime 10 #在日志中发出“late heartbeat“警告之前等待的时间,单位为秒。
71 initdead 120#在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项 用于解决这种情况产生的时间间隔。取值至少为 deadtime 的两倍。

76 udpport 694 #使用端口 694 进行 bcast 和 ucast 通信。这是默认的,并且在 IANA 官方注册的端 口号。
121 ucast eth0 192.168.1.84 #表示从本机的 eth0 接口发心跳消息给对方节点,写另一端的 IP 地址 。 这是单播地址。 silence84 上改为 192.168.1.80 。心跳网卡 ,如果你有两个网卡,可以写成 eth1 注:配置文件中 91 #bcast eth0#表示在 eth0 接口上使用广播 heartbeat(将 eth1 替换为 eth0, eth2,或者您使用的任何接口)。

157 auto_failback on#当 auto_failback 设置为 on 时,一旦主节点重新恢复联机,将从从节点取回 所有资源。若该选项设置为 off,主节点便不能重新获得资源。
211 nodesilence80 #该选项是必须配置的。集群中机器的主机名,不“uname –n”的输 出相同。
212 nodesilence84
这两行内容大约在此位置:




改:223 #ping 10.10.10.254
为:223 ping 192.168.1.1#通过 ping 命令来实现仲裁 改:256 #respawn hacluster /usr/lib/heartbeat/ipfail
为:256 respawn hacluster /usr/libexec/heartbeat/ipfail 改:262 #apiauth ipfail gid=haclient uid=hacluster
为: apiauth ipfail gid=haclient uid=hacluster

到此修改结束,保存,退出。

[root@silence80 x86_64]# rpm -qf /usr/libexec/heartbeat/ipfail#查看这个包是哪个软件包 安装生成的
heartbeat-3.0.6-1.el6.x86_64

复制配置文件到 silence84 上:
[root@node1 ha.d]# cd /etc/ha.d/
[root@silence80 ha.d]# scp ha.cf haresources authkeys 192.168.1.84:/etc/ha.d/
root@192.168.1.84's password:

ha.cf100%10KB10.3KB/s00:00
haresources100% 60075.9KB/s00:00
authkeys100% 6420.6KB/s00:00

silence84 上配置 heartbeat

[root@silence84 ~]# chmod 600 /etc/ha.d/authkeys #此文件必须是 600 否则 heartbeat 启动 不成功

#修改单播地址

[root@silence84 ~]# vim /etc/ha.d/ha.cf

改:
ucast eth0 192.168.1.84
为:
ucast eth0 192.168.1.80

两机器启动 heartbeat 服务:
[root@silence80 ~]# /etc/init.d/heartbeat restart
[root@silence84 ~]# /etc/init.d/heartbeat restart
Stopping High-Availability services:[ OK ]
Waiting to allow resource takeover to complete:[ OK ]
#等待资源接管完成。 takeover 接管。 当启动停留在这个界面时,silence84 会接管所有浮动资源。 等下面启动成功时,silence84 会释放资源,浮云资源,再次加载。
Starting High-Availability services: IPaddr[27857]: INFO: Resource is stopped [ OK ]

查看端口号:
[root@silence80 ~]# netstat -antup | grep 694
udp00 0.0.0.0:6940.0.0.0:*6895/heartbeat: wr

查看端口号:
[root@silence84 ~]# netstat -antup | grep 694
udp00 0.0.0.0:6940.0.0.0:*6895/heartbeat: wr

在 silence80 查看集群资源:
[root@silence80 ~]# ifconfig
.....
eth0:0Link encap:Ethernet HWaddr 00:0C:29:12:EC:1E
inet addr:192.168.1.88 Bcast:192.168.1.255 Mask:255.255.255.0

[root@silence80 ~]# df -h
.....
/dev/sr03.4G 3.4G0 100% /mnt
192.168.1.81:/wwwdir 9.7G 3.4G 5.8G 37% /var/www/html
[root@silence80 ~]# /etc/init.d/httpd status httpd (pid 23641) is running...
silence84 上查看,没有任务浮动资源:
[root@silence84 ~]# ifconfig
[root@silence84 ~]# df -h
[root@silence80 ~]# /etc/init.d/httpd status httpd is stopped

测试:

两台主机都开启时,所有请求到转到了 silence80 上。访问:http://192.168.1.88/ 正常


当掉 silence80,关闭网卡,等 30 秒钟,所有请求都转到 silence84 上了

[root@silence80 ha.d]# ifdown eth0

[root@silence84 ~]# ifconfig
...
eth0:0Link encap:Ethernet HWaddr 00:0C:29:48:80:95
inet addr:192.168.1.88 Bcast:192.168.1.255 Mask:255.255.255.0 [root@silence84 ~]# df -h
...
192.168.1.81:/wwwdir 9.7G 3.4G 5.8G 37% /var/www/html
[root@silence84 ~]# service httpd status
httpd (pid 6375) is running...

silence80 上把 eth0 网卡再次开启:
[root@silence80 ~]# ifup eth0
等 30 秒后,查看:
[root@silence80 ~]# df -h
...
192.168.1.81:/wwwdir 9.7G 3.4G 5.8G 37% /var/www/html#已经加载了 httpd 资源
[root@silence80 ~]# service httpd status
httpd (pid 27097) is running...
[root@silence80 ~]# ifconfig
。。。
eth0:0Link encap:Ethernet HWaddr 00:0C:29:12:EC:1E
inet addr:192.168.1.88 Bcast:192.168.1.255 Mask:255.255.255.0

资源已经回切过来。

在 silence84 上查看释放资料:
[root@silence84 ~]# ifconfig#查看不到 eth0:0 192.168.1.88 这个 IP 地址
[root@silence84 ~]# df -h
FilesystemSize Used Avail Use% Mounted on
/dev/sda29.7G 3.7G 5.5G 41% /
tmpfs569M0 569M0% /dev/shm
/dev/sda1194M28M 157M 15% /boot
/dev/sr03.4G 3.4G0 100% /mnt
[root@silence84 ~]# service httpd status
httpd is stopped

扩展:
heartbeat 自带的断网切换的工具-ipfail ipfail 断网切换的原理

关于 ipfail 这个断网切换的原理很简单,首先 heartbeat 要判断自己的网络是否正常其实就是通过 ping某个 ip,如果可以 ping 的通,说明网络是通的,如果 ping 不通了,说明是网络断了,或者是主服务器的网卡坏了,然后执行切换的动作。

ping 一个 group 的 ipfail 配置:
ping-groupipfail :
ping_group groupll72.16.103.254 172.16.103.212

end!
本文出自 “枯木知深秋” 博客,请务必保留此出处http://kmzsq.blog.51cto.com/10542759/1680520
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: