玩转企业集群运维管理系列(十四):Heartbeat 高可用集群部署

2023-12-19 18:46:32 浏览数 (2)

环境准备

内核参数及操作系统版本

代码语言:javascript复制
[root@heartbeat-master etc]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@heartbeat-master etc]# uname -r
3.10.0-693.el7.x86_64
双节点互备集群
  • heartbeat-masterens33 192.168.200.17
  • heartbeat-backupens33 192.168.200.18
  • VIP 192.168.200.241
前提条件准备

两台机器都做,以下以主节点为例。

1.关闭firewalld
代码语言:javascript复制
[root@heartbeat-master ~]# systemctl stop firewalld
2.关闭selinux
代码语言:javascript复制
[root@heartbeat-master ~]# setenforce 0 #此为临时关闭,最好永久关闭
setenforce: SELinux is disabled
[root@heartbeat-master ~]# sed -i s#SELINUX=enforcing#SELINUX=disabled# /etc/sysconfig/selinux #此为永久关闭,需重启机器
3.同步时间(以主节点时间为准)

安装ntp(所有节点)

代码语言:javascript复制
#注意!!选择任何一台机器当ntp时间服务器,其他的节点当时间服务器的客户端跟服务器同步时间
我选择的是heartbeat-master上:
[root@heartbeat-master ~]# yum install -y ntp
[root@heartbeat-master ~]# vim /etc/ntp.conf  #有4行server的位置,把那4行server行注释掉,填写以下两行
server 127.127.1.0 # local clock
fudge  127.127.1.0 stratum 10[root@heartbeat-master ~]# systemctl start ntpd
[root@heartbeat-master ~]# systemctl status ntpd

其他所有节点:
# yum install ntpdate  -y
# ntpdate 192.168.200.17  #该IP为时间服务器ip
4.配置主机名
代码语言:javascript复制
[root@heartbeat-master ~]# hostnamectl set-hostname heartbeat-master
5.配置主机间ssh互信,免密钥认证
代码语言:javascript复制
[root@heartbeat-master ~]# ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa  
[root@heartbeat-master ~]# ssh-copy-id root@192.168.200.18
6.配置域名解析
代码语言:javascript复制
[root@heartbeat-master ~]# tail -2 /etc/hosts
192.168.200.17 heartbeat-master
192.168.200.18 heartbeat-backup

注意:节点2(heartbeat-backup)也需要同样进行配置。更多关于企业集群运维管理系列的学习文章,请参阅:玩转企业集群运维管理专栏,本系列持续更新中。

开始安装

写在前面:第三部分两台机器都要做,这里以heartbeat-master为例。

1.安装基础环境包
代码语言:javascript复制
[root@heartbeat-master ~]# yum install gcc gcc-c   autoconf automake libtool glib2-devel libxml2-devel bzip2 bzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel asciidoc -y
2.创建用户和组
代码语言:javascript复制
[root@heartbeat-master ~]# groupadd haclient
[root@heartbeat-master ~]# useradd -g haclient hacluster
3.下载软件包

下载下来的安装包名字很奇怪,不要管他,全部下载完然后解压出来,名字就是正常的了。附官网下载地址:http://www.linux-ha.org/wiki/Downloads。

代码语言:javascript复制
[root@heartbeat-master ~]# wget http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/958e11be8686.tar.bz2   #heartbeat3.0.6
[root@heartbeat-master ~]# wget http://hg.linux-ha.org/glue/archive/0a7add1d9996.tar.bz2   #Cluster Glue 1.0.12
[root@heartbeat-master ~]# wget https://github.com/ClusterLabs/resource-agents/archive/v3.9.6.tar.gz   #Resource Agents 3.9.6
4.安装glue
代码语言:javascript复制
[root@heartbeat-master ~]# tar xf 0a7add1d9996.tar.bz2
[root@heartbeat-master ~]# cd Reusable-Cluster-Components-glue--0a7add1d9996/
[root@heartbeat-master Reusable-Cluster-Components-glue--0a7add1d9996]#./autogen.sh
[root@heartbeat-master 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@heartbeat-master Reusable-Cluster-Components-glue--0a7add1d9996]# make && make install
[root@heartbeat-master Reusable-Cluster-Components-glue--0a7add1d9996]# echo $?
[root@heartbeat-master Reusable-Cluster-Components-glue--0a7add1d9996]# cd ..
5.安装Resource Agents
代码语言:javascript复制
[root@heartbeat-master ~]# tar xf v3.9.6.tar.gz
[root@heartbeat-master ~]# cd resource-agents-3.9.6/
[root@heartbeat-master resource-agents-3.9.6]# ./autogen.sh
[root@heartbeat-master 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@heartbeat-master resource-agents-3.9.6]# make && make install
[root@heartbeat-master resource-agents-3.9.6]# echo $?
[root@heartbeat-master resource-agents-3.9.6]# cd ..
6.安装HeartBeat
代码语言:javascript复制
[root@heartbeat-master ~]# tar xf 958e11be8686.tar.bz2
[root@heartbeat-master ~]# cd Heartbeat-3-0-958e11be8686/
[root@heartbeat-master Heartbeat-3-0-958e11be8686]# ./bootstrap
[root@heartbeat-master Heartbeat-3-0-958e11be8686]# export CFLAGS="$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib"
[root@heartbeat-master 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@heartbeat-master Heartbeat-3-0-958e11be8686]# make && make install
[root@heartbeat-master Heartbeat-3-0-958e11be8686]# echo $?
7.配置网卡支持插件文件
代码语言:javascript复制
[root@heartbeat-master ~]# mkdir -pv /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/
[root@heartbeat-master ~]# cp /usr/lib/ocf/lib/heartbeat/ocf-* /usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/
#注意:一般启动时会报错因为 ping和ucast这些配置都需要插件支持 需要将lib64下面的插件软连接到lib目录 才不会抛出异常
[root@heartbeat-master ~]# ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec/* /usr/local/heartbeat/lib/heartbeat/plugins/RAExec/
[root@heartbeat-master ~]# ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/* /usr/local/heartbeat/lib/heartbeat/plugins/
#以上在节点1上安装完成,在节点2上执行以上同样的步骤,此处省略...

配置heartbeat(在主节点上配置)

代码语言:javascript复制
#拷贝三个模版配置文件到 /usr/local/heartbeat/etc/ha.d 目录下
[root@heartbeat-master ~]# cp doc/{ha.cf,haresources,authkeys} /usr/local/heartbeat/etc/ha.d/
1.配置ha.cf配置文件
代码语言:javascript复制
#该配置文件用于配置 心跳的核心配置

[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.200.18 #设置单播心跳,设置对方的ip地址,此处使用单播
auto_failback on #表示如果主机停止后,从机接管设置为on当主机从新启动后,主机立即接管vip off从机不会释放vip给主机
node  heartbeat-master #配置主从的节点信息,要与uname -n保持一致
node  heartbeat-backup
#############################################
#使用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.200.2
#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
2.配置authkeys配置文件
代码语言:javascript复制
#该文件表示发送心跳时 机器用于验证的key的hash算法,节点之间必须配置成一致的密码
[root@heartbeat-master ~]#  vim /usr/local/heartbeat/etc/ha.d/authkeys
auth 2 #表示使用id为2的验证 下边需要定义一个2的验证算法
2 sha1 1a2b3c #ID 2的验证加密为shal,并添加密码

#更改权限为600
[root@heartbeat-master ~]#  chmod 600 /usr/local/heartbeat/etc/ha.d/authkeys
3.配置haresources配置文件

该文件表示资源的管理,如果是主机,当主机启动后自动加载该文件中配置的所有启动资源,资源脚本默认在haresources同级目录下的resource.d目录下。

代码语言:javascript复制
[root@heartbeat-master ~]#  vim /usr/local/heartbeat/etc/ha.d/haresources
#指定节点主机名,和VIP地址,以双冒号分隔资源,此处以apache为例进行配置
heartbeat-master 192.168.200.241 apache::/etc/httpd/conf/httpd.conf
4.节点2上准备配置文件
代码语言:javascript复制
#拷贝三个配置好的文件到节点2上,只需修改ha.cf配置文件中的单播地址为对方地址即可(ucast ens33 192.168.200.17)。

[root@heartbeat-master ~]#  cd /usr/local/heartbeat/etc/ha.d/
[root@heartbeat-master ~]#  scp authkeys ha.cf haresources root@192.168.200.18:/usr/local/heartbeat/etc/ha.d/
5.安装httpd资源服务
代码语言:javascript复制
#在每个节点上安装httpd服务并测试,以主节点为例

[root@heartbeat-master ~]#  yum install httpd
[root@heartbeat-master ~]#  echo "<h1>heartbeat-master</h1>" >>/var/www/html/index.html
[root@heartbeat-master ~]#  systemctl start httpd
[root@heartbeat-master ~]#  curl 192.168.200.17

测试httpd服务正常后关闭httpd服务并关闭自启动

[root@heartbeat-master ~]#  systemctl stop httpd
[root@heartbeat-master ~]#  systemctl disable httpd
6.启动服务(两台机器都要启动)
代码语言:javascript复制
#启动每个节点上heartbeat服务
[root@heartbeat-master ~]#  systemctl enable heartbeat
[root@heartbeat-master ~]#  systemctl start heartbeat
7.测试结果

启动heartbeat之后会自动生成VIP。

代码语言:javascript复制
[root@heartbeat-master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host
      valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
   link/ether 00:0c:29:ba:60:47 brd ff:ff:ff:ff:ff:ff
   inet 192.168.200.17/24 brd 192.168.200.255 scope global ens33
      valid_lft forever preferred_lft forever
   inet 192.168.200.241/24 brd 192.168.200.255 scope global secondary ens33:0
      valid_lft forever preferred_lft forever
   inet6 fe80::d7b2:b60e:698e:8d66/64 scope link
      valid_lft forever preferred_lft forever
然后访问VIP测试
代码语言:javascript复制
[root@heartbeat-master ~]# curl 192.168.200.241
<h1>master</h1>
[root@heartbeat-master ~]# curl 192.168.200.241
<h1>master</h1>
[root@heartbeat-master ~]# curl 192.168.200.241
<h1>master</h1>
[root@heartbeat-master ~]# curl 192.168.200.241
<h1>master</h1>
使用自带的脚本切换主备节点
代码语言:javascript复制
[root@heartbeat-master ~]# /usr/local/heartbeat/share/heartbeat/hb_standby
Going standby [all].
[root@heartbeat-master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host
      valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
   link/ether 00:0c:29:ba:60:47 brd ff:ff:ff:ff:ff:ff
   inet 192.168.200.17/24 brd 192.168.200.255 scope global ens33
      valid_lft forever preferred_lft forever
   inet6 fe80::d7b2:b60e:698e:8d66/64 scope link
      valid_lft forever preferred_lft forever
[root@heartbeat-backup ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host
      valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
   link/ether 00:0c:29:e5:39:89 brd ff:ff:ff:ff:ff:ff
   inet 192.168.200.18/24 brd 192.168.200.255 scope global ens33
      valid_lft forever preferred_lft forever
   inet 192.168.200.241/24 brd 192.168.200.255 scope global secondary ens33:0
      valid_lft forever preferred_lft forever #VIP已经漂移过来了
   inet6 fe80::5529:86c6:c984:1138/64 scope link
      valid_lft forever preferred_lft forever
   inet6 fe80::d7b2:b60e:698e:8d66/ scope link tentative dadfailed
      valid_lft forever preferred_lft forever

在进行访问发现节点已经切换

代码语言:javascript复制
[root@heartbeat-master ~]# curl 192.168.200.241

更多关于企业集群运维管理系列的学习文章,请参阅:玩转企业集群运维管理专栏,本系列持续更新中。

Heartbeat 配置文件详解

Heartbeat脚本的默认目录
  • /etc/init.d/
  • /etc/ha.d/resource.d/
Heartbeat配置文件

Heartbeat的默认配置文件目录为/etc/ha.d。Heartbeat常用的配置文件有三个,ha.cf、authkey、haresource。

ha.cf
代码语言:javascript复制
Ha.cf       #Heartbeat参数配置文件 在这里配置heartbeat的一些基本参数。
Authkey     #Heartbeat认证文件 高可用服务器对之间根据对端的authkey,对对端进行认证。
Haresource  #Heartbeat资源配置文件 如配置IP资源及脚本程序等。

下面对ha.cf文件的每个选项进行详细介绍

代码语言:javascript复制
logfile /var/log/ha-log 
#指定heartbeat的日志存放位置
crm yes 
#是否开启Cluster Resource Manager(集群资源管理)功能
bcast eth1 
#指明心跳方式使用以太广播方式,并且是在eth1接口上进行广播
keepalive 2 
#指定心跳间隔时间为2秒(即每两秒钟在eth1上发送一次广播)
deadtime 30 
#指定备用节点在30秒内没有收到主节点的心跳信号后,则立即接管主节点的服务资源
warntime 10 
#指定心跳延迟的时间为十秒。当10秒钟内备份节点不能接收到主节点的心跳信号时,就会往日志中写入一个警告日志,但此时不会切换服务。
initdead 120 
#在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。
udpport 694 
#设置广播通信使用的端口,694为默认使用的端口号
baud 19200 
#设置串行通信的波特率。
serial /dev/ttyS0 
#选择串行通信设备,用于双机使用串口线连接的情况。如果双机使用以太网连接,则应该关闭该选项。
auto_failback on 
#用来定义当主节点恢复后,是否将服务自动切回,heartbeat的两台主机分别为主节点和备份节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交给备份节点并由备份节点运行服务。在该选项设为on的情况下,一旦主节点恢复运行,则自动获取资源并取代备份节点,如果该选项设置为off,那么当主节点恢复后,将变为备份节点,而原来的备份节点成为主节点。
Stonith baytech /etc/ha.d/conf/stonith.baytech 
#stonith的主要作用是使出现问题的节点从集群环境中脱离,进而释放集群资源,避免两个节点争用一个资源的情形发生。保证共享数据的安全性和完整性。
watchdog /dev/watchdog 
#该选项是可选配置,是通过Heartbeat来监控系统的运行状态。使用该特性,需要在内核中载入”softdog”内核模块,用来生成实际的设备文件,如果系统中没有这个内核模块,就需要指定此模块,重新编译内核。编译完成输入”insmod softdog”加载该模块。然后输入”grep misc /proc/devices”(应为10),输入”cat /proc/misc |grep watchdog”(应为130)。最后,生成设备文件:”mknod /dev/watchdog c 10 130” 。即可使用此功能。
node node1 
#主节点主机名,可以通过命令“uanme –n”查看。
node node2 
#备用节点主机名。
ping 192.168.60.1 
#选择ping的节点,ping 节点选择的越好,HA集群就越强壮,可以选择固定的路由器作为ping节点,但是最好不要选择集群中的成员作为ping节点,ping节点仅仅用来测试网络连接。
respawn hacluster /usr/lib/heartbeat/ipfail 
#该选项是可选配置,列出与heartbeat一起启动和关闭的进程,该进程一般是和heartbeat集成的插件,这些进程遇到故障可以自动重新启动。最常用的进程是ipfail,此进程用于检测和处理网络故障,需要配合ping语句指定的ping node来检测网络的连通性。其中hacluster表示启动ipfail进程的身份。
资源文件(/etc/ha.d/haresources)

Haresources 文件用于指定双机系统的主节点、集群IP、子网掩码、广播地址以及启动的服务等集群资源,文件每一行可以包含一个或多个资源脚本名,资源之间使用空格隔开,参数之间使用两个冒号隔开,在两个HA节点上该文件必须完全一致,此文件的一般格式为:

代码语言:javascript复制
node-name network
#node-name 表示主节点的主机名,必须和ha.cf文件中指定的节点名一致,network用于设定集群的IP地址、子网掩码、网络设备标识等,需要注意的是,这里指定的IP地址就是集群对外服务的IP地址,resource-group用来指定需要heartbeat托管的服务,也就是这些服务可以由heartbeat来启动和关闭,如果要托管这些服务,必须将服务写成可以通过start/stop来启动和关闭的脚步,然后放到/etc/init.d/或者/etc/ha.d/resource.d/目录下,heartbeat会根据脚本的名称自动去/etc/init.d或者/etc/ha.d/resource.d/目录下找到相应脚步进行启动或关闭操作。
认证文件(/etc/ha.d/authkeys)

authkeys文件用于设定heartbeat的认证方式,共有三种可用的认证方式:crc、md5和sha1,三种认证方式的安全性依次提高,但是占用的系统资源也依次增加。如果heartbeat集群运行在安全的网络上,可以使用crc方式,如果HA每个节点的硬件配置很高,建议使用sha1,这种认证方式安全级别最高,如果是处于网络安全和系统资源之间,可以使用md5认证方式。这里我们使用crc认证方式,设置如下:

代码语言:javascript复制
auth 1
1 crc

#2 sha1 sha1_any_password
#3 md5 md5_any_password

需要说明的一点是:无论auth后面指定的是什么数字,在下一行必须作为关键字再次出现,例如指定了“auth 6”,下面一定要有一行“6 认证类型”。最后确保这个文件的权限是600(即-rw——-)。

heartbeat源码安装脚本

代码语言:javascript复制
#!/usr/bin/bash
set -u

dir=/tmp/heartbeat
function prepare {
dir=/tmp/heartbeat

[ -d $dir ]||  mkdir $dir
url=https://gitee.com/hcak-wu/Heartbeat_source_install/raw/master/Cluster-Glue-1.0.12.tar.gz
wget -O $dir/Cluster-Glue-1.0.12.tar.gz  $url
url=https://gitee.com/hcak-wu/Heartbeat_source_install/raw/master/Heartbeat-3.0.6.tar.gz
wget -O $dir/Heartbeat-3.0.6.tar.gz  $url
url=https://gitee.com/hcak-wu/Heartbeat_source_install/raw/master/resource-agents-3.9.6.tar.gz
wget -O $dir/resource-agents-3.9.6.tar.gz  $url

cd $dir
tar xf Cluster-Glue-1.0.12.tar.gz
tar xf Heartbeat-3.0.6.tar.gz
tar xf resource-agents-3.9.6.tar.gz
yum install -y gcc gcc-c   autoconf automake libtool glib2-devel libxml2-develbzip2-devel 
e2fsprogs-devel libxslt-devel libtool-ltdl-devel make wget docbook-dtds docbook-style-xsl bzip2-devel asciidoc libuuid-devel

groupadd haclient
useradd -g haclient hacluster -M -s /sbin/nologin
}

prepare
cd $dir/Cluster-Glue-1.0.12
./autogen.sh
./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat libdir=/usr/local/heartbeat/lib64
make -j4 && make install
[ "$?" -ne 0  ]&& echo "Cluster-Glue 安装出错!!"&& exit 1

cd $dir/resource-agents-3.9.6
./autogen.sh
./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat libdir=/usr/local/heartbeat/lib64 CFLAGS=-I/usr/local/heartbeat/include LDFLAGS=-L/usr/local/heartbeat/lib64
ln -s /usr/local/heartbeat/lib64/* /lib64/
make -j4 && make install
[ "$?" -ne 0  ]&& echo "resource-agents-3.9.6  安装出错!!"&& exit 1

cd $dir/Heartbeat-3.0.6
./bootstrap
./configure --prefix=/usr/local/heartbeat --sysconfdir=/etc/heartbeat CFLAGS=-I/usr/local/heartbeat/include  LDFLAGS=-L/usr/local/heartbeat/lib64
sed -i "$ d"  /usr/local/heartbeat/include/heartbeat/glue_config.h

make -j4 && make install 
[ "$?" -ne 0  ]&& echo "Heartbeat-3.0.6 安装出错  出错!!"&& exit 1

cp doc/ha.cf doc/authkeys doc/haresources /etc/heartbeat/ha.d/
chmod 600 /etc/heartbeat/ha.d/authkeys 

echo "----------------------------------"
echo "安装完成"
ls -l  /etc/heartbeat/ha.d/
ls -l /etc/init.d/heartbeat
  • 以上脚本下载后,直接运行就可以安装了。
  • 此脚本工作目录为/tmp/heartbeat/
  • 此脚本安装完成后,会自动对heartbeat进行初始化配置,无需手动。

Heartbeat裂脑

什么是裂脑?

由于两台高可用服务器之间在指定的时间内,无法互相检测到对方心跳而各自启动故障转移功能,取得了资源以及服务的所有权,而此时的两台高可用服务器对都还活着并作正常运行,这样就会导致同一个IP湖综合服务在两端同时启动而发生冲突的严重问题,最严重的就是两台主机同时占用一个VIP的地址,当用户写入数据的时候可能会分别写入到两端,这样可能会导致服务器两端的数据不一致或造成数据的丢失,这种情况就本成为裂脑,也有的人称之为分区集群或者大脑垂直分隔导致裂脑发生的原因。

一般来说裂脑的发生,主要是由以下的几个原因导致的:

  • 高可用服务器对之间心跳线路故障,导致无法正常的通信。原因比如:
代码语言:javascript复制
心跳线本身就坏了(包括断了,老化)
网卡以及相关驱动坏了,IP配置及冲突问题
心跳线间连接的设备故障(交换机的故障或者是网卡的故障)
仲裁的服务器出现问题
  • 高可用服务器对上开启了防火墙阻挡了心跳消息的传输
  • 高可用服务器对上的心跳网卡地址等信息配置的不正确,导致发送心跳失败。
  • 其他服务配置不当等原因,如心跳的方式不同,心跳广播冲突,软件出现了BUG等
防止脑裂发生的方法总结

发生脑裂的时候,对业务的影响是及其严重的,有的时候甚至是致命的。如:两台高可用的服务器对之间发生脑裂,导致互相竞争同一个IP资源,就如同我们局域网内常见的IP地址冲突一样,两个机器就会有一个或者两个不正常,影响用户正常访问服务器。如果是应用在数据库或者是存储服务这种极重要的高可用上,那就导致用户发布的数据间断的写在两台服务器上的恶果,最终数据恢复及困难或者是难已恢复。实际的生产环境中,我们可以从以下几个方面来防止裂脑的发生:

  • 同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个线路还是好的,依然能传送消息(推荐的)
  • 检测到裂脑的时候强行的关闭一个心跳节点(需要特殊的节点支持,如stonith,fence),相当于程序上备节点发现心跳线故障,发送关机命令到主节点。
  • 做好对裂脑的监控报警(如邮件以及手机短信等),在问题发生的时候能够人为的介入到仲裁,降低损失。当然,在实施高可用方案的时候,要根据业务的实际需求确定是否能够容忍这样的损失。对于一般的网站业务,这个损失是可控的(公司使用)
  • 启用磁盘锁。正在服务一方锁住共享磁盘,脑裂发生的时候,让对方完全抢不走共享的磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的己方不主动解锁,另一方就永远得不到共享磁盘。现实中介入服务节点突然死机或者崩溃,另一方就永远不可能执行解锁命令。后备节点也就接管不了共享的资源和应用服务。于是有人在HA中涉及了“智能”锁,正在服务的一方只在发现心跳线全部断开时才启用磁盘锁,平时就不上锁了
  • 报警报在服务器接管之前,给人员处理留足够的时间就是1分钟内报警了,但是服务器不接管,而是5分钟之后接管,接管的时间较长。数据不会丢失,但就是会导致用户无法写数据。
  • 报警后,不直接自动服务器接管,而是由人员接管。
  • 增加仲裁的机制,确定谁该获得资源,这里面有几个参考的思路:

增加一个仲裁机制。例如设置参考的IP,当心跳完全断开的时候,2个节点各自都ping一下参考的IP,不同则表明断点就出现在本段,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务。

通过第三方软件仲裁谁该获得资源,这个在阿里有类似的软件应用。更多关于企业集群运维管理系列的学习文章,请参阅:玩转企业集群运维管理专栏,本系列持续更新中。

参考链接:https://bilibili.com/read/cv6545042/ https://blog.csdn.net/zyd_15221378768/article/ details/78982353 https://blog.csdn.net/weixin_ 46054642/article/details/126581795

0 人点赞