Heartbeat实现web服务器高可用
一、Heartbeat概述:
Heartbeat的工作原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。
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 # 起搏器
Reusable-Cluster-Components-glue--glue-1.0.9.tar.bz2 #可重复使用的群集组件
扩展: 谁管理着TCP/UDP公共服务的端口定义
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/
二、实战:使用Heartbeat实现web服务器高可用
主机名 | ip地址 | 系统 | 角色 |
docker-01 | 192.168.1.220 | CentOS Linux release 7.4.1708 (Core) | 主 |
docker-02 | 192.168.1.221 | CentOS Linux release 7.4.1708 (Core) | 备 |
docker-03 | 192.168.1.222 | CentOS Linux release 7.4.1708 (Core) | NFS |
2.准备工作:docker-01、docker-02
[root@docker-01 ha.d]# hostname docker-01 [root@docker-02 ha.d]# hostname docker-02 [root@docker-02 ha.d]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.220 docker-01 192.168.1.221 docker-02 关防火墙,关掉selinux [root@docker-02 ha.d]# setenforce 0 [root@docker-02 ha.d]# systemctl stop firewalld && systemctl disable firewalld
3、配置docker-03为NFS服务器,提供存储资源
[root@docker-03 ~]# yum install nfs-utils rpcbind [root@docker-03 ~]# mkdir /wwwdir [root@docker-03 ~]# echo 'Heartbeat web test'> /wwwdir/index.html [root@docker-03 ~]# cat /wwwdir/index.html Heartbeat web test [root@docker-03 ~]# vi /etc/exports /wwwdir 192.168.1.0/24(rw) [root@docker-03 ~]# chmod 777 -R /wwwdir/ [root@docker-03 ~]# ll -d /wwwdir/ drwxrwxrwx 2 root root 24 2月 25 20:11 /wwwdir/ [root@docker-03 ~]# systemctl start nfs [root@docker-03 ~]# systemctl enable nfs Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service. [root@docker-03 ~]# showmount -e Export list for docker-03: /wwwdir 192.168.1.0/24
4、docker-01、docker-02测试nfs 存储挂载并安装httpd web服务器(基本操作是一致)
[root@docker-01 ~]# yum install nfs-utils httpd -y [root@docker-01 ~]# systemctl start nfs [root@docker-01 ~]# showmount -e 192.168.1.222 Export list for 192.168.1.222: /wwwdir 192.168.1.0/24 [root@docker-01 ~]# mount -t nfs 192.168.1.222:/wwwdir /var/www/html/ [root@docker-01 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 19G 2.1G 17G 11% / devtmpfs 226M 0 226M 0% /dev tmpfs 237M 0 237M 0% /dev/shm tmpfs 237M 8.7M 228M 4% /run tmpfs 237M 0 237M 0% /sys/fs/cgroup /dev/sda1 247M 105M 142M 43% /boot tmpfs 48M 0 48M 0% /run/user/0 192.168.1.222:/wwwdir 19G 1.9G 17G 10% /var/www/html [root@docker-01 ~]# systemctl restart httpd [root@docker-01 ~]# systemctl enable httpd Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service. #卸载资源:后期这些资源通过heartbeat直接加载 [root@docker-01 ~]# umount /var/www/html/ [root@docker-01 ~]# systemctl stop httpd [root@docker-01 ~]# systemctl disable httpd
docker-01安装heartbeat
同步时间
[root@docker-01 ~]# crontab -l */5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com [root@docker-02 ~]# crontab -l */5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
配置主机间ssh互信,免密钥认证
5、开始安装
- 安装基础环境包:
yum install gcc gcc-c++ autoconf automake libtool glib2-devel libxml2-devel bzip2 bzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel asciidoc
- 创建用户和组
groupadd haclient
useradd -g haclient hacluster
- 下载软件包:Reusable-Components-glue、resource-agents、heartbeat
http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/958e11be8686.tar.bz2 http://hg.linux-ha.org/glue/archive/0a7add1d9996.tar.bz2 https://github.com/ClusterLabs/resource-agents/archive/v3.9.6.tar.gz
- 安装glue
tar xf 0a7add1d9996.tar.bz2 cd Reusable-Cluster-Components-glue--0a7add1d9996/ ./autogen.sh ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1' make && make install echo $? cd ..
- 安装Resource Agents
tar xf v3.9.6.tar.gz cd resource-agents-3.9.6/ ./autogen.sh ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1' make && make install echo $? cd ..
- 安装HeartBeat
tar xf 958e11be8686.tar.bz2 cd Heartbeat-3-0-958e11be8686/ ./bootstrap export CFLAGS="$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib" ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1' make && make install echo $?
- 配置网卡支持插件文件
mkdir -pv /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/ cp /usr/lib/ocf/lib/heartbeat/ocf-* /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/
#注意:一般启动时会报错因为 ping和ucast这些配置都需要插件支持 需要将lib64下面的插件软连接到lib目录 才不会抛出异常
ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec/* /usr/local/heartbeat/lib/heartbeat/plugins/RAExec/ ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/* /usr/local/heartbeat/lib/heartbeat/plugins/
#以上在docker-01上安装完成,在docker-02上执行以上同样的步骤
配置heartbeat
#拷贝三个模版配置文件到 /usr/local/heartbeat/etc/ha.d 目录下
cp doc/{ha.cf,haresources,authkeys} /usr/local/heartbeat/etc/ha.d/
配置ha.cf配置文件
#该配置文件用于配置 心跳的核心配置
[root@docker-01 ~]# cat /usr/local/heartbeat/etc/ha.d/ha.cf debugfile /var/log/ha-debug #表示调试的日志文件 一般测试建议开启 logfile /var/log/ha-log #表示系统的的日志文件路径 logfacility local0 #表示使用系统日志与上面只能开启一个 keepalive 2 #主备之间的心跳间隔时间单位:s deadtime 30 #表示如果连接对方30s还无法连接,表示节点死亡需要考虑vip转移 warntime 10 #表示10s时间未收到心跳时发出警告日志 initdead 120 #有时机器启动后需要一段时间网卡才能正常工作 需要预留一定的时间后,再开始判断心跳检测 udpport 694 #多播的udp端口 #baud 19200 #串行端口的波特率 #serial /dev/ttyS0 # Linux #串口的接口名 #serial /dev/cuaa0 # FreeBSD #serial /dev/cuad0 # FreeBSD 6.x #serial /dev/cua/a # Solaris #bcast eth0 # Linux #传播心跳的广播网卡信息 #bcast eth1 eth2 # Linux #bcast le0 # Solaris #bcast le1 le2 # Solaris #mcast eth0 225.0.0.1 694 1 0 #多播传送心跳的网卡 多播组 端口 跃点数 是否回环内传送 ucast ens33 192.168.1.220 #设置单播心跳,设置对方的ip地址,此处使用单播 auto_failback on #表示如果主机停止后,从机接管设置为on当主机从新启动后,主机立即接管vip off从机不会释放vip给主机 node docker-01 #配置主从的节点信息,要与uname -n保持一致 node docker-02 ############################################# #使用ping模式 有时当主机挂掉或者heartbeat挂掉后vip才会转移 有时出现某个进程挂掉 切换需要使用脚本 #ping模式用于测试 如果网卡ping不同 某个主机 就认为当前断网 需要转移vip #respawn root /usr/local/heartbeat/libexec/heartbeat/ipfail 表示当ping不通时 自动调用 ipfail这个脚本 #apiauth ipfail gid=haclient uid=hacluster 表示有权限操作ipfail脚本的组和用户 ############################################ ping 192.168.1.1 #通过ping网关检测心跳是否正常,仅用来测试网络 #ping组的所有主机 #ping_group group1 10.10.10.254 10.10.10.253 #respawn userid /path/name/to/run #指定与heartbeat一同启动和关闭的进程,该进程被自动监视,遇到故障则重新启动。最常用的进程是ipfail,该进程用于检测和处理网络故障,需要配合ping语句指定的ping node来检测网络连接。如果你的系统是64bit,请注意该文件的路径。 #respawn hacluster /usr/local/heartbeat/libexec/heartbeat/ipfail #apiauth ipfail gid=haclient uid=hacluster ##设置启动IPfail的用户和组
配置authkeys配置文件
#该文件表示发送心跳时 机器用于验证的key的hash算法,节点之间必须配置成一致的密码
[root@docker-01 ~]# cat /usr/local/heartbeat/etc/ha.d/authkeys auth 2 #表示使用id为2的验证 下边需要定义一个2的验证算法 2 sha1 1a2b3c #ID 2的验证加密为shal,并添加密码 或者 auth 3 3 md5 Hello! 注:auth后填序号,可任意填写,但第二行开头必须为序号名,然后为验证方式,支持三种( crc md5 sha1 )方式验证,最后面是自定义密钥。我应该选哪种验证? 如果Heartbeat运行于安全网络之上,如本例中的交叉线,可以使用crc,从资源的角度来看,这是代价最低的方法。如果网络并不安全,但也希望降低CPU使用,则使用md5。最后,如果想得到最好的认证,而不考虑CPU使用情况,则使用sha1,它在三者之中最难破解。
更改权限为600
chmod 600 /usr/local/heartbeat/etc/ha.d/authkeys
配置haresources配置文件
#该文件表示资源的管理,如果是主机,当主机启动后自动加载该文件中配置的所有启动资源,资源脚本默认在haresources同级目录下的resource.d目录下
[root@docker-01 ~]# cat /usr/local/heartbeat/etc/ha.d/haresources #指定节点主机名,和VIP地址,以双冒号分隔资源,此处以apache为例进行配置 docker-01 192.168.1.230 apache::/etc/httpd/conf/httpd.conf
docker-02上准备配置文件
#拷贝三个配置好的文件到docker-02上,只需修改ha.cf配置文件中的单播地址为对方地址即可(ucast ens33 192.168.1.220)。
安装httpd资源服务
#在两个节点上安装httpd服务并测试
yum install httpd echo "<h1>Heartbeat web test</h1>" >>/var/www/html/index.html systemctl start httpd
测试httpd服务正常后关闭httpd服务并关闭自启动
systemctl stop httpd
systemctl disable httpd
.启动服务
#启动每个节点上heartbeat服务
systemctl enable heartbeat systemctl start heartbeat ssh docker-02 'systemctl start heartbeat'
测试结果
[root@docker-01 ~]# curl 192.168.1.230 Heartbeat web test #使用heartbeat自带脚本切换主备节点 [root@docker-01 ~]# /usr/local/heartbeat/share/heartbeat/hb_standby Going standby [all]. [root@docker-01 ~]# curl 192.168.1.230 Heartbeat web test