Web HA集群部署 - Heartbeat
- 1. Heartbeat 概述
- 1.1 Heartbeat主要组成部分
- 2. 环境依赖
- 2.1 环境及组件软件
- 2.2 关闭firewalld & selinux
- 2.3 配置双机互信,SSH密钥登录
- 2.4 同步时间(以主节点时间为准)
- 2.5 配置域名解析
- 3 安装软件
- 3.1 安装基础环境包
- 3.2 创建用户和组
- 3.3 组件软件下载
- 3.4 安装gule
- 3.5 安装Resource Agents
- 3.6 安装HeartBeat
- 3.7 配置网卡支持插件文件
- 4 配置heartbeat
- 4.1 配置ha.cf配置文件
- 4.2 配置authkeys配置文件
- 4.3 配置haresources配置文件
- 4.4 从节点上准备配置文件
- 4.5 安装httpd服务
- 4.6 启动heartbeat服务
- 5 验证
- 5.1 关闭主节点
- 5.2 使用自带的脚本切换主备节点
- 6 总结
1. Heartbeat 概述
Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。通过Heartbeat我们可以实现双机热备
,以实现服务的持续性。
1.1 Heartbeat主要组成部分
Heartbeat最核心的功能是心跳监测部分和资源接管部分.心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务.Heartbea是基于主机名来切换节点,通过字符串加密来认证两台主机连接,与keepalived不同是它可以基于脚本资源切换,文件共享,是通过tcp协议对资源切换.
2. 环境依赖
2.1 环境及组件软件
- 服务器环境:
node1:192.168.71.183
node2:192.168.71.253
漂移Vip:192.168.71.254(即我们访问服务的ip) - 服务:apache
- 系统版本:CentOS Linux release 7.9.2009 (Core)
具体的实施工作在本章第三小节
2.2 关闭firewalld & selinux
关闭firewalld & selinux
[root@heartbeat-master ~]# systemctl stop firewalld
[root@heartbeat-master ~]# setenforce 0 #此为临时关闭
setenforce: SELinux is disabled
[root@heartbeat-master ~]# sed -i s#SELINUX=enforcing#SELINUX=disabled# /etc/sysconfig/selinux #此为永久关闭,下次重启机器后生效
2.3 配置双机互信,SSH密钥登录
主从节点均要配置双机互信
[root@node2 ~]# ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa
[root@node2 ~]# ssh-copy-id root@192.168.71.183
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.71.183's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.71.183'"
and check to make sure that only the key(s) you wanted were added.
[root@node2 ~]# ssh root@192.168.71.183
Last login: Wed Mar 1 03:50:06 2023 from 192.168.20.252
[root@node1 ~]# exit
2.4 同步时间(以主节点时间为准)
所有节点安装ntp
,可以选择任何一台机器当ntp时间服务器,其他的节点当时间服务器的客户端,同步服务器时间
这里我们选择node1作为时间服务器
① 所有节点安装ntp服务
[root@node1 ~]# yum install -y ntp
② node1服务器配置/etc/ntp.conf
#server 0.centos.pool.ntp.org iburst #注释内容
#server 1.centos.pool.ntp.org iburst #注释内容
#server 2.centos.pool.ntp.org iburst #注释内容
#server 3.centos.pool.ntp.org iburst #注释内容
server 127.127.1.0 #新增内容
fudge 127.127.1.0 stratum 10 #新增内容
③ node1服务器启动ntpd服务
[root@node1 ~]# systemctl start ntpd
[root@node1 ~]# systemctl status ntpd
[root@node1 ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.
④ 其他节点
[root@node2 ~]# ntpdate 192.168.71.183
1 Mar 04:08:35 ntpdate[16984]: step time server 192.168.71.183 offset -9.393691 sec
[root@node2 ~]# date
Wed Mar 1 04:08:40 EST 2023
2.5 配置域名解析
所有节点配置域名解析
[root@node2 ~]# tail -2 /etc/hosts
192.168.71.183 node1
192.168.71.253 node2
192.168.71.254 apache.org
[root@node2 ~]# ping node2
PING node2 (192.168.71.253) 56(84) bytes of data.
64 bytes from node2 (192.168.71.253): icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from node2 (192.168.71.253): icmp_seq=2 ttl=64 time=0.031 ms
3 安装软件
本节的安装及配置的内容,在所有节点
都需要操作
3.1 安装基础环境包
yum install gcc gcc-c++ autoconf automake libtool glib2-devel libxml2-devel bzip2 bzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel asciidoc -y
3.2 创建用户和组
[root@node2 ha]# groupadd haclient
[root@node2 ha]# useradd -g haclient hacluster
[root@node2 ha]# tail -1 /etc/passwd
hacluster:x:1017:1017::/home/hacluster:/bin/bash
[root@node2 ha]# tail -1 /etc/group
haclient:x:1017:
3.3 组件软件下载
官网下载地址 http://www.linux-ha.org/wiki/Downloads
Heartbeat 3.0.6
Cluster Glue 1.0.12
Resource Agents
[root@node2 ~]# wget -O Heartbeat_3.0.6.tar.bz2 http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/958e11be8686.tar.bz2
--2023-03-01 04:20:57-- http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/958e11be8686.tar.bz2
Resolving hg.linux-ha.org (hg.linux-ha.org)... 78.142.182.100
Connecting to hg.linux-ha.org (hg.linux-ha.org)|78.142.182.100|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 551953 (539K) [application/x-bzip2]
Saving to: ‘Heartbeat_3.0.6.tar.bz2’
100%[================================================================================================>] 551,953 233KB/s in 2.3s
2023-03-01 04:21:04 (233 KB/s) - ‘Heartbeat_3.0.6.tar.bz2’ saved [551953/551953]
[root@node2 ~]# wget http://hg.linux-ha.org/glue/archive/0a7add1d9996.tar.bz2
[root@node2 ~]# wget https://github.com/ClusterLabs/resource-agents/archive/v3.9.6.tar.gz
[root@node1 ha]# ll
total 2492
-rw-r--r-- 1 root root 451432 Oct 22 2015 0a7add1d9996.tar.bz2
-rw-r--r-- 1 root root 551953 Feb 28 10:54 Heartbeat_3.0.6.tar.bz2
-rw-r--r-- 1 root root 617790 Mar 1 04:41 v3.9.6.tar.gz
3.4 安装gule
[root@node1 ~]# tar xf 0a7add1d9996.tar.bz2
[root@node1 ~]# cd Reusable-Cluster-Components-glue--0a7add1d9996/
[root@node1 Reusable-Cluster-Components-glue--0a7add1d9996]#./autogen.sh
[root@node1 Reusable-Cluster-Components-glue--0a7add1d9996]#./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1'
[root@node1 Reusable-Cluster-Components-glue--0a7add1d9996]# make && make install
3.5 安装Resource Agents
[root@node1 ~]# tar xf v3.9.6.tar.gz
[root@node1 ~]# cd resource-agents-3.9.6/
[root@node1 resource-agents-3.9.6]# ./autogen.sh
[root@node1 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@node1 resource-agents-3.9.6]# make && make install
3.6 安装HeartBeat
[root@node1 ~]# tar xf Heartbeat_3.0.6.tar.bz2
[root@node1 ~]# cd Heartbeat-3-0-958e11be8686/
[root@node1 Heartbeat-3-0-958e11be8686]# ./bootstrap
[root@node1 Heartbeat-3-0-958e11be8686]# export CFLAGS="$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib"
[root@node1 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@node1 Heartbeat-3-0-958e11be8686]# make && make install
3.7 配置网卡支持插件文件
[root@node1 ha]# mkdir -pv /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/
mkdir: created directory ‘/usr/local/heartbeat/usr’
mkdir: created directory ‘/usr/local/heartbeat/usr/lib’
mkdir: created directory ‘/usr/local/heartbeat/usr/lib/ocf’
mkdir: created directory ‘/usr/local/heartbeat/usr/lib/ocf/lib’
mkdir: created directory ‘/usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/’
[root@node1 ha]# cp /usr/lib/ocf/lib/heartbeat/ocf-* /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/
#注意:一般启动时会报错因为 ping和ucast这些配置都需要插件支持 需要将lib64下面的插件软连接到lib目录 才不会抛出异常
[root@node1 ha]# ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec/* /usr/local/heartbeat/lib/heartbeat/plugins/RAExec/
‘/usr/local/heartbeat/lib/heartbeat/plugins/RAExec/*’ -> ‘/usr/local/heartbeat/lib64/heartbeat/plugins/RAExec/*’
[root@node1 ha]# ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/* /usr/local/heartbeat/lib/heartbeat/plugins/
‘/usr/local/heartbeat/lib/heartbeat/plugins/HBauth’ -> ‘/usr/local/heartbeat/lib64/heartbeat/plugins/HBauth’
‘/usr/local/heartbeat/lib/heartbeat/plugins/HBcomm’ -> ‘/usr/local/heartbeat/lib64/heartbeat/plugins/HBcomm’
‘/usr/local/heartbeat/lib/heartbeat/plugins/quorum’ -> ‘/usr/local/heartbeat/lib64/heartbeat/plugins/quorum’
4 配置heartbeat
在主节点
上配置
#拷贝三个模版配置文件到 /usr/local/heartbeat/etc/ha.d
目录下
[root@node1 ha]# cd Heartbeat-3-0-958e11be8686/
[root@node1 Heartbeat-3-0-958e11be8686]# cp doc/{ha.cf,haresources,authkeys} /usr/local/heartbeat/etc/ha.d/
4.1 配置ha.cf配置文件
该配置文件是心跳的核心配置
[root@heartbeat-master ~]# vim /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.71.253 #设置单播心跳,设置对方的ip地址,此处使用单播
auto_failback on #表示如果主机停止后,从机接管设置为on当主机从新启动后,主机立即接管vip off从机不会释放vip给主机
node node1 #配置主从的节点信息,要与uname -n保持一致
node node2
#############################################
#使用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.71.254
#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
4.2 配置authkeys配置文件
该文件表示发送心跳时 机器用于验证的key的hash算法,节点之间必须配置成一致的密码
[root@node1 ha]# cat /usr/local/heartbeat/etc/ha.d/authkeys
...
#
auth 2 #表示使用id为2的验证 下边需要定义一个2的验证算法
#1 crc
2 sha1 1a2b3c #id为2的验证加密为sha1,并添加密码
#3 md5 Hello!
[root@node1 ha]# chmod 600 /usr/local/heartbeat/etc/ha.d/authkeys #更改权限为600
4.3 配置haresources配置文件
该文件表示资源的管理,如果是主机,当主机启动后自动加载该文件中配置的所有启动资源,资源脚本默认在haresources同级目录下的resource.d目录下
指定节点主机名,和VIP地址,以双冒号分隔资源,此处以apache为例进行配置
[root@node1 ha]# tail -1 /usr/local/heartbeat/etc/ha.d/haresources
node1 192.168.71.254 apache::/etc/httpd/conf/httpd.conf
4.4 从节点上准备配置文件
拷贝三个配置好的文件到node2上,只需修改ha.cf配置文件中的单播地址为对方地址即可(ucast ens33 192.168.71.183)。
[root@node2 ha.d]# scp root@192.168.71.183:/usr/local/heartbeat/etc/ha.d/authkeys .
authkeys 100% 647 608.9KB/s 00:00
[root@node2 ha.d]# scp root@192.168.71.183:/usr/local/heartbeat/etc/ha.d/ha.cf .
ha.cf 100% 10KB 787.7KB/s 00:00
[root@node2 ha.d]# scp root@192.168.71.183:/usr/local/heartbeat/etc/ha.d/haresources .
haresources 100% 5955 4.1MB/s 00:00
[root@node2 ha.d]# ll
total 40
-rw------- 1 root root 647 Mar 1 08:26 authkeys
-rw-r--r-- 1 root root 10496 Mar 1 08:27 ha.cf
-rwxr-xr-x 1 root root 745 Mar 1 05:29 harc
-rw-r--r-- 1 root root 5955 Mar 1 08:27 haresources
drwxr-xr-x 2 root root 101 Mar 1 05:29 rc.d
-rw-r--r-- 1 root root 692 Mar 1 05:29 README.config
drwxr-xr-x 2 root root 4096 Mar 1 05:29 resource.d
-rw-r--r-- 1 root root 2112 Mar 1 05:28 shellfuncs
[root@node2 ha.d]# grep ucast ha.cf
# of nodes listed {"node ...} one of {serial, bcast, mcast, or ucast},
# What UDP port to use for bcast/ucast communication?
# ucast [dev] [peer-ip-addr]
ucast ens33 192.168.71.183
4.5 安装httpd服务
在每个节点上安装httpd服务并测试,以主节点为例
[root@node1 ~]# yum install httpd
[root@node1 ~]# echo "Welcome to svr 183." >>/var/www/html/index.html
[root@node1 ~]# systemctl start httpd
[root@node1 ~]# curl 127.0.0.1:88
Welcome to svr 183.
此处笔者服务器由于端口冲突,修改为88
测试httpd服务正常后关闭httpd服务并关闭自启动
[root@node1 ~]# systemctl stop httpd
[root@node1 ~]# systemctl disable httpd
4.6 启动heartbeat服务
启动每个节点上heartbeat服务
[root@node2 ha.d]# systemctl enable heartbeat
Created symlink from /etc/systemd/system/multi-user.target.wants/heartbeat.service to /usr/lib/systemd/system/heartbeat.service.
[root@node2 ha.d]# systemctl start heartbeat
[root@node2 ha.d]# systemctl status heartbeat
● heartbeat.service - Heartbeat High Availability Cluster Communication and Membership
Loaded: loaded (/usr/lib/systemd/system/heartbeat.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2023-03-01 08:51:29 EST; 11s ago
Main PID: 39209 (heartbeat)
...
5 验证
我们访问192.168.71.254:88
5.1 关闭主节点
关闭主节点后,刷新网页,可以看到服务是由从节点提供的
当我们再次开启主节点服务器,服务又会回到主节点提供
对于我们访问的漂移ip,会因为主节点的上下线,在主从节点间自动
切换
[root@node1 ~]# ip a
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 00:0c:29:79:08:6b brd ff:ff:ff:ff:ff:ff
inet 192.168.71.183/24 brd 192.168.71.255 scope global noprefixroute dynamic ens33
valid_lft 86347sec preferred_lft 86347sec
inet 192.168.71.254/24 brd 192.168.71.255 scope global secondary ens33:1
valid_lft forever preferred_lft forever
inet6 fe80::3872:4f8b:dbfc:1aa2/64 scope link noprefixroute
valid_lft forever preferred_lft forever
...
5.2 使用自带的脚本切换主备节点
主节点
[root@node1 ~]# /usr/local/heartbeat/share/heartbeat/hb_standby
Going standby [all].
[root@node1 ~]# ip a
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 00:0c:29:79:08:6b brd ff:ff:ff:ff:ff:ff
inet 192.168.71.183/24 brd 192.168.71.255 scope global noprefixroute dynamic ens33
valid_lft 86137sec preferred_lft 86137sec
inet6 fe80::3872:4f8b:dbfc:1aa2/64 scope link noprefixroute
valid_lft forever preferred_lft forever
...
从节点
[root@node2 ~]# ip a
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 00:0c:29:09:d2:72 brd ff:ff:ff:ff:ff:ff
inet 192.168.71.253/24 brd 192.168.71.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.71.254/24 brd 192.168.71.255 scope global secondary ens33:1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe09:d272/64 scope link
valid_lft forever preferred_lft forever
...
6 总结
整个集群通过vip提供对外服务,当主节点出现异常的时候,能够自动在从节点启动并提供服务,实现了高可用性。
我们可以部署zabbix进行监控服务器和服务的状况,并通过其他手段进行通知运维人员