一、heartbeat v1简介

heartbeat v1的架构是:heartbeat + haresource 来实现高可用的。heartbeat 
作为message layer层,haresource作为CRM管理资源,RA可以有LSB,OSF,heartbeat legacy提供。

######################################1、Heartbeat的控制信息:
“心跳”信息: (也称为状态信息)仅150 bytes大小的广播、组播或多播数据包。可为以每个节点配
置其向其它节点通报“心跳”信息的频率,以及其它节点上的heartbeat进程为了确认主节点出节点出
现了运行等错误之前的等待时间。 

集群变动事务(transition)信息:ip-request和ip-request-rest是相对较常见的两种集群变动信息
,它们在节点间需要进行资源迁移时为不同节点上heartbeat进程间会话传递信息。比如,当修复了主
节点并且使其重新“上线”后,主节点会使用ip-request要求备用节点释放其此前从因主节点故障而
从主节点那里接管的资源。此时,备用节点则关闭服务并使用ip-request-resp通知主节点其已经不再
占用此前接管的资源。主接点收到ip-request-resp后就会重新启动服务。 

重传请求:在某集群节点发现其从其它节点接收到的heartbeat控制信息“失序”(heartbeat进程使
用序列号来确保数据包在传输过程中没有被丢弃或
出现错误)时,会要求对方重新传送此控制信息。 Heartbeat一般每一秒发送一次重传请求,以避免洪泛。 

上面三种控制信息均基于UDP协议进行传送,可以在/etc/ha.d/ha.cf中指定其使用的UDP端口或者多播
地址(使用以太网连接的情况下)。 

此外,除了使用“序列号/确认”机制来确保控制信息的可靠传输外,Heartbeat还会使用MD5或SHA1为
每个数据包进行签名以确保传输中的控制信息的安全性。

######################################2、Heartbeat的配置文件:
/etc/ha.d/ha.cf  定义位于不同节点上的heartbeat进程间如何进行通信;
/etc/ha.d/haresources  定义对某个资源来说哪个服务器是主节点,
      以及哪个节点应该拥有客户端访问资源时的目标IP地址。
/etc/ha.d/authkeys 定义Heartbeat包在通信过程中如何进行加密。

当ha.cf或authkeys文件发生改变时,需要重新加载它们就可以使用之生效;
而如果haresource文件发生了改变,则只能重启heartbeat服务方可使之生效。

尽管Heartbeat并不要求主从节点间进行时钟同步,但它们彼此间的时间差距不能超过1分钟,
 否则一些配置为高可用的服务可能会出异常。

Heartbeat当前也不监控其所控制的资源的状态,比如它们是否正在运行,是否运行良好以
及是否可供客户端访问等。要想监控这些资源,要使用额外的Mon软件包来实现。

######################################3、ha.cf配置文件部分参数详解:
autojoin    none	#集群中的节点不会自动加入
logfile /var/log/ha-log	#指名heartbaet的日志存放位置
keepalive 2	#指定心跳使用间隔时间为2秒(即每两秒钟在eth1上发送一次广播)
deadtime 30	#指定备用节点在30秒内没有收到主节点的心跳信号后,则立即接管主节点的服
                务资源
warntime 10	#指定心跳延迟的时间为十秒。当10秒钟内备份节点不能接收到主节点的心跳
          信号时,就会往日志中写入一个警告日志,但此时不会切换服务
initdead 120	#在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,
         该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。
udpport 694	#设置广播通信使用的端口,694为默认使用的端口号。
baud    19200	#设置串行通信的波特率       
#bcast   eth0	# Linux  指明心跳使用以太网广播方式,并且是在eth0接口上进行广播。
#mcast eth0 225.0.0.1 694 1 0	#采用网卡eth0的Udp多播来组织心跳,一般在备用节点不止一台
时使用。Bcast、ucast和mcast分别代表广播、单播和多播,是组织心跳的三种方式,任选其一即可。
#ucast eth0 192.168.1.2	#采用网卡eth0的udp单播来组织心跳,后面跟的IP地址应为双机对方的IP
 地址
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 node2.example.com  #主节点主机名,可以通过命令“uname –n”查看。
node node3.example.com  #备用节点主机名
ping 172.16.0.1	#选择ping的节点,ping 节点选择的越好,HA集群就越强壮,可以选择固定的路由
  器作为ping节点,但是最好不要选择集群中的成员作为ping节点,ping节点仅仅用来测试网络连接
#ping_group group1 192.168.12.120 192.168.12.23  #类似于ping  ping一组ip地址
apiauth pingd  gid=haclient uid=hacluster
respawn hacluster /usr/local/ha/lib/heartbeat/pingd -m 100 -d 5s	
  #该选项是可选配置,列出与heartbeat一起启动和关闭的进程,该进程一般是和heartbeat集成的插
  件,这些进程遇到故障可以自动重新启动。最常用的进程是pingd,此进程用于检测和监控网卡
  状态,需要配合ping语句指定的ping node来检测网络的连通性。其中hacluster表示启动pingd
  进程的身份。

#下面的配置是关键,也就是激活crm管理,开始使用v2 style格式
# crm respawn   
#注意,还可以使用crm yes的写法,但这样写的话,如果后面的cib.xml配置有问题
#会导致heartbeat直接重启该服务器,所以,测试时建议使用respawn的写法

#下面是对传输的数据进行压缩,是可选项
compression     bz2
compression_threshold 2


####################################4、haresources配置文件介绍
主从节点上的/etc/ra.d/raresource文件必须完全相同。文件每行通常包含以下组成部分:
1、服务器名字:指正常情况下资源运行的那个节点(即主节点),后跟一个空格或tab;
  这里指定的名字必须跟某个节点上的命令"uname -n"的返回值相同;
2、IP别名(即额外的IP地址,可选):在启动资源之前添加至系统的附加IP地址,
  后跟空格或tab;IP地址后面通常会跟一个子网掩码和广播地址,彼此间用“/”隔开;
3、资源脚本:即用来启动或停止资源的脚本,位于/etc/init.d/或/etc/ha.d/resourcd.d目录中;
  如果需要传递参数给资源脚本,脚本和参数之间需要用两个冒号分隔,多个参数时彼此间也需要用两个冒号分隔;如果有
多个资源脚本,彼此间也需要使用空格隔开;

格式如下:
primary-server [IPaddress[/mask/interface/broadcast]]  resource1[::arg1::arg2]  \
resource2[::arg1::arg2]
 
例如:
node2.example.com 172.16.10.20/16/eth0/172.16.255.255 \
Filesystem::172.16.10.9:/mysqldata::/var/lib/mysql::nfs mysqld

######################################5、authkeys配置文件介绍
auth 1  # 指明认证类型
1 md5 6c781b5034b1f6b9379b # 指明对应的认证类型和随机字符串


######################################6、补充资料:组播IP地址
组播IP地址用于标识一个IP组播组。IANA(internet assigned number authority)把D类地址
  空间分配给IP组播,其范围是从224.0.0.0到239.255.255.255。如下图所示(二进制表示),
  IP组播地址前四位均为1110八位组⑴ 八位组⑵ 八位组⑶ 八位组⑷1110
  
XXXX XXXXXXXX XXXXXXXX XXXXXXXX组播组可以是永久的也可以是临时的。组播组地址中,
  有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成
  员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有
  保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。
224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址
  供路由协议使用。
224.0.1.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效。
239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。常用的预留组播地
  址列表如下:
224.0.0.0 基准地址(保留)
224.0.0.1 所有主机的地址
224.0.0.2 所有组播路由器的地址
224.0.0.3 不分配
224.0.0.4dvmrp(Distance Vector Multicast Routing Protocol,距离矢量组播路由协议)路由器
224.0.0.5 ospf(Open Shortest Path First,开放最短路径优先)路由器
224.0.0.6 ospf dr(Designated Router,指定路由器)
224.0.0.7 st (Shared Tree,共享树)路由器
224.0.0.8 st主机
224.0.0.9 rip-2路由器
224.0.0.10 Eigrp(Enhanced Interior Gateway Routing Protocol,增强网关内部路由线路协议)路
   由器 224.0.0.11 活动代理
224.0.0.12 dhcp服务器/中继代理
224.0.0.13 所有pim (Protocol Independent Multicast,协议无关组播)路由器
224.0.0.14 rsvp (Resource Reservation Protocol,资源预留协议)封装
224.0.0.15 所有cbt 路由器
224.0.0.16 指定sbm(Subnetwork Bandwidth Management,子网带宽管理)
224.0.0.17 所有sbms
224.0.0.18 vrrp(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)
239.255.255.255 SSDP协议使用

二、heartbeat v1 + nfs 实现对mysql的高可用

基于heartbeat v1、V2实现mysql的高可用_第1张图片

实验步骤:

#########################在172.16.10.9上:
#################提供nfs服务
一、安装nfs管理工具
yum install nfs-utils -y

二、创建共享目录并共享
mkdir /mysqldata
# vim /etc/exports 添加以下内容:
/mysqldata/ 172.16.0.0/16(rw,no_root_squash)

setfacl -m u:26:rwx /mysqldata (uid=26是使用rpm方式安装的mysql时的mysql用户的uid)

# 注意:上面的 no_root_squash 选项是为了在安装 mysql 时方便,安装完成后,应去掉此选项。

三、启动nfs服务
/etc/init.d/nfs start

############################################配置主节点和备节点
第一步:设置主机名
#########################在172.16.10.22上:
# vim /etc/sysconfig/netwoek中的HOSTNAME:
HOSTNAME=node2.example.com
#########################在172.16.10.33上:
# vim /etc/sysconfig/netwoek中的HOSTNAME:
HOSTNAME=node3.example.com

第二步:设置主机名解析
#########################在172.16.10.22上:
# vim /etc/hosts文件,添加:
172.16.10.22 node2.example.com node2
172.16.10.33 node3.example.com node3
#########################在172.16.10.33上:
# vim /etc/hosts文件,添加:
172.16.10.22 node2.example.com node2
172.16.10.33 node3.example.com node3

第三步:实现 node2 和 node3 之间基于ssh秘钥认证
#########################在172.16.10.22上:
ssh-keygen -t rsa -P ''
ssh-copy-id -i ~/.ssh/id_rsa.pub node3.example.com
#########################在172.16.10.33上:
ssh-keygen -t rsa -P ''
ssh-copy-id -i ~/.ssh/id_rsa.pub node2.example.com

第四步:node2 和 node3 之间实现时间同步
1、可以使用相同的时间服务器来同步时间
2、可以手动设置是时间同步

验证以上配置结果:

基于heartbeat v1、V2实现mysql的高可用_第2张图片

基于heartbeat v1、V2实现mysql的高可用_第3张图片

上面的配置正确的话,可以继续进行如下配置:

第一步:安装 mysql 服务,并配置
#########################在172.16.10.22上:
yum install mysql mysql-server
mount -t nfs 172.16.10.9:/mysqldata /var/lib/mysql
chown -R mysql.mysql /var/lib/mysql
# 启动 mysql 并初始化 mysql,设置用户密码等
/etc/init.d/mysqld start
#########################在172.16.10.33上:
yum install mysql mysql-server
mount -t nfs 172.16.10.9:/mysqldata /var/lib/mysql
/etc/init.d/mysqld start

验证以上配置结果:

基于heartbeat v1、V2实现mysql的高可用_第4张图片

基于heartbeat v1、V2实现mysql的高可用_第5张图片

注意:以上结果在测试时,mysqld服务只能在一个节点上启动。当然,这里需要授权给远程用户172.16.10.20的权限。完成这些配置后,可以继续进行以下配置。

第一步:安装heartbeat之前的工作
#########################在172.16.10.22,172.16.10.33上:
mysql>GRANT ALL ON *.* TO root@'172.16.10.20' IDENTIFIED BY 'guoting';
/etc/init.d/mysqld stop
umount /var/lib/mysql
chkconfig mysqld off

第二步:安装heartbeat v1版本软件
#########################在172.16.10.22,172.16.10.33上:
yum install perl-TimeDate net-snmp-libs libnet PyXML    # 注意:libnet是在epel仓库中的,需要实现配置好。也可以手动编译,下载地址:http://search.cpan.org/dist/libnet/
rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm # 这是由heartbeat 自己制作的rpm包

第三步:配置heartbeat
#########################在172.16.10.22
cp /usr/share/doc/heartbeat-2.1.4/{ha.cf,haresources,authkeys} /etc/ha.d/

# vim /etc/ha.d/ha.cf 修改以下内容:
mcast eth0 226.10.10.10 694 1 0 
auto_failback on
node	node2.example.com
node	node3.example.com
ping 172.16.0.1

# vim /etc/ha.d/haresources 添加以下内容:
node2.example.com 172.16.10.20/16/eth0/172.16.255.255  \
Filesystem::172.16.10.9:/mysqldata::/var/lib/mysql::nfs mysqld

# vim /etc/ha.d/authkeys 添加以下内容:
auth 1
1 md5 6c781b5034b1f6b9379b

chmod 600 /etc/ha.d/authkeys

#########################在172.16.10.33
scp -p node2.example.com:/etc/ha.d/{ha.cf,haresources,authkeys} /etc/ha.d

第四步:启动服务
#########################在172.16.10.22
/etc/init.d/heartbeat start;ssh node3 '/etc/init.d/heartbeat start'

验证以上结果:

基于heartbeat v1、V2实现mysql的高可用_第6张图片

基于heartbeat v1、V2实现mysql的高可用_第7张图片

基于heartbeat v1、V2实现mysql的高可用_第8张图片

此时模拟,主节点出现故障:

基于heartbeat v1、V2实现mysql的高可用_第9张图片

此时,从节点可以正常接管资源,用户可以正常访问。

基于heartbeat v1、V2实现mysql的高可用_第10张图片

基于heartbeat v1、V2实现mysql的高可用_第11张图片

此时,如果主节点重新上线,主节点会接管现有资源。(auto_failback on的缘由)

基于heartbeat v1、V2实现mysql的高可用_第12张图片

三、heartbeat v2 + nfs 实现对mysql的高可用

实验拓扑图和上面一致。

第一步:修改ha.cf配置文件
#########################在172.16.10.22上:
crm on
scp /etc/ha.d/ha.cf node3:/etc/ha.d/

第二步:修改ha.cf配置文件
#########################在172.16.10.22、172.16.10.33上:
rpm -ivh rpm -ivh heartbeat2/heartbeat-gui-2.1.4-12.el6.x86_64.rpm 

第三步:启动heartbeat服务
#########################在172.16.10.22、172.16.10.33上:
/etc/init.d/heartbeat start

配置完成后,可以验证结果:

基于heartbeat v1、V2实现mysql的高可用_第13张图片

以上结果正确后,可以继续以下实验:

第一步:在主节点上设置ha_gui图形化管理接口的密码
# 默认登陆账号是 hacluster 本地账号
passwd hacluster

第二步:启动图形化接口工具配置
hb_gui &

图形化管理接口界面:

基于heartbeat v1、V2实现mysql的高可用_第14张图片

添加组资源:

基于heartbeat v1、V2实现mysql的高可用_第15张图片

基于heartbeat v1、V2实现mysql的高可用_第16张图片

在组中添加vip,storage,mysqld资源:

基于heartbeat v1、V2实现mysql的高可用_第17张图片

基于heartbeat v1、V2实现mysql的高可用_第18张图片

基于heartbeat v1、V2实现mysql的高可用_第19张图片

基于heartbeat v1、V2实现mysql的高可用_第20张图片

客户端测试:

基于heartbeat v1、V2实现mysql的高可用_第21张图片

实现资源迁移:

基于heartbeat v1、V2实现mysql的高可用_第22张图片

基于heartbeat v1、V2实现mysql的高可用_第23张图片

基于heartbeat v1、V2实现mysql的高可用_第24张图片

基于heartbeat v1、V2实现mysql的高可用_第25张图片

当然,这里也可以使用资源约束来定义资源的粘性,启动顺序等。

至此,配置已全部完成。


以上内容是自己对知识的理解,如有偏差,欢迎指正。