1.Heartbeat介绍

Heartbeat 是一个基于Linux开源的,被广泛使用的高可用集群系统,自1999年开始到现在,发布了众多版本,是目前开源Linux-HA项目最成功的一个例子,在行业内得到了广泛的应用。

1.1 Heartbeat作用

Heartbeat可以将资源(IP及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务。在实际生产应用场景中,heartbeat的功能和另一个高可用开源软件keepalived有很多相同之处,在生产中实际的业务应用也是有区别的。
Heartbeat官方地址:http://linux-ha.org/wiki/Main_Page

1.2 Heartbeat工作原理

通过修改heartbeat软件的配置文件,可以指定哪一台heartbeat服务器做为主服务器,则另一台将自动成为热备服务器。然后在热备服务器上配置heartbeat守护程序来监听来自主服务器的心跳信息。如果热备服务器在指定时间内未监听到来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源服务的所有权,接着主服务器继续不间断的提供服务,从而达到资源及服务高可用性的目的。
除了主备模式,hertbeat还支持主主的模式,即两台服务器互为主备,这是他们之间会相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未受到对方发送的心跳报文,那么,一方就会认为对方失效或者宕机了,这时每个运行正常的主机就会启动自身的资源接管模块来接管运行在对方主机上的资源或者服务,继续为用户提供服务。所谓的业务不间断,在故障转移期间也是需要切换时间的,heartbeat的切换时间一般是在5-20秒左右。

切换到常见条件:

(1)服务器宕机。

(2)Heartbeat服务本身故障。

(3)心跳连接故障。

服务故障不会导致切换,可以通过服务宕机把heartbeat服务停掉。

1.3 Heartbeat心跳连接

我们已经了解了heartbeat服务,至少需要两台主机来完成。那么实现高可用服务,两台机器之间是如何做到互相通信的和相互检监测的呢?
下面是两台heartbeat主机之间通信的一些常用的可行的方法:

(1)串行电缆(首选,缺点是距离不能太远)。

(2)一般以太网电缆两网卡直连(生产环境常用的方式)。

(3)以太网电缆,通过交换机等网络设备连接(次选)。

增加了交换机故障点,同时,线路不是专用心跳线,容易受其他数据传输的影响,导致心跳报文发送问题。

1.4 Heartbeat裂脑

1.4.1 什么是裂脑

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

1.4.2 导致裂脑的原因

一般来说,裂脑的发生,有以下几个原因导致

(1)高可用服务器对之间心跳线链路故障,导致无法正常通信。

a.心跳线坏了(包括断了,老化)。

b.网卡及相关驱动坏了 ,IP配置及冲突问题(网卡直连)。

c.心跳线间连接的设备故障(交换机及网卡)。

d.仲裁的机器出问题了。

(2)高可用服务器对上开启了防火墙阻挡了心跳消息传输。

(3)高可用服务器对上心跳网卡地址等信息配置不正确,导致发送心跳失败。

(4)其他服务配置不宕等原因,如心跳方式不同,心跳广播冲突,软件BUG等。

1.4.3防止裂脑发生的8种方法

实际生产环境中,我们可以从下面几个方面来防止裂脑问题的发生。

(1)同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了另一个还是好的,依然能够传送心跳信息(网卡设备和网线设备,推荐使用这种方法)

(2)检测到裂脑时强行关闭一个心跳节点。(这个功能需要特殊设备支持,如Stonith、fence)。相当于程序上备节点发现心跳线故障,发送关机命令道主节点。

(3)做好对裂脑的监控报警(如邮件及手机短信等,值班),在问题发生时认为第一时间介入仲裁,降低损失。百度监控有上行和下行有一个和人工交互的过程。当然,如果没有人工交互的过程在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失 。对于一般的网站业务,这个损失是可控的。我们也可以第一时间登录出故障的机器,查看什么原因,如果问题很小可以修复。

(4)启用磁盘锁,正在服务一方锁住共享磁盘,“裂脑”发生时让对方完全“抢不走”共享资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动“解锁”,另一方将永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即,正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁,平时就不上锁。

(5)报警报在服务器接管之前给人员处理留足够时间。
1分钟内报警,但是服务器此时没有接管,而是5分钟接管,接管时间较长。数据不会丢,导致用户无法写数据。

(6)报警后,不直接自动服务器接管,而是由人为人员接管。

(7)增加仲裁机制,确定谁该获得资源,这里有几个参数的思路。

a.加一个仲裁机制。假如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参看IP,不通则表明断点就出在本端,不仅心跳线、还有对外服务的本地网络链路断了,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务。Ping不通参考IP的一方可以自我重启,以彻底释放有可能还占用着的那些共享资源(heartbeat也有此功能)。

b.通过第三方软件仲裁谁该获得资源。

1.4.4有关fence的说明

Fence只是HA集群环境下的术语,在硬件领域,fence设备其实就是一个智能管理电源管理设备(IPMI)也叫作Intelligent PowerManagement Interface,如果和服务代理商说fence他们他们一定不知道是什么东西(原厂可能知道)得和他们说智能管理设备或远程管理卡,他们就能理解了。Fence是一种设备有外部fence和内部fence两种是插到服务器里的不管是内部还是外部fence,这些设备带有以太网口的,用来在HA切换触发时通过网络重启服务器。
先说内部设备Fence在不同的服务器的名称是不一样的,以下是不同服务器对应的fence设备名称。

IBM: RSA

HP: ILO

DELL: Idrac

至于外部设备有,APC(著名的UPS电源生产商)的PowerSwitch,这是一个以太网口的电源插座,每个插口都对应一个ID号,用来在命令中指定对哪一个ID号上的电源进行切断或者重启。

1.5 Heartbeat的消息类型

Heartbeat高可用软件在工作中,一般来说,有三种消息类型,具体为:

(1)心跳消息

(2)集群转换消息

(3)重传请求

1.5.1 心跳消息

心跳消息约为150字节的数据包,可能为单播、广播或者多播的方式,控制心跳频率及出现故障要等待多久进行故障转换。

1.5.2 集群转换消息

ip-request和ip-request-resp
当主服务器恢复在线状态时,通过ip-request消息要求备机释放主服务器失败时备服务器取得的资源,然后备份服务器关闭释放主服务器失败时取得的资源及服务。
备服务器释放主服务器失败时取得的资源及服务后,就会通过ip-request-resp消息通知主服务器它不在拥有该资源及服务,主服务器收到来自备节点的ip-request-resp消息通知后,启动失败时释放的资源及服务,并开始提供正常的访问服务。

1.5.3 重传请求

Rexmit-request控制重传心跳请求。这种心跳控制消息都使用UDP协议发送到/etc/ha.d/ha.cf文件指定的任意端口或指定的多播端口地址。

1.6 Heartbeat IP地址接管和故障转移

Heartbeat是通过IP地址接管和ARP广播进行故障转移的。
ARP广播:在主服务器故障时,备用节点接管资源后,会立即强制更新所有客户端本地的ARP表(即清除客户端本地缓存的失败服务器的vip地址和mac地址的解析记录),ARP是地址解析协议。备节点会对局域网进行广播。确保客户端和新的主服务器对话。
在局域网里每台机器都有一个ARP表用arp –a可以看到

1.7 vip/IP别名/辅助ip

真实IP又称为管理IP,一般是配置在物理网卡上的实际IP。在负载均衡及高可用环境中,管理IP是不对外提供服务的,而仅是管理服务器用,如SSH可以通过这个管理IP连接服务器。

VIP是虚拟IP,实际上就是heartbeat临时绑定在物理网卡上的别名IP(heartbeat3以上也可以采用辅助IP),如eth0:x.x为0-255的任意数字,可以在一块网卡上绑定多个别名。

这样做的好处就是当提供服务的服务器宕机了,在接管的服务器上会直接会自动配置上同样的VIP提供服务。如果是使用管理IP的话,来回迁移就很难做到,而
且管理IP迁移走了,我们就只能去机房连接服务了。VIP的实质就是确保两台服务器各有一个管理IP不动,就是随时可以连上机器,然后,增加绑定其他的IP,这样就算VIP迁移走了,也不至于服务器本身连接不上,因为还有管理IP。

手工配置VIP的方法:

Heartbeat2软件默认是使用这个命令来添加VIP的

Ifconfig eth0:1 192.168.1.131 netmask 255.255.255.0 up(IP别名)

Keepalved软件默认使用这个命令来添加VIP,heartbeat3采用的方案

Ip addr add 10.0.12.1/24 broadcast 10.0.12.255 dev eth1(辅助IP)

提示:ip add 可以查看包括别名和辅助ip,用ifconfig无法查看辅助情况

手工删除VIP的方法:

Ip addr 10.0.12.1/24 broadcast 10.0.15.255 dev eth1(辅助IP)

Ifconfig eth0:1 10.0.0.1 netmask 255.255.255.0 down (ip别名)

手工查看VIP的方法:

使用别名的方法配置的VIP可通过ifconfig查看

1.8 Heartbeat脚本默认目录

启动脚本:/etc/init.d/ (特别使用yum安装的时候)

重要资源目录:/etc/ha.d/resource.d/ 如果以后自己开发程序就放在这个地方,然后heartbeat在haresource文件里直接调用。

[root@heartbeat-1-130 ha.d]# ll /etc/ha.d/resource.d/
总用量 96
-rwxr-xr-x 1 root root 828 12月 3 2013 apache
-rwxr-xr-x 1 root root 805 12月 3 2013 AudibleAlarm
-rwxr-xr-x 1 root root 760 12月 3 2013 db2
-rwxr-xr-x 1 root root 910 12月 3 2013 Delay
-rwxr-xr-x 1 root root 1903 12月 3 2013 Filesystem
-rwxr-xr-x 1 root root 2325 12月 3 2013 hto-mapfuncs
-rwxr-xr-x 1 root root 3488 3月 3 23:31 httpd
-rwxr-xr-x 1 root root 951 12月 3 2013 ICP
-rwxr-xr-x 1 root root 3424 12月 3 2013 ids
-rwxr-xr-x 1 root root 2273 12月 3 2013 IPaddr
-rwxr-xr-x 1 root root 1825 12月 3 2013 IPaddr2
-rwxr-xr-x 1 root root 1391 12月 3 2013 IPsrcaddr
-rwxr-xr-x 1 root root 1165 12月 3 2013 IPv6addr
-rwxr-xr-x 1 root root 1091 12月 3 2013 LinuxSCSI
-rwxr-xr-x 1 root root 790 12月 3 2013 LVM
-rwxr-xr-x 1 root root 1125 12月 3 2013 MailTo
-rwxr-xr-x 1 root root 2926 12月 3 2013 OCF
-rwxr-xr-x 1 root root 742 12月 3 2013 portblock
-rwxr-xr-x 1 root root 1160 12月 3 2013 Raid1
-rwxr-xr-x 1 root root 1563 12月 3 2013 SendArp
-rwxr-xr-x 1 root root 1012 12月 3 2013 ServeRAID
-rwxr-xr-x 1 root root 1294 12月 3 2013 WAS
-rwxr-xr-x 1 root root 1166 12月 3 2013 WinPopup
-rwxr-xr-x 1 root root 666 12月 3 2013 Xinetd

提示:把脚本放到上面两个路径其中任意一个下面,然后再heartbeat的haresource配置文件中配置脚本名称就能调用到该脚本,进而控制资源和服务的启动和关闭。

1.9 Heartbeat配置文件

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

有关heartbeat的介绍可以查看下面文章

https://www.linuxidc.com/Linux/2017-02/140554.htm

https://www.aliyun.com/jiaocheng/131309.html

学习heartbeat-01简介的更多相关文章

  1. ElasticSearch学习笔记-01 简介、安装、配置与核心概念

    一.简介 ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便.支持通过HTTP使用JSON进 ...

  2. MongoDB学习笔记-01 简介、安装

    MongoDB简介 MongoDB是一种强大.灵活.可拓展的存储方式.是一个面向文档(相当于"行"的概念)的数据库. 可拓展:通过添加服务器而增加存储量. Windows下安装 版 ...

  3. Node.js 教程 01 - 简介、安装及配置

    系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...

  4. Redis:学习笔记-01

    Redis:学习笔记-01 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 1. Redis入门 2.1 ...

  5. 软件测试之loadrunner学习笔记-01事务

    loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...

  6. Linux内核学习笔记-1.简介和入门

    原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  7. Python 黑客 004 用Python构建一个SSH僵尸网络 01 简介

    用Python构建一个SSH僵尸网络 01 简介 一. 构建一个SSH僵尸网络的流程图: Created with Raphaël 2.1.0手动操作,实现通过SSH连接目标服务器(手动)用 Pexp ...

  8. 一起学习CMake – 01

    一起学习CMake – 01 本节介绍CMake里最常用的三个命令,分别是cmake_minimum_required; project; add_executable等. CMake是个好东西,在使 ...

  9. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二) 先上项目解决方案图: 以上可以看出项目结构可以划分为4大块,1是surging的核心底层,2,3,4都可以 ...

  10. Netty学习——Apache Thrift 简介和下载安装

    Netty学习——Apache Thrift 简介和下载安装 Apache Thrift 简介 本来由Facebook开发,捐献给了Apache,成了Apache的一个重要项目 可伸缩的,跨语言的服务 ...

随机推荐

  1. 三大数据库 sequence 之华山论剑 (中篇)

    sequence 用法四 AUTO INCREMENT 通过 DEFAULT 还是需要手动创建 sequence.有没有更简单的用法呢? 当然,就是通过 AUTO INCREMENT 方式,自动创建 ...

  2. 【C# IO 操作 】开篇 IO命名空间的解析

    图片模板下载 System.IO命名空间类分为:文件.驱动 .目录.路径.流.比特率流的操作 驱动类:比较简单,所以就不区分静态和实例操作类,所有的操作合并在DriverInfo类中 路径类:比较简单 ...

  3. 【C#基础概念】编程语言:弱类型、强类型、动态类型、静态类型

    一.看图区别编程语言 一般来讲,看第一个图就够了 这图是引用的,有错误,Python是强类型,但是图片中却归为弱类型了. 业界堆静态和动态的区分达到共识. 但是堆强类型和弱类型语言还未达成共识.我个人 ...

  4. 【译】在 ASP.NET 和 ASP.NET Core 之间共享代码

    原文 | Ken 翻译 | 郑子铭 随着 .NET 6 的发布,使用 ASP.NET Core 可以获得更多好处.但是将现有代码迁移到 ASP.NET Core 通常听起来像是一项巨大的投资.今天我们 ...

  5. jvm添加jmx远程监控

    调JVM监控的时候需要远程连接机器,所以服务器需要开放JMX协议,配置如下. 现在我的项目是jboot-jfinal项目,用的是undertow容器,在启动脚本里面加入 JAVA_OPTS=" ...

  6. Python:GUI库tkinter(一)

    学习自: Python GUI 编程(Tkinter) | 菜鸟教程 TkDocs_官方文档 1.几个常用的Python GUI库 tkinter:Python的标准Tk GUI工具包的接口. wxP ...

  7. Matplotlib:Python三维绘图

    1.创建三维坐标轴对象Axes3D 创建Axes3D主要有两种方式,一种是利用关键字projection='3d'来实现,另一种是通过从mpl_toolkits.mplot3d导入对象Axes3D来实 ...

  8. python 镜像仓库获取最新版本号

    #/bin/python# -*- coding: utf-8 -*-import requestsfrom urllib import parsefrom requests.auth import ...

  9. lavarel 框架 搜索后分页

    ................框架控制器 public function list(Request $request){ $word=$request->input('word'); $arr ...

  10. laravel7 ORM和laravel模型操作

    1.什么是ORM 对象关系映射(Object Relation Maping),这个关系就是关系数据库.因此,顾名思义,ORM的核心是我们通过操作对应来操作关系数据库. ORM的优点:  ORM提供了 ...