heartbeat实现web服务器高可用

1、heartbeat概述

heartbeat的工作原理:heartbeat最核心的包括两个。部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务

官方网站:

下载heartbeat

http://www.linux-ha.org/wiki/Download

2、下载heartbeat

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**

3、谁管理着TCP/UDP公共服务的端口定义

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

IANA的所有任务可以大致分为三个类型:

3.1域名。

IANA管理DNS域名根和.int,.arpa域名以及IDN(国际化域名)资源。

3.2数字资源。

IANA协调全球IP和AS(自治系统)号并将它们提供给各区域Internet注册机构。

注: AS自治系统号,是BGP路由协议中的号。

3.3协议分配。

IANA与各标准化组织一同管理协议编号系统。

官网:http://www.iana.org/

4、使用heartbeat实现web服务器高可用

172.17.1.150 主web

172.17.1.152 从web

172.17.1.151 NFS

浮动资源:

公网IP地址

HTTP服务

存储:NFS挂载 172.17.1.151 docker-02

准备工作:172.17.1.150 docker-01 172.17.1.152 docker-03

4.1 修改主机名,永久生效

 [root@localhost ~]# vim /etc/sysconfig/network
 HOSTNAME=docker-02

4.2 解析(三台主机共同配置)

 [root@docker-02 ~]# vim /etc/hosts
 172.17.1.150 docker-01
 172.17.1.151 docker-02
 172.17.1.152 docker-03

4.3 关防火墙,关掉selinux

 [root@docker-02 ~]# iptables -F
 [root@docker-02 ~]# setenforce 0
 [root@docker-02 ~]# getenforce 
 Disabled

5、配置docker-02为NFS服务器,提供存储资源

5.1安装NFS服务器:3台主机均安装

 [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)

5.2配置好目录权限:

 [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/

5.3开启nfs服务并解决启动报错问题

 启动服务发现报错
 [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

5.4测试172.17.1.152nfs 存储挂载并安装httpd web服务器

 [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

5.5卸载资源:后期这些资源通过heartbeat直接加载

 [root@docker-03 ~]# umount /var/www/html/
 [root@docker-03 ~]# service httpd stop

6、测试172.17.1.150nfs 存储挂载并安装httpd web服务器

6.1安装NFS服务器

 [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

6.2卸载资源:后期这些资源通过heartbeat直接加载

 [root@docker-01 ~]# umount /var/www/html/
 [root@docker-01 ~]# service httpd stop

7、安装172.17.1.150 172.17.1.152 heartbeat

7.1下载:http://www.linux-ha.org/wiki/Downloads,从官方下载最新的HeartBeat版本:

Heartbeat 3.0.6

Cluster Glue 1.0.12

Resource Agents 3.9.6

7.2安装依赖包(172.17.1.150 172.17.1.152)

 [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 

7.3编译Cluster Glue(172.17.1.150 172.17.1.152)

 [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

7.4编译Resource Agents(172.17.1.150 172.17.1.152)

 [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

7.5编译Heartbeat(172.17.1.150 172.17.1.152)

 [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

7.6生成配置文件(172.17.1.150 172.17.1.152)

 [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/

8、配置Heartbeat

Heartbeat的配置主要涉及到ha.cf、haresources、authkeys这三个文件。

ha.cf: 主配置文件,

haresource: 用来配置要让Heartbeat托管的服务,

authkey: 是用来指定Heartbeat的认证方式。

8.1配置ha.cf----主配置文件

 [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的用户和组

8.2 配置haresources-----资源文件

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目录下

8.3配置authkeys-----心跳密钥验证文件

 [root@docker-01 ha.d]# grep -v "^#" authkeys | grep -v "^$"
 auth 3
 3md5 Hello!

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

如果Heartbeat运行于安全网络之上,如本例中的交叉线,可以使用crc,从资源的角度来看,这是代价最低的方法。如果网络并不安全,但也希望降低CPU使用,则使用md5。最后,如果想得到最好的认证,而不考虑CPU使用情况,则使用sha1,它在三者之中最难破解。

8.4编写httpd启动脚本

 [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

8.5复制配置文件至备机

 [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/

8.6备机172.17.1.152上配置heartbeat

 [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

9、测试:

 [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

停止其中一个服务,会自动切换到备机。

10、扩展

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

原文发布于微信公众号 - 运维猫(centos15)

原文发表时间:2019-09-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券