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
原文地址:https://www.cnblogs.com/liujunjun/p/12363743.html