linux 双机热备 配置笔记

本文将以 linux nginx 高可用为目标,研究并记录双机热备的配置方法:

【主要步骤借鉴这篇文章】 链接
一、设置主机名方法:
1. 设置临时主机名,重启后会失效
# hostname new_name

2.查看hostname的设置,包含静态主机名,临时主机名
# hostnamectl

3.替换 /etc/hostname
hostnamectl set-hostname new_name

4.为了使用DNS解析能识别到新主机名,需要修改 /etc/hosts
把 localhost.localdomain 替换为 new_name

5.修改这个文件里的hostname:
/etc/sysconfig/network

6.要保持hosts文件的主机名和uname -n 显示的要一致
如果不一致,要修改:/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hamaster

主: hamaster
从: haslave

网络环境:
vmware新加一张 VMnet 2 host-only 网卡,用来做心跳网卡
主机  物理网卡ip  192.168.76.160   心跳网卡ip  192.168.73.128
备机  物理网卡ip  192.168.76.128   心跳网卡ip  192.168.73.129
vip是 192.168.76.100

二、设置IP
1. 复制的虚拟机要在关机状态下,另外生成一个MAC地址
2. 可以用 ip a 代替 ifconfig 查看系统IP信息,ip a 显示的信息更为简洁
3. 新建网卡子接口,添加对外提供服务的IP:
新建文件 /etc/sysconfig/network-scripts/ifcfg-ens33:0,文件内容为:
DEVICE=ens33:0
IPADDR=192.168.76.100
PREFIX=24
ONPARENT=yes

重启网络服务后,ip a 可以看到类似如下内容,即为子接口添加成功

2: ens33: mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:50:56:3d:5e:d3 brd ff:ff:ff:ff:ff:ff
inet 192.168.76.128/24 brd 192.168.76.255 scope global noprefixroute dynamic ens33
valid_lft 1658sec preferred_lft 1658sec
inet 192.168.76.100/24 brd 192.168.76.255 scope global secondary noprefixroute ens33:0
valid_lft forever preferred_lft forever

三、master 和 slave 之间交换公钥添加免密互相
1. 生成密钥对:ssh-keygen -t rsa -P ”
2. 上传公钥: ssh-copy-id -i .ssh/*pub root@haslave

四、主从时间同步:
ssh haslave ‘date’;date

五、安装依赖:
yum install perl-TimeDate net-snmp-libs libnet PyXML
yum -y install pcre pcre-devel zlib zlib-devel

下载 Nginx 源码:
wget http://nginx.org/download/nginx-1.18.0.tar.gz

创建nginx用户:
useradd -s /sbin/nologin -M nginx (参数M表示不创建 home 目录)

编译安装nginx:
[root@hamaster nginx-1.18.0]# ./configure –prefix=/usr/local/nginx –user=nginx –group=nginx
[root@hamaster nginx-1.18.0]# make && make install

将 /usr/local/nginx/sbin 添加到 PATH 环境变量中,使得 nginx 命令可被搜索到
执行 nginx 后,应能在浏览器中正常访问到 nginx 欢迎页面

下载 heatbeat 源码:
访问:http://www.linux-ha.org/wiki/Downloads
wget http://hg.linux-ha.org/glue/archive/0a7add1d9996.tar.bz2
wget http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/958e11be8686.tar.bz2

mv 0a7add1d9996.tar.bz2 ClusterGlue-1.0.12.tar.bz2
mv *8686.tar.bz2 Heartbeat-3.0.6.tar.bz2

tar -jxvf ClusterGlue-1.0.12.tar.bz2 (其中j表示解压bz2包)
tar -jxvf Heartbeat-3.0.6.tar.bz2
到这里发现参考文章中下载的 heartbeat.tar.gz 里面的文件是 rpm 文件,作者直接针对这些rpm文件: yum -y install *
但我没有找到这些 rpm 文件的下载地址,直接源码编译可能会遇到比较多的依赖性问题,作为其它方式,我参考了 heartbeat 官网用户手册说的:http://www.linux-ha.org/doc/users-guide/_fedora_rhel_and_centos.html
[yum 安装 heartbeat 参考文档]
执行命令:yum install heartbeat cluster-glue
官网还提到安装这个组件: yum install resource-agents pacemaker (暂时先不安装)

这里遇到 yum 提示找不到 package 的问题:解决方法
cd /etc/yum.repos.d
wget http://mirrors.aliyun.com/repo/Centos-7.repo
mv CentOS-Base.repo CentOS-Base.repo.bak (备份旧仓库)
mv Centos-7.repo CentOS-Base.repo (起用新仓库)
执行yum源更新命令:
yum clean all
yum makecache
yum update

[yum安装epel源]
yum install epel-release (EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux. 比如,我们在安装heartbeat,keepalive包的时候,就需要这个源)
yum install heartbeat 就可以安装成功。

【安装heatbeat的进度卡在 yum install heartbeat 提示找到包】
使用 搜索发现:
https://stackoverflow.com/questions/59323091/heartbeat-package-not-found-centos 这个帖子有人说:Heartbeat is considered deprecate since RHEL7 / CentOS7,即CentOS7 不再有 Heartbeat 的安装源。

无奈,只能考虑用编译源代码的方式进行安装:
关于源码编译,知乎这篇文章看着不错:https://zhuanlan.zhihu.com/p/149269593
根据官方文档:http://www.linux-ha.org/doc/users-guide/_building_and_installing_heartbeat_from_source.html
安装组件是有依赖关系的,需要按如下顺序的:
cluster-glue
heartbeat

网上的教程大都说的是要安装这3个包,但其实第2个包的安装并没有在heartbeat的安装手册中有提及:
Cluster Glue ##可重复使用的群集组件##
Resource Agents ##集群实验资源代理##
Heartbeat ##心跳检测主程序包##

==============================================================
可以编译安装成功的操作步骤:
【这一行如果没有执行,make 会提示 not rule to all】
yum install -y bzip2 autoconf automake libtool glib2-devel libxml2-devel bzip2-devel libtool-ltdl-devel asciidoc libuuid-devel

1.安装Cluster Glue
# tar -jxvf 0a7add1d9996.tar.bz2
# cd Reusable-Cluster-Components-glue–0a7add1d9996/
# groupadd haclient
# useradd -g haclient hacluster
# ./autogen.sh
# ./configure –prefix=/usr/local/heartbeat/
# make && make install

2.安装Resource Agents
# tar xf v3.9.6.tar.gz
# cd resource-agents-3.9.6/
# ./autogen.sh
# export CFLAGS=”$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib”
# ./configure –prefix=/usr/local/heartbeat/
ln -s /usr/local/heartbeat/lib/* /lib/ 将生成的动态库 添加快捷方式到/lib下
ln -s /usr/local/heartbeat/lib/* /lib64/ 在make过程中需要在lib下找到Cluster Glue的so文件
# make && make install

3. 安装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/
# vi /usr/local/heartbeat/include/heartbeat/glue_config.h
/*define HA_HBCONF_DIR “/usr/local/heartbeat/etc/ha.d/”*/ #把这一行用/**/注释掉 未注释的错误信息/usr/local/heartbeat/include/heartbeat/glue_config.h:105:0: error: “HA_HBCONF_DIR” redefined [-Werror]
# make && make install

# 建立软链接:
# 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/

# 配置 heartbeat:
cp -R /usr/local/heartbeat/etc/ha.d /usr/local/heartbeat/etc/ha.d-bak-yyyymmdd
[root@haslave ha.d]# cp /root/download/Heartbeat-3-0-958e11be8686/doc/authkeys /usr/local/heartbeat/etc/ha.d/
[root@haslave ha.d]# cp /root/download/Heartbeat-3-0-958e11be8686/doc/ha.cf /usr/local/heartbeat/etc/ha.d/
[root@haslave ha.d]# cp /root/download/Heartbeat-3-0-958e11be8686/doc/haresources /usr/local/heartbeat/etc/ha.d/

chmod 600 authkeys

修改 authkeys:

uth 3
#1 crc
#2 sha1 HI!
3 md5 Hello!

修改 ha.cf:

debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
ucast eth0 172.16.10.111 #此处需要修改 设置另一台机器的ip 网卡 0 或者 1 的ip
auto_failback on
node ha1 #此处默认为master机器的hostname 需要自己手动修改
node ha2 #此处默认为slave机器的hostname
ping 172.16.10.1 # 此处设置自己的网关
ping 172.16.10.1
respawn hacluster /usr/local/heartbeat/libexec/heartbeat/ipfail #此处我就写了一行 看别的资料有写两行、三行的 ,我在日志看到有报错就写了一行。
apiauth ipfail gid=haclient uid=hacluster
#ucast 后面的ip 分别为对方的ip

修改 haresources文件:
/usr/local/heartbeat/etc/ha.d/resource.d 存放要纳管到高可靠捉住范围的服务的启动脚本,比如: tomcat 服务, haresources 会读取这个目录下的服务进行高可靠维护
haresources文件内容:
ha1 IPaddr::172.16.10.99/24/eth0:0
#对应格式 :
master主机名 IPaddr ::vip/掩码/网卡0或者1:0 此处vip指对外提供服务的IP:192.168.76.100

假设 resource.d下有两个启动shell: tomcat redis,则haresources在主备机上的配置内容分别为:
主:hamaster IPaddr::192.168.76.100/24/ens33 tomcat redis
备: hamaster IPaddr::192.168.76.100/24/ens33 tomcat redis

# 较好:文章链接1
# 文章链接2
# 较好:文章链接3

2021-05-16 更新:
1. service heartbeat start失败,/var/log/ha-debug 报错:
May 16 16:47:16 haslave heartbeat: [90933]: ERROR: Illegal directive [ucast] in /usr/local/heartbeat/etc/ha.d/ha.cf
May 16 16:47:16 haslave heartbeat: [90933]: ERROR: Illegal directive [ping] in /usr/local/heartbeat/etc/ha.d/ha.cf
May 16 16:47:16 haslave heartbeat: [90933]: ERROR: Illegal directive [ping] in /usr/local/heartbeat/etc/ha.d/ha.cf
May 16 16:47:16 haslave heartbeat: [90933]: ERROR: Heartbeat not started: configuration error.
May 16 16:47:16 haslave heartbeat: [90933]: ERROR: Configuration error, heartbeat not started.

网上说的解决办法:
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/
即:在目录 /usr/local/heartbeat/lib/heartbeat/plugins/ 下新建软链接分别指向这个目录下的所有文件 /usr/local/heartbeat/lib64/heartbeat/plugins/

然而在我的环境中,存在: /usr/local/heartbeat/lib/heartbeat/plugins/RAExec, 不存在 /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec
所以我的做法是在 /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec 下新建软链接,分别指向 /usr/local/heartbeat/lib/heartbeat/plugins/RAExec 下面的所有文件
操作命令为:
mkdir /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec
ln -svf /usr/local/heartbeat/lib/heartbeat/plugins/RAExec/* /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec
ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/* /usr/local/heartbeat/lib/heartbeat/plugins
返回的信息: RAExec 无法创建软链接,属于预期中的结果,正常
‘/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’
ln: ‘/usr/local/heartbeat/lib/heartbeat/plugins/RAExec’: cannot overwrite directory
‘/usr/local/heartbeat/lib/heartbeat/plugins/tiebreaker’ -> ‘/usr/local/heartbeat/lib64/heartbeat/plugins/tiebreaker’

这时再次执行 service heartbeat start, 这时 /var/log/ha-debug.log 打印的日志看上去就是正常启动的日志:
May 16 18:06:00 haslave heartbeat: [96208]: info: Pacemaker support: false
May 16 18:06:00 haslave heartbeat: [96208]: WARN: Logging daemon is disabled –enabling logging daemon is recommended
May 16 18:06:00 haslave heartbeat: [96208]: info: **************************
May 16 18:06:00 haslave heartbeat: [96208]: info: Configuration validated. Starting heartbeat 3.0.6
May 16 18:06:00 haslave heartbeat: [96208]: info: heartbeat: version 3.0.6
May 16 18:06:00 haslave heartbeat: [96208]: WARN: No Previous generation – starting at 1621159561
May 16 18:06:00 haslave heartbeat: [96208]: info: Heartbeat generation: 1621159561
May 16 18:06:00 haslave heartbeat: [96208]: info: No uuid found for current node – generating a new uuid.
May 16 18:06:00 haslave heartbeat: [96208]: info: Creating FIFO /usr/local/heartbeat/var/lib/heartbeat/fifo.
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: write socket priority set to IPTOS_LOWDELAY on ens33
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: bound send socket to device: ens33
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: set SO_REUSEPORT(w)
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: set SO_REUSEADDR
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: bound receive socket to device: ens33
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: set SO_REUSEPORT
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: started on port 694 interface ens33 to 192.168.73.128
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ping heartbeat started.
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ping heartbeat started.
May 16 18:06:00 haslave heartbeat: [96208]: info: Local status now set to: ‘up’
May 16 18:06:00 haslave heartbeat: [96208]: info: Link 192.168.73.1:192.168.73.1 up.
May 16 18:06:00 haslave heartbeat: [96208]: info: Status update for node 192.168.73.1: status ping

==============================================================

【参考来源】
介绍得比较好的配置案例:
链接

【2008年写的基于heartbeat-2.1.3.tar.gz源码编译的环境搭建过程】
包含用户及组的创建,drbd的配合
http://blog.itpub.net/100091/viewspace-1007515/

【Linux 下安装及配置heartbeat】
即 heartbeat 配置文件详解

不同文章对比:

文章一: 基于 drdb 和 heartbeat
使用 drbd 对 2台linux特定分区做数据同步,结合 heartbeat 实现资源的统一调度

文章二: 使用HeartBeat实现高可用HA的配置过程详解
使用 heartbeat 来做 HA 集群,并且把 nginx 服务作为 HA 对应的服务。