概述

Heartbeat 项目是Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里,由heartbeat 模块实现了这两个功能

Heartbeat是Linux-HA工程的一个组件,自1999年开始到现在,发布了众多版本,是目前开源Linux-HA项目最成功的一个例子,Linux-HA的全称是High-Availability Linux;这个开源项目的目标是:通过社区开发者的共同努力,提供一个增强Linux可靠性(reliability)、可用性(availavility)和可服务性(serviceability) RAS的集群解决方案

工作原理

Heartbeat(Linux-HA)的工作原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务

高可用集群

高可用集群是指一组通过硬件和软件连接起来的独立计算机,它们在用户面前表现为一个单一系统,在这样的一组计算机系统内部的一个或者多个节点停止工作,服务会从故障节点切换到正常工作的节点上运行,不会引起服务中断。从这个定义可以看出,集群必须检测节点和服务何时失效,何时恢复为可用。这个任务通常由一组被称为“心跳”的代码完成。在Linux-HA里这个功能由一个叫做heartbeat的程序完成


系统规划:

这里都是使用Centos 6.4_x86_64操作系统,nod1与nod2主机有两块网卡,eth0用于连接外部网络,eth1用于连接两台Mysql服务器节点,作为心跳线监控;nod3作为共享存储"NFS",只有一块网卡;

节点类型 IP地址 主机名 IP工作类型
主节点服务器 eth0:172.16.14.2 nod1.allen.com 外部通信IP
eth1:192.168.14.2 心跳线连接IP
eth0:0 172.16.14.10 虚拟IP
备用节点服务器 eth0:172.16.14.4 nod2.allen.com
外部通信IP
eth1:192.168.14.4 心跳线连接IP
NFS服务器 eth0:172.16.14.3 nod3.allen.com 外部通信IP
网 关 172.16.0.1
也用于仲裁

拓扑图如下:

Mysql高可用集群_第1张图片

如上所示:eth0:0 172.16.14.10为虚拟IP地址,提供外网访问;172.16.0.1为出口网关,同时为了避免两个节点争抢资源,出口网关做为仲裁IP;当nod1对NFS服务器操作时,nod2只是监听状态不能对NFS服务器做操作;如果nod1挂了,这时nod2会自动启动自己的Mysql服务,同时对NFS服务器上面的数据有操作权限;如果nod1恢复正常工作,服务会自动切换回nod1上面


基本配置

1、配置IP地址;eth0网卡为桥接,eth1为VMnet3;并设置好IP地址

nod1
[root@localhost ~]# ifconfig eth0 |grep "inet addr:";ifconfig eth1 | grep "inet addr:"
          inet addr:172.16.14.2  Bcast:172.16.255.255  Mask:255.255.0.0
          inet addr:192.168.14.2  Bcast:192.168.14.255  Mask:255.255.255.0
nod2
[root@localhost ~]# ifconfig eth0 |grep "inet addr:";ifconfig eth1 | grep "inet addr:"
          inet addr:172.16.14.4  Bcast:172.16.255.255  Mask:255.255.0.0
          inet addr:192.168.14.4  Bcast:192.168.14.255  Mask:255.255.255.0
nod3
[root@localhost ~]# ifconfig eth0 | grep "inet addr:"
          inet addr:172.16.14.3  Bcast:172.16.255.255  Mask:255.255.0.0

2、修改主机名称

######在各个主机上配置主机名称,编辑配置文件永久有效,须重启系统
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME=nod1.allen.com
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME=nod2.allen.com
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME=nod3.allen.com
######如果不想编辑配置文件可以使用"hostname"命令设置主机名,但重启后失效如:hostname nod1.allen.com

3、配置各主机之间能相互解析到主机名,修改"/etc/hosts"文件,各主机的hosts文件相同,这里只做一次介绍如:

######添加如下记录在nod1、nod2、nod3节点上
[root@nod1 ~]# vim /etc/hosts
192.168.14.2    nod1.allen.com
192.168.14.4    nod2.allen.com
172.16.14.2     nod1.allen.com
172.16.14.4     nod2.allen.com
172.16.14.3     nod3.allen.com

4、配置时间同步,在每台服务器上做任务计划使用"ntpdate"命令指定时间服务器自动更新时间如:

[root@nod1 ~]# crontab -e
######每分钟同步一次,在nod1 nod2 nod3服务器上都做
*/1 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null

5、配置nod1与nod2双机信任如:

######在nod1服务器上生成密钥,一直按回车键生成密钥即可
[root@nod1 ~]# ssh-keygen -t rsa
######将生成的公钥上传到nod2服务器上
[root@nod1 ~]# ssh-copy-id -i .ssh/id_rsa.pub 172.16.14.4
=========================================================
######在nod2服务器上生成密钥
[root@nod2 ~]# ssh-keygen -t rsa
######将生成的公钥上传到nod1服务器上
[root@nod2 ~]# ssh-copy-id -i .ssh/id_rsa.pub 172.16.14.2
注释:做完信任后,测试是否还需要使用密码,这里不在演示

配置NFS存储服务器 NFS详细介绍点此处

1、配置好YUM并安装NFS软件

[root@nod3 ~]# yum -y install nfs-utils rpcbind
######查看已安装的NFS软件
[root@nod3 ~]# rpm -qa | grep nfs
nfs-utils-1.2.3-36.el6.x86_64
nfs-utils-lib-1.1.5-6.el6.x86_64
[root@nod3 ~]# rpm -q rpcbind
rpcbind-0.2.0-11.el6.x86_64

2、由于NFS用户验证是靠用户ID来做验证,创建用户用于nod1与nod2服务器挂载NFS文件系统使用

######创建的用户UID为300,在nod1与nod2服务器上面创建用户请保持UID相同
[root@nod3 ~]# useradd -r -u 300 mysql

3、创建NFS共享目录

[root@nod3 ~]# mkdir -p /mydata/data

4、修改主配置文件,共享NFS目录;并启动NFS服务

[root@nod3 ~]# vim /etc/exports
/mydata/data    172.16.14.2(rw,no_root_squash) 172.16.14.4(rw,no_root_squash)
[root@nod3 ~]# service nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Stopping RPC idmapd:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]

安装Mysql Mysql编译安装点此

1、在nod1上面安装Mysql服务,这里直接使用通用二进制包来安装

######解压缩Mysql
[root@nod1 ~]# tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/
[root@nod1 ~]# cd /usr/local/
######创建软链接
[root@nod1 local]# ln -s mysql-5.5.33-linux2.6-x86_64 mysql
[root@nod1 local]# cd mysql
######为Mysql提供Sysv服务脚本
[root@nod1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
######添加执行权限并加入到系统服务
[root@nod1 mysql]# chmod +x /etc/rc.d/init.d/mysqld
[root@nod1 mysql]# chkconfig --add mysqld
######提供Mysql主配置文件
[root@nod1 mysql]# cp support-files/my-large.cnf /etc/my.cnf
######修改主配置文件数据存放目录位置
[root@nod1 mysql]# vim /etc/my.cnf
datadir = /data
######添加Mysql的PATH环境变量
[root@nod1 mysql]# echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
[root@nod1 mysql]# . /etc/profile
######添加Mysql的库文件
[root@nod1 mysql]# echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf
[root@nod1 mysql]# ldconfig
######添加Mysql头文件信息
[root@nod1 mysql]# ln -s /usr/local/mysql/include /usr/include/mysql
######创建数据存放目录,并挂载NFS文件系统
[root@nod1 mysql]# mkdir /data
[root@nod1 ~]# mount -t nfs 172.16.14.3:/mydata/data  /data
######创建Mysql用户与NFS服务器上面的用户UID相同,初始化数据库并启动
[root@nod1 mysql]# useradd -r -u 300 mysql
[root@nod1 ~]# cd /usr/local/mysql
[root@nod1 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/
[root@nod1 mysql]# service mysqld start
Starting MySQL....                                         [  OK  ]
######登录Mysql,授权一个用户为方便后面测试
[root@nod1 mysql]# mysql
[root@nod1 mysql]# mysql> grant all on *.* to 'root'@'172.16.%.%' identified by 'mypass';
######禁止Mysqld开机自启动并停止服务,因为要使用heartbeat来管理Mysqld
[root@nod1 mysql]# chkconfig mysqld off
[root@nod1 mysql]# service mysqld stop

2、在nod2服务器上面安装Mysql

[root@nod2 ~]# tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/
[root@nod2 ~]# cd /usr/local/
[root@nod2 local]# ln -s mysql-5.5.33-linux2.6-x86_64 mysql
[root@nod2 local]# cd mysql
[root@nod2 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@nod2 mysql]# chmod +x /etc/rc.d/init.d/mysqld
[root@nod2 mysql]# chkconfig --add mysqld
[root@nod2 mysql]# cp support-files/my-large.cnf /etc/my.cnf
[root@nod2 mysql]# mkdir /data
[root@nod2 mysql]# vim /etc/my.cnf
datadir = /data
[root@nod2 mysql]# echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
[root@nod2 mysql]# . /etc/profile
[root@nod2 mysql]# echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf
[root@nod2 mysql]# ldconfig
[root@nod2 mysql]# ln -s /usr/local/mysql/include /usr/include/mysql
[root@nod2 ~]# cd /usr/local/mysql
[root@nod2 mysql]# useradd -r -u 300 mysql
 ######在启动前需要把nod1上面的Mysql服务停止,否则不能启动,这里不需要初始化数据库
[root@nod2 mysql]# service mysqld start
Starting MySQL...                                          [  OK  ]
[root@nod2 mysql]# chkconfig mysqld off
[root@nod2 mysql]# service mysqld stop
Shutting down MySQL.                                       [  OK  ]

安装Heartbeat

1、在nod1与nod2服务器上安装Heartbeat

######在nod1服务器上安装Heartbeat依赖环境
[root@nod1 ~]# yum -y install PyXML libnet ipvsadm net-snmp-libs
######这里使用rpm包安装
[root@nod1 ~]# rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm heartbeat-gui-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm
######在nod2服务器上安装Heartbeat依赖环境
[root@nod2 ~]# yum -y install PyXML libnet ipvsadm net-snmp-libs
[root@nod2 ~]# rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm heartbeat-gui-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm

2、在nod1服务器上面配置Heartbeat认证文件、主配置文件与资源文件并拷贝到nod2服务器

######切换目录为Heartbeat提供配置文件
[root@nod1 ~]# cd /usr/share/doc/heartbeat-2.1.4/
[root@nod1 heartbeat-2.1.4]# cp ha.cf authkeys haresources /etc/ha.d/
######切换到Heartbeat配置文件目录
[root@nod1 heartbeat-2.1.4]# cd /etc/ha.d/
######生成一个随机数
[root@nod1 ha.d]# openssl rand -hex 4
dca1f0ac
######修改认证文件
[root@nod1 ha.d]# vim authkeys
auth 3            #启用的哪一个认证,就把下面所对应的认证开启
#1 crc
#2 sha1 HI!
3 md5 dca1f0ac
====================================================================
######修改主配置文件
[root@nod1 ha.d]# vim ha.cf
logfile /var/log/ha-log        #日志文件开启
#logfacility    local0         #与上面日志文件开启任意一个即可
keepalive 2                    #发送通知频率
mcast eth0 225.14.2.1 694 1 0  #组播
auto_failback on               #开启此项为如果主节点从故障恢复到正常状态是否把服务自动切换到主节点
node    nod1.allen.com         #节点主机名称,把所有节点都需要加入
node    nod2.allen.com
ping 172.16.0.1                #仲裁IP地址
compression     bz2            #启用压缩
compression_threshold 2        #大于多少KB启用压缩,默认2KB
====================================================================
######修改资源文件
[root@nod1 ha.d]# vim haresources
######设置资源类型
nod1.allen.com  IPaddr::172.16.14.10/16/eth0 Filesystem::172.16.14.3:/mydata/data::/data::nfs mysqld
注释:
nod1.allen.com:为主节点主机名称
IPaddr:虚拟IP地址
Filesystem: 要挂载的文件系统资源:挂载点:文件系统类型
mysqld:服务类型,为哪个服务做高可用
====================================================================
######拷贝Mysqld的服务脚本到Heartbeat资源目录
[root@nod1 ha.d]# cp /etc/rc.d/init.d/mysqld resource.d/
######将配置文件拷贝到nod2一份
[root@nod1 ha.d]# scp -p authkeys ha.cf haresources 172.16.14.4:/etc/ha.d

3、在nod1服务器上面启动Heartbeat服务并查看Heartbeat与Mysqld是否启动

[root@nod1 ~]# service heartbeat start
[root@nod1 ~]# netstat -naput|grep 3306
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      36711/mysqld
[root@nod1 ~]# netstat -naput|grep 694
udp        0      0 225.14.2.1:694              0.0.0.0:*                               35926/heartbeat: wr

4、启动nod2服务器上面的Heartbeat服务并查看Heartbeat启动

[root@nod1 ~]# ssh nod2.allen.com 'service heartbeat start'
[root@nod1 ~]# ssh nod2.allen.com 'netstat -naput|grep 694'
udp        0      0 225.14.2.1:694              0.0.0.0:*                               39592/heartbeat: wr
注释:在nod2服务器Mysqld不会启动,如果把nod1服务器的Heartbeat服务停止,这里会自动运行Mysqld服务

5、在nod1服务器上创建数据库并查看,然后停止Heartbeat服务

[root@nod1 ~]# mysql -e 'create database allen;'
[root@nod1 ~]# mysql -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| allen              |
| log                |
| mysql              |
| performance_schema |
| test               |
+--------------------+
[root@nod1 ~]# service heartbeat stop

6、查看nod2服务器上面的Mysqld服务是否启动,然后连接到数据库查看数据库

[root@nod1 ~]# ssh nod2.allen.com 'netstat -naput|grep 3306'
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      40473/mysqld
[root@nod1 ~]# mysql -h 172.16.14.4 -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| allen              |
| log                |
| mysql              |
| performance_schema |
| test               |
+--------------------+

7、假设把nod1服务器已经修复,启动Heartbeat服务,查看Mysqld是否能自动切换到nod1服务器

[root@nod1 ~]# mysql -h 172.16.14.4 -e 'create database allen_yang;'
[root@nod1 ~]# service heartbeat start
######查看数据库,能查看到说明已经启动
[root@nod1 ~]# mysql -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| allen              |
| allen_yang         |
| log                |
| mysql              |
| performance_schema |
| test               |
+--------------------+

8、测试使用客户端工具使用虚拟IP“172.16.14.10”连接Mysqld服务

Mysql高可用集群_第2张图片


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


使用CRM图形化界面来管理集群资源

1、在nod1服务器上面修改Heartbeat主配置文件并拷贝到nod2服务器,使用两台服务器配置保持一致

######切换到Heartbeat配置文件目录
[root@nod1 ~]# cd /etc/ha.d/
######修改主配置文件
[root@nod1 ha.d]# vim ha.cf
######添加如下内容;下面两个任选其一配置即可
crm respawn | crm on
######在启动CRM图形管理界面时会需要此用户的密码,所以先为此用户添加密码
[root@nod1 ha.d]# echo hacluster | passwd --stdin hacluster

2、启动图形化配置界面并连接到服务器

[root@nod1 ha.d]# hb_gui &

Mysql高可用集群_第3张图片

3、创建资源组用于统一管理

Mysql高可用集群_第4张图片

4、设置组名及组的属性

Mysql高可用集群_第5张图片

5、添加虚拟IP资源

Mysql高可用集群_第6张图片

5、添加虚拟IP的其他属性

Mysql高可用集群_第7张图片

6、确定添加虚拟IP资源

Mysql高可用集群_第8张图片

7、添加文件系统资源并选择添加的资源类型

Mysql高可用集群_第9张图片

8、确定添加文件系统资源

Mysql高可用集群_第10张图片

9、添加数据库资源

Mysql高可用集群_第11张图片

Mysql高可用集群_第12张图片

10、启动资源如下

Mysql高可用集群_第13张图片

11、已经成功在nod2服务器上运行

Mysql高可用集群_第14张图片

12、使用客户端工具测试连接虚拟IP

Mysql高可用集群_第15张图片

13、已以成功连接到数据库

Mysql高可用集群_第16张图片

14、暂停nod2服务器上的资源,测试是否会切换到nod1服务器

Mysql高可用集群_第17张图片

15、资源已经成功切换到nod1服务器

Mysql高可用集群_第18张图片

16、再次使用客户端工具测试使用虚拟IP连接Mysqld

Mysql高可用集群_第19张图片

17、已经成功连接到Mysqld

Mysql高可用集群_第20张图片

到此Mysql高可用集群就此结束;后面将会介绍其他开源集群软件的安装配置及使用;敬请期待...