[TOC]

文章目录

(1) Heartbeat 高可用解决方案

0x00 Heartbeat 高可用

Q:什么是高可用技术呢?
答:在生产环境中我既要保证服务不间断的服务又要保证服务器稳定不down机,但是异常还是会发生;
比如说服务器硬件损坏导致服务器down机,我该如何保证服务器down机后继续提供服务呢?这时我就应该请出高可用技术来帮忙了,当我们的服务器发生故障后不能继续时,高可用集群技术解决将业务及服务自动转移至其他主机服务器上继续服务,保证服务架构不间断运行。

1) Heartbeat 介绍

1.1 Heartbeat作用
描述:是Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统,常常使用在分区集群等大型架构中
通过heartbeat,可以将资源(ip以及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务;

heartbeat和keepalived(近年来使用增加,但是某些场景还是不及hb)有很多相同之处,但是也有区别:

  1. Keepalived
  • 使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP)
  • 目的是模拟路由器的双机
  • 常常与lvs负载均衡的高可用中使用结合
  • ka主要控制IP飘移,配置应用简单,而且分层,layer3,4,5,各自配置极为简单
  1. Heartbeat
  • 基于主机或网络的服务的高可用方式;
  • 目的是用户service的双机
  • 中间件业务的高可用中使用但是与lvs负载均衡配置比较麻烦需要其他脚本介入(ldirectord),常常与drbd进行联合使用
  • hb不但可以控制IP飘移,更擅长对资源服务的控制,配置,应用于比较复杂场景

1.2 Heartbeat工作原理
描述:通过修改heartbeat的配置文件,可以指定一台heartbeat服务器作为主服务器,另一台自动成为热备服务器。
在热备服务器上面配置heartbeat守护程序来监听来自主服务器的心跳信息;如果在规定时间内,无法监听到心跳信息,那么就启动故障转移,取得主服务器上的相关资源的所有权,接替主服务器继续不间断的提供服务,从而达到资源以及服务高可用的目的;

Heartbeat支持模式:

  • 主从模式
  • 主主模式
  • 互为主备

一般故障转移切换时间在5~20s之间(hearbeat需要进行arp广播,资源收缩等);和keepalived的服务一样,heartbeat高可用是服务器级别的,不是服务级别的

切换漂移的条件:

  1. 主服务器物理宕机(硬件损坏,操作系统故障)
  2. heartbeat软件故障
  3. 两台主备服务器之间心跳连接故障
    服务故障不会导致切换,可以通过服务宕机把heartbeat服务停掉。

1.3 Heartbeat心跳连接
高可用服务器上的Heartbeat软件会利用这条心跳连接线来检查对端的机器释放存活,进而决定是否做故障漂移,资源切换来保证业务的连续性;
Q:如何进行心跳连接与监控?
答:至少需要两台主机才可以实现高可用服务,采用通信技术使两台heartbeat服务之间通信;

  • 穿行电缆,所谓的串口Serial(首先,缺点是距离不能太远)
  • 一根以太网电缆两网卡直连(常用方式)
  • 以太网电缆,通过交换机等网络设备连接。(交换机可能出现问题,心跳数据容易受到影响等)

1.4 Heartbeat应用场景

  • Nginx/haproxy高可用
  • 数据库主从库主的高可用
  • LVS-DR负载均衡高可用
  • 共享存储高可用

实际工作中两种高可用问题:
(1) hb仅仅控制vip资源,不负责服务资源的启动及停止;比如下面的Heartbeat 安装与配置(Web服务)
(2) hb即控制vip资源的漂移,同时又控制服务资源启动及停止;比如下面的实例;(适合数据库和存储)

其他架构参考:
(1) heartbeat+drbd+mysql #数据库高可用 (后面会进行讲解)
(2) heartbeat+active+nfs/mfs #存储高可用

Tips:

  • 一般来说只有内网机器很多的情况下,才有可能使用heartbeat,几台机器是没有必要的;
  • 如果VIP正常httpd服务宕掉这时候它有可能不做高可用切换;需要自己写个脚本判断httpd服务,如果有问题则停止hb使业务转到另外一台服务器上;


2) Heartbeat 脑裂介绍

裂脑(splitbrain)原理:
两台服务器在一定时间内,无法相互检测到对方心跳而各自启动故障转移功能,取得资源和服务的所有权,会导致同一个IP在两端同时启动服务,存在两个相同的VIP,造成冲突可能导致服务器两端的数据不一致或数据丢失;(即共享资源被瓜分,服务都起不起来了又或者服务都起来,但是共享资源同时写,最后数据就被破坏了!)

2.1 裂脑原因

  • 心跳链路故障(心跳线老化,接触不良,网卡驱动问题等等),导致无法正常通信
  • 开启了防火墙阻挡了心跳信息传输;
  • 心跳网卡地址等配置不正确;
  • 服务配置错误,心跳方式异常,心跳广播冲突,软件bug;

2.2 裂脑解决

  • 同时使用串行电缆和以太网电缆连接,同时使用两条心跳线(推荐)
  • 检测到裂脑时,强制关闭一个节点(需要特殊设备支持,如stonish和fence), 相当于程序上的备节点发现心跳故障,发送关机指令到主节点
  • 监控预警(短信电话通知运维人员),报警在服务器接管之前给人员处理留足时间,报警后不直接服务器此时接管而是由人员来控制操作
  • 启用磁盘锁,做冗余
  • 仲裁机制(确定让那个节点接管服务), 通过第三方软件仲裁谁获得资源;

2.3 fence介绍
描述:Fence是HA集群环境下的术语,在硬件领域fence设备其实就是一个智能电源管理设备(IPMI,Intelligent PowerManagement Interface);其分为内/外部fence,这些设备都有以太网口的,用来在HA切换触发时通过网络重启提供资源服务的服务器;

不同服务器对应Fence设备名称:

  • IBM:RSA II
  • HP:ILO 2
  • DELL:iDRAC 3
  • 外部fence设备:有APC(UPS电源生产商)生产的PowerSwitch
3) Heartbeat 消息列表

高可用软件工作过程中,一般来说由三种消息类型:

  • 心跳信息:150字节的数据包,可能为单播,广播或多播方式;可以控制心跳频率与出现故障的等待时间;
  • 集群转换消息: ip-request (Master 恢复在线状态时) / ip-request-rsp (Slave 释放主服务器失败时取得的资源及服务),主服务器收到备节点的该消息则提供正常访问;
  • 重传消息:rexmit-request 控制重传心跳请求

WeiyiGeek.集群转换消息

提示:以上心跳控制消息都使用UDP协议发生到/etc/ha.d/ha.cf 文件指定的任意端口或者指定多播地址;

3.1 IP地址接管和故障转移
通过IP地址接管和ARP广播进行故障转移的,ARP广播在主服务器故障时候,备用节点接管资源后,会立即强制更新所有Client本地arp表(VIP地址与mac地址的解析记录),确保客户端和新的服务器对话;

3.2 VIP/IP 别名/辅助IP

  • 真实IP又称为管理/物理ip,一般指配置在物理网卡上面的ip。在负载均衡高可用环境中,管理IP是不对外提供访问服务的。仅仅作为管理服务器使用,如SSH可以通过这个进行服务连接管理。

  • VIP是虚拟ip,实际上就是eth0:X,x为0~255的任意数字,你可以在一个网卡上面绑定多个别名。VIP当主服务器故障时,可以自动漂移到备用服务器。

注意区别辅助ip和别名ip,keepalived和heartbeat3都是用辅助ip的形式;在实际生产环境中需要在DNS配置中把网站域名地址解析到VIP地址而并发非真实IP地址;

#辅助ip设置:(HA/HB3 现在都采用这个)
ip addr add 192.168.12.1/24 broadcast 192.168.12.255 dev eth1
ip addr del 192.168.12.1/24 broadcast 192.168.12.255 dev eth1

#别名ip设置:(收工设置 HB2版本时候使用)
ifconfig eth0:1 192.168.12.1 netmask 255.255.255.224 up
ifconfig eth0:1 192.168.12.1 netmask 255.255.255.224 down

管理IP/VIP对比:

  • 管理IP来回迁移非常难做到
  • VIP 方便管理与配置
4) Heartbeat 安装与配置

1.环境需求介绍
需求:当Master-data1或者Master-data2任意一台服务器宕机,再宕机的机器上初始启动的虚拟VIP就会自动切换到运作正常的机器上,实现IP资源的自动接管,从而达到高可用无业务影响的目的;

在实际生产环境中,也可以配置主备模式,即只在主的一端配置VIP,备的一端仅处于热备状态;

系统:CentOS release 6.10 (Final) 
内核:Linux WeiyiGeek 2.6.32-754.10.1.el6.i686 2019 GNU/Linux
虚拟软件:VirtualBOX (管理-> 全局设定 -> NAT 网络 -> 配置两个1/2网段将自动获取IP去掉)

#机器1 Master-data1
管理IP :192.168.1.100
心跳连接:192.168.2.100
VIP :192.168.1.10

#机器2 Master-data2
管理IP :192.168.1.101
心跳连接:192.168.2.101
VIP :192.168.1.11

#两台机器都关闭防火墙和unix安全
#关闭iptables和selinux:
[[email protected]/2 ~]# getenforce
Disabled

Tips:

  • 建议大家把内外网IP最后8位配置成为相同的方式,容易记忆方便管理;
  • 另外存储服务器之间,存储服务器和交换机之间可配置成双千兆网卡绑定(bonding)来提升网卡性能;
  • 在部署进行主机规划意义重大,它让我们思路清晰;

2.Heartbeat版本和配置
官方网站:http://www.linux-ha.org/wiki/Download
Heartbeat-3.X版本以后被分为了4个模块,这些安装包都可以从官网:

  • Heartbeat 3.0.6 //心跳主程序包
  • Cluster Glue 1.0.12 //可重复使用的群集组件(光盘)
  • Resource Agents 3.9.6 //集群实验资源代理(光盘)
  • Pacemaker-1.1.9-1512.el6.src.rpm //起搏器(光盘镜像)
    WeiyiGeek.Heartbeat下载

HA默认配置文件目录/etc/ha.d/,常用配置文件:

ha.cf     参数配置文件    配置heartbeat一些基本参数
authkey 认证文件 高可用服务器对之间根据对端的authkey(对端进行相互认证-防止第三者插足)
haresource 资源配置文件 配置启动IP资源及脚本程序/服务等

#/etc/ha.d/resource.d/ 以后开发的程序存放目录直接可以进行调用


环境配置

##Step1.配置DATA1与DATA2的 IP地址
vim /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2
TYPE=Ethernet
UUID=c3f35428-3740-4791-bc38-8e0d69707d4b
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.2.100
NETMASK=255.255.255.0
; GATEWAY=192.168.1.1 心跳线IP配置不用配网关和DNS
#或者采用临时生效
$ ifconfig eth2 192.168.2.100
$ ifdown eth2

#机器1 Master-data1
ETH1:inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 #管理
ETH2:inet addr:192.168.2.100 #心跳

#机器2 Master-data2
ETH1:inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0
ETH2:inet addr:192.168.2.101 #心跳


##Step2.配置主机名
[[email protected] ~]$ hostname Master-data1
[[email protected] ~]$ sed -i 's/HOSTNAME=WeiyiGeek/HOSTNAME=Master-data1/g' /etc/sysconfig/network
[[email protected] ~]$ sed -i 's/HOSTNAME=WeiyiGeek/HOSTNAME=Master-data2/g' /etc/sysconfig/network

#两台机器上分别运行
cat >> /etc/hosts<<eof
192.168.1.100 Master-data1
192.168.1.101 Master-data2
eof

#判断能否相互通信
[[email protected] ]# ping Master-data2
64 bytes from Master-data2 (192.168.1.101): icmp_seq=1 ttl=64 time=0.415 ms
64 bytes from Master-data2 (192.168.1.101): icmp_seq=2 ttl=64 time=0.545 ms

[[email protected] ]# ping Master-data1
64 bytes from Master-data1 (192.168.1.100): icmp_seq=1 ttl=64 time=1.04 ms
64 bytes from Master-data1 (192.168.1.100): icmp_seq=2 ttl=64 time=0.796 ms

Tips: hosts配置在heartbeat服务中会用到,后文的drbd及存储高可用性能配置都会用到;在实际的生产环境中会把所有机器名对应上所有的机器IP地址;

#Step3.心跳连接配置(实际添加两条主机路由)
route add -host 192.168.2.101 dev eth2 #Master-data1 (对端的IP)
route add -host 192.168.2.100 dev eth2 #Master-data2
echo '/sbin/route add -host 192.168.2.101 dev eth2' >> /etc/rc.local #配置开机自动配置,同上

$ route -n #查看路由
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.2.101 0.0.0.0 255.255.255.255 UH 0 0 0 eth2 #Master-data1 (对端的IP)

Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.2.100 0.0.0.0 255.255.255.255 UH 0 0 0 eth2 #Master-data2



#Step4.安装Heartbeat3.x软件包
TIPS:先yum search heartbeat看看是否有相关可以下载的包;没有的话下载安装epel扩展 (注意选中对应的版本)
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
yum install -y epel-release #或者
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm #注意系统版本
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 #导入key
[[email protected][1/2] ~]# rpm -qa | grep epel
epel-release-6-8.noarch

#进行yum安装heartbeat (您也可选中编译安装)
TIPS:yum 安装rpm包安装后本地不清除的方法 sed -i "s/keepcache=0/keppcache=1/g" /etc/yum.conf
$ yum install heartbeat* -y


#Step5.配置文件
[[email protected] ha.d]$ cd /usr/share/doc/heartbeat-3.0.4/ #配置模板目录
$ cp ha.cf haresources authkeys /etc/ha.d/ # authkeys(600权限)

## ha.cf 文件配置
[[email protected] ha.d]$ vim ha.cf
[[email protected] ha.d]# grep -v -E "^#" ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0 #以上为日志配置

keepalive 2
deadtime 30
warntime 10
initdead 120 #以上为基础参数,配置不需要改动

#关键点(多播的网卡)
mcast eth1 225.0.0.11 694 1 0 #注意这里是11 netmask (关键点)子网掩码对应
auto_failback on
node Master-data1
node Master-data2

## authkeys 文件配置
[[email protected] ha.d]$ chmod 600 authkeys
[[email protected] ha.d]$ vim authkeys
auth 2
2 sha1 HI! #这里HI是密匙

## haresources 文件配置
[[email protected] ha.d]$ vim haresources
#node-name resource1 resource2 ... resourceN
45 Master-data1 IPaddr::192.168.1.10/24/eth1 #这里的IP 网卡 与 mcast 参数是存在关联的 (关键点)
46 Master-data2 IPaddr::192.168.1.11/24/eth1


#Step6.拷贝配置文件到Master-data2中 (注意如果对应IP网卡不对就需要修改)
[[email protected] ha.d]$ tar -zcvf test.tar.gz ha.cf authkeys haresources
[[email protected] ha.d]$ scp [email protected]:/etc/ha.d/test.tar.gz /etc/ha.d/
$ tar -zxvf test.tar.gz


#Step7. 启动heartbeat
[[email protected] ha.d]$ /etc/init.d/heartbeat start
[[email protected] ha.d]$ /etc/init.d/heartbeat start
Starting High-Availability services: INFO: Resource is stopped
INFO: Resource is stopped
Done.

正常情况需要等待120s来恢复网络:
[[email protected] ha.d]$ ip addr | grep -v -E "link|inet6" | grep "192.168"
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.10/24 brd 192.168.1.255 scope global secondary eth1 #虚拟VIP
inet 192.168.2.100/24 brd 192.168.2.255 scope global eth2

[[email protected] ha.d]$ ip addr | grep -v -E "link|inet6" | grep "192.168"
inet 192.168.1.101/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.11/24 brd 192.168.1.255 scope global secondary eth1 #虚拟VIP
inet 192.168.2.101/24 brd 192.168.2.255 scope global eth2


#Step8. 切换延时
#服务器停掉/网卡down掉/heartbeat服务关闭(停掉Master-data1)
[[email protected] ha.d]$ /etc/init.d/heartbeat stop
$ ip addr | grep -v -E "link|inet6" | grep "192.168"
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth1

#此时Master-data2进行接管 (当Master-data1 重新启动后将会自动进行接管)
[[email protected] ha.d]$ ip addr | grep -v -E "link|inet6" | grep "192.168"
inet 192.168.1.101/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.11/24 brd 192.168.1.255 scope global secondary eth1
inet 192.168.1.10/24 brd 192.168.1.255 scope global secondary eth1
5) 实战案例

目的:通过一个WEB服务高可用案例熟悉heartbeat软件的使用,在上面基础之上进行实现;
环境:安装 httpd (不多说)

步骤流程:

1. 配置httpd首页将Master-data1 / Master-data2分别写入index.html
[[email protected] ~]$ echo "Master-data1 192.168.1.100" > /var/www/html/index.html
[[email protected] ~]$ echo "Master-data2 192.168.1.101" > /var/www/html/index.html


2. 配置host域名来解析(判断VIP是不是被漂移)
[[email protected] ~]$ echo '192.168.1.10 www.demo.org' >> /etc/hosts
[[email protected] ~]$ ping www.demo.org
PING www.demo.org (192.168.1.10) 56(84) bytes of data.


3.开启主备的httpd与heartbeat服务
[[email protected] ~]$ /etc/init.d/heartbeat start
$ service httpd start
Starting httpd: [ OK ]

[[email protected] ~]$ /etc/init.d/heartbeat start
$ /etc/init.d/httpd start
Starting httpd: [ OK ]


4.模式释放 #[Master-data1] 上执行
[[email protected] html]$ /usr/share/heartbeat/hb_standby #[Master-data1] heartbeat3.0.4
Going standby [all].


5.实现的效果
[[email protected] ~]$ curl www.demo.org #(master-data1 释放前)
Master-data1 192.168.1.100
[[email protected] ~]$ curl www.demo.org #(master-data1 释放后)
Master-data2 192.168.1.101


6.此时以将漂移到Master-data2上
[[email protected] ~]$ ip addr | grep -v -E "link|inet6" | grep "192.168"
inet 192.168.1.101/24 brd 192.168.1.255 scope global eth3
inet 192.168.1.11/24 brd 192.168.1.255 scope global secondary eth3
inet 192.168.1.10/24 brd 192.168.1.255 scope global secondary eth3


7.恢复接管
/usr/share/heartbeat/hb_takeover #heartbeat3.0.4
[[email protected] html]$ ip addr | grep -v -E "link|inet6" | grep "192.168"
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.10/24 brd 192.168.1.255 scope global secondary eth1
inet 192.168.1.11/24 brd 192.168.1.255 scope global secondary eth1

第二种方式: 让heartbeat负责httpd启动同时负责vip启动

#Step1.将httpd放权给heatbeat 
chkconfig httpd off #分别关闭httpd自启动


#Step2.配置http服务启动脚本(由于yum安装已经制动就有了) [Master-data1/2 配置一致]
[[email protected] ha.d]$ cp /etc/init.d/httpd /etc/ha.d/resource.d #拷贝到hb默认脚本目录中

#step3.修改haresource 加上httpd启动脚本 [Master-data1/2 配置一致]
[[email protected] ha.d]$ vim haresources
Master-data1 IPaddr::192.168.1.10/24/eth1 httpd #注意这里只需要配置一个httpd 服务即可(随着VIP漂移而开启与停止)
Master-data2 IPaddr::192.168.1.11/24/eth1


#step4.验证查看
[[email protected] ha.d]$ netstat -tlnp | grep "httpd" #没有启动
[[email protected] ha.d]$ /etc/init.d/heartbeat start #主节点开启heartbeat

[[email protected] resource.d]$ netstat -tlnp | grep "httpd" #等待120s后启动
tcp 0 0 :::80 :::* LISTEN 12984/httpd

[[email protected] ha.d]$ curl www.demo.org
Master-data1 192.168.1.100

#Step5.当主备同时启动heartbeat时候
#Master-data1 heartbeat/主机挂了才会httpd 启动 (默认在Master-data1启动)
#还是会在Master-data1主机进行启动httpd,这时候停止该主机上的heartbeat便会进行漂移到data2上是;

[[email protected] ha.d]$ netstat -tlnp | grep "httpd"
tcp 0 0 :::80 :::* LISTEN 12063/httpd

[[email protected] ha.d]$ curl www.demo.org
Master-data2 192.168.1.101
#可以通过log文件观察 httpd 停止/启动
ResourceManager(default)[14023]:
2019/04/09_23:32:35 info: Releasing resource group: master-data1 IPaddr::192.168.1.10/24/eth1 httpd

ResourceManager(default)[14023]:
2019/04/09_23:32:35 info: Running /etc/ha.d/resource.d/httpd stop

注意事项:

  • 脚本路径要放入/etc/init.d/httpd 或 /etc/ha.d/resource.d/
  • 脚本执行需要支持 stop/start方式脚本具备可执行权限,且与haresource 中脚本名称一致
  • 如果httpd服务被卡死,会自己重启系统(进行进程自杀)
  • 常用git/svn进行配置heartbeat配置文件,重要的事情说三遍(备份/备份/备份);
  • 在正式的环境中建议先进行测试(找个流量低谷),手动配置临时网卡来测试网络方面的问题;


补充(附录)

0.heartbeat释放模拟脚本

#完全释放
/usr/lib64/heartbeat/hb_standby
/usr/share/heartbeat/hb_standby #heartbeat3.0.4

#完全接管
/usr/lib64/heartbeat/hb_takeover
/usr/share/heartbeat/hb_takeover #heartbeat3.0.4

1.配置文件讲解
ha.cf

vim /etc/ha.d/ha.cf
24 debugfile /var/log/ha-debug #调试日志文件,取默认值
29 logfile /var/log/ha-log #系统日志文件,取默认值
34 ogfacility local0 #在syslog服务中配置通过local1设备接收日志 表示使用系统日志与上面只能开启一个

48 keepalive 2 #心跳频率,可以自己设定 heartbeat 之间的时间间隔为 2 秒。也可以200ms 表示200毫秒
56 deadtime 30 #节点死亡时间的阀值,就是从节点在过了 30 秒后还没有收到心跳就认为主节点死亡
61 warntime 10 #指定心跳延迟的为10S,当10s内备份节点不能接收到主节点的心跳信号,并在日志中发出“late heartbeat“警告前等待的时间,
71 initdead 120 #在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为 deadtime 的两倍。
76 udpport 694 #心跳信息传递的UDP端口,使用端口 694 进行 bcast 和 ucast 通信。这是默认的,并且在 IANA 官方注册的端口号。

#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

91 #bcast eth0 #表示在 eth0 接口上使用广播 heartbeat(将 eth1 替换为 eth0, eth2,或者您使用的任何接口),心跳网卡,如果你有两个网卡,可以写成 eth1

#重点需要更网卡的物理ip在一个网段
113 mcast eth0 225.0.0.1 694 1 0 #说明:采用udp多播播来通知心跳(稳定), D类地址建议在副节点不只一台时使用(默认端口694) 多播传送心跳的网卡 多播组 端口 跃点数 是否回环内传送
121 #ucast eth0 192.168.1.64 #需要修改,表示从本机的 eth0 接口发心跳消息给对方节点,写另一端的IP 地址。这是单播地址。 xuegod64 上改为 192.168.1.63
157 auto_failback on #默认启用,当 auto_failback 设置为 on 时,一旦主节点重新恢复联机,将从从节点取回所有资源。若该选项设置为 off,主节点便不能重新获得资源。

211 node Master-data1 #(主节点)需要修改,该选项是必须配置的。集群中机器的主机名,与“uname –n”的输出相同。
212 node Master-data2 #(备用节点)需要修改

#使用ping模式 有时当主机挂掉或者heartbeat挂掉后vip才会转移 有时出现某个进程挂掉 切换需要使用脚本
#ping模式用于测试 如果网卡ping不同 某个主机 就认为当前断网 需要转移vip
220 ping 192.186.1.254 #需要修改,通过ping命令实现仲裁
253 respawn hacluster /usr/libexec/heartbeat/ipfail #当ping不通时 自动调用 ipfail这个脚本
259 apiauth ipfail gid=haclient uid=hacluster # 表示有权限操作ipfail脚本的组和用户

157 auto_failback on #auto_failback on 为 on 时,主结点恢复正常后,资源自动转给主结点。建议设为 auto_failback off ,等主节点恢复正常后,在业务不繁忙时,切换回来。防止主节点恢复正常时,回切时,再次影起网络中断。
#crm no #是否开启Cluster Resource Masnger(集群资源管理)功能;(一般不用)



authkeys 文件:

# 注意该文件权限必须是600
auth 1 # 设置认证的方法
#1 crc # 不安全
#2 sha1 HI! #推荐使用
#3 md5 Hello!



haresource 文件:

#指定节点主机名,和VIP地址,以双冒号分隔资源,此处以apache为例进行配置
#主备节点 VIP漂移IP
data-1-1 IPaddr::10.0.0.100/24/eth0
data-1-2 IPaddr::10.0.0.101/24/eth0 #当主挂了才进行触发
#参数详解:
data-1-1 : 主机名
IPaddr :Resources.d/ 中的脚本文件
10.0.0.100/24/eth0 : 集群对外服务的VIP,24为子网掩码,eth0为IP绑定的实际物理网卡;为heartbeat提供对外服务的通信接口;

WeiyiGeek.MYSQL集群运维


2.Heartbaet入坑计
建议:查看日志/var/log/ha-log
Q:日志分析接管过程?

1.pacemaker support 情况
2.logging daemon
3.heartbeat 版本信息
4.glib:UDP 多播信息发送
5.运行/etc/ha.d/rc.d/status 脚本查看对端的状态;
6.服务异常则接管资源,通过IPaddr脚本
7.广播UDP及VIP地址
8.如果检测对端正常则将结果的资源释放并返回给它 ip-request (请求发送) / ip-request-rsep (请求发送)

Q:两边都显示漂移的VIP地址?

[[email protected] ha.d]$ ip addr | grep -v -E "link|inet6" | grep "192.168"
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.11/24 brd 192.168.1.255 scope global secondary eth1 #问题点
inet 192.168.1.10/24 brd 192.168.1.255 scope global secondary eth1
inet 192.168.2.100/24 brd 192.168.2.255 scope global eth3

[[email protected] ha.d]# ip addr | grep -v -E "link|inet6" | grep "192.168"
inet 192.168.1.101/24 brd 192.168.1.255 scope global eth3
inet 192.168.1.10/24 brd 192.168.1.255 scope global secondary eth3 #问题点
inet 192.168.1.11/24 brd 192.168.1.255 scope global secondary eth3
inet 192.168.2.101/24 brd 192.168.2.255 scope global eth5

解决方法:是不是链路有问题,能不能进行通信,防火墙是否被开启(可以关闭/也可以将694端口添加通信规则)

Q:一个LAN中是多组heartbeat服务同时开启的问题?
比如:mcast eth1 225.0.0.1 694 1 0 — 当同一个IDC有多个这样的情况应该使用单播;
如果非要使用多播方式,前提是多播地址不能相同(可选mutiladdr> 224.0.0.0 ~ 239.255.255.255)一般 Router/siwtch等设备都是采用多播形式;
WeiyiGeek.实时同步共享存储

Q:Filesystem脚本问题

#问题
Filesystem(Filesystem_/dev/drbd0)[18085]: 2019/05/14_17:12:48 ERROR: Setup problem: couldn't find command: fuser'
#解决办法
yum install psmisc

Q:从机虚拟机复制的主机开启heartbeat时候报uuid错误

May 15 13:29:21 Szabbix heartbeat: [4467]: WARN: nodename mzabbix uuid changed to szabbix

#解决方法:删除其中一台主机的hd_uuid (重启的时候会自动更新)
[[email protected] ~]# rm -rf /usr/local/heartbeat/var/lib/heartbeat/hb_uuid


3.Centos7安装heartbeat在epel源不存在问题
解决方法:描述采用源码编译安装heartbeat即可:

#共用配置
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i s#SELINUX=enforcing#SELINUX=disabled# /etc/selinux/config
reboot

hostname data-1
echo "data-1" >> /etc/hostname
echo -e "192.168.1.100 data-1 node1\n192.168.1.100 data-1 node2" >> /etc/hosts

ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa
ssh-copy-id [email protected] #拷贝公钥到对方机器,就能不使用密码进行登陆ssh

#1.安装基础环境包:
yum install gcc gcc-c++ autoconf automake libtool glib2-devel libxml2-devel bzip2 bzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel asciidoc wget psmisc

#2.创建用户和组
groupadd haclient
useradd -g haclient hacluster

#3.官网下载软件包:Reusable-Components-glue、resource-agents、heartbeat
wget http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/958e11be8686.tar.bz2 -O /opt/heartbeat3.tar.bz2
wget http://hg.linux-ha.org/glue/archive/0a7add1d9996.tar.bz2 -O /opt/glue.tar.bz2
wget https://github.com/ClusterLabs/resource-agents/archive/v3.9.6.tar.gz -O /opt/resource-agents.tar.bz2


#4.安装glue
tar xf glue.tar.bz2
./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 $?

#5.安装Resource Agents
tar xf resource-agents.tar.bz2
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 $?

#6.安装HeartBeat
tar xf heartbeat3.tar.bz2
./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 $?


#7.配置网卡支持插件文件
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/


#安装后主要得目录配置文件
heartbeat configuration:
Version = "3.0.6"
Executables = "/usr/local/heartbeat/sbin"
Man pages = "/usr/local/heartbeat/share/man"
Libraries = "/usr/local/heartbeat/lib64"
Header files = "/usr/local/heartbeat/include"
Arch-independent files = "/usr/local/heartbeat/share"
Documentation files = "/usr/local/heartbeat/share/doc/heartbeat"
State information = "/usr/local/heartbeat/var"
System configuration = "/usr/local/heartbeat/etc"
Init (rc) scripts = "/etc/rc.d/init.d"
Init (rc) defaults = "/etc/sysconfig"
Use system LTDL = "yes"
HA group name = "haclient"
HA group id = "1001"
HA user name = "hacluster"
HA user user id = "1001"
Build dopd plugin = "yes"
Enable times kludge = "yes"

#8. 配置heartbeat配置文件(参考上面即可)
#拷贝三个模版配置文件到 /usr/local/heartbeat/etc/ha.d 目录下
cp /usr/local/heartbeat/share/doc/heartbeat/{ha.cf,haresources,authkeys} /usr/local/heartbeat/etc/ha.d/
vim /usr/local/heartbeat/etc/ha.d/ha.cf
#非常建议使用单播方法 (非常注意网卡 -- 巨坑)
mcast eth2 225.0.0.200 694 1 0 #多播传送心跳的网卡 多播组 端口 跃点数 是否回环内传送
ucast eth2 192.168.2.100 #对端 - data2上配置
ucast eth2 192.168.2.101 #对端 - data1上配置


vim /usr/local/heartbeat/etc/ha.d/authkeys
vim /usr/local/heartbeat/etc/ha.d/haresources
#指定节点主机名,和VIP地址,以双冒号分隔资源,此处以apache为例进行配置
node1 192.168.1.200 apache::/etc/httpd/conf/httpd.conf
data1 IPaddr::192.168.1.200/24/eth1 #VIP 漂移得IP
data2 IPaddr::192.168.1.201/24/eth1

#9.设置权限非常重要
chmod 600 /usr/local/heartbeat/etc/ha.d/authkeys
chown -R root:haclient /usr/local/heartbeat/

[[email protected] heartbeat]# ip addr | grep "192.168"
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.201/24 brd 192.168.1.255 scope global secondary eth1:0
inet 192.168.1.200/24 brd 192.168.1.255 scope global secondary eth1:1
inet 192.168.2.100/24 brd 192.168.2.255 scope global noprefixroute eth2

WeiyiGeek.测试接管



4.如何配置nfs的高可用

#配置NFS共享存储
#在建立NFS的服务器上建立NFS存储:
yum install nfs-utils rpcbind
systemctl start rpcbind
systemctl start nfs
cat /etc/exports #建立NFS共享存储
/data 192.168.146.0/24(ro)
mkdir /data #建立测试文件
echo '<h1>nfs server</h1>' > /data/index.html

#然后修改haresources配置文件添加自动挂载nfs资源:
node1.pjy.com IPaddr::192.168.146.222/24/ens33 Filesystem::192.168.146.151:/data::/var/www/html::nfs::ro apache::/etc/httpd/conf/httpd.conf

pz142 IPaddr::192.168.146.222/24/eth0 drbddisk::nfddrbd Filesystem::/dev/drbd0::/data/image::ext4 killnfsd
#kulllnfsd脚本
#killall -9 nfsd; /etc/init.d/nfs restart; /etc/init.d/nfs restart; exit 0

#重启heartbeat服务加载配置
systemctl restart heartbeat
ssh node2 'systemctl restart heartbeat'

#测试是否加载资源:
ip addr
netstat -lntup
mount

#资源转移测试:
/usr/local/heartbeat/share/heartbeat/hb_standby