前提:
1.两台服务器HA1.coolinuz.com别名为HA1,HA2.coolinuz.com别名HA2
2.IP地址HA1:192.168.0.73,HA2:192.168.0.76
3.系统平台为:RHEL5.4 x86
准备工作:
1、修改本地的Hosts文件,使两节点能够互相解析:
[root@HA1 ~]# vim /etc/hosts

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第1张图片
[root@HA1 ~]# scp /etc/hosts HA2:/etc/

2、建立双机互信,为后面的高可用集群两节点传递信息时所用
HA1:
[root@HA1 ~]# ssh-keygen -t rsa
[root@HA1 ~]# ssh-copy-id -i .ssh/id_rsa.pub HA2

在HA2上执行相同操作:
[root@HA2 ~]# ssh-keygen -t rsa
[root@HA2 ~]# ssh-copy-id -i .ssh/id_rsa.pub HA1

验证双机互信是否配置成功:

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第2张图片

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第3张图片

一、安装drbd
drbd共有两部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果内核版本高于此版本的话,你只需要安装管理工具即可;否则,
需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。这里笔者内核版本为2.6.18-164.el5,因此需要下载内核模块和用户空间的管理工具下载地址:http://mirrors.sohu.com/centos/5.6/extras/i386/RPMS/
1、安装drbd
Ps:所有的安装包我都存放在家目录下的tmp目录中:
[root@HA1 tmp]# yum localinstall -y --nogpgcheck drbd83-8.3.8-1.el5.centos.i386.rpm kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
2、配置drbd
复制样例配置文件到/etc下
[root@HA1 tmp]# cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc/
配置drbd全局配置参数
[root@HA2 ha]# vim /etc/drbd.d/global_common.conf

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第4张图片

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第5张图片

3、为drbd准备一块大小相同的分区,不要创建文件系统(不要格式化)
具体步骤不在赘述,笔者这里,在HA1上准备的是一块5G大小的分区,编号为/dev/sdb1,在HA2上准备的也是一块5G大小的分区,编号为/dev/sdb1
4、定义一个资源,内容如下:
[root@HA2 ha]# vim /etc/drbd.d/mysql.res

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第6张图片

5、同步两节点的配置文件以及资源文件
[root@HA1 tmp]# scp -r /etc/drbd.* HA2:/etc/
6、初始化资源,在两节点上分别执行:
[root@HA1 ~]# drbdadm create-md mysql

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第7张图片


7、启动服务,在两节点上分别执行:
[root@HA1 ~]# service drbd start
[root@HA2 ~]# service drbd start

8、查看启动状态:

9、将其中一个节点设置为Primary,在要设置为Primary的节点上执行如下命令:
[root@HA1 ~]# drbdadm -- --overwrite-data-of-peer primary mysql
观察同步过程:
[root@HA1 ~]# watch -n 1 'drbd-overview'


Ps:如果分区较大,同步的过程会需要较长一段时间。
10、在/dev/drbd0上创建文件系统
[root@HA1 ~]# mke2fs -j /dev/drbd0
[root@HA1 ~]# mkdir /mysql
[root@HA1 ~]# ssh HA2 mkdir /mysql
[root@HA1 ~]# mount /dev/drbd0 /mysql/

11、切换Primary和Secondary节点,确保drbd配置成功
[root@HA1 ~]# umount /mysql/
[root@HA1 ~]# drbdadm secondary mysql
[root@HA2 ~]# drbdadm primary mysql
[root@HA1 ~]# drbd-overview


[root@HA2 ~]# drbd-overview

二、安装Mysql
为简化实验的的复杂性,这里使用mysql解压安装版本
1、添加mysql的运行用户
[root@HA1 ~]# groupadd -r mysql
[root@HA1 ~]# useradd -g mysql -r -s /sbin/nologin mysql

HA2上执行同样的操作
2、将Primary和Secondary节点重新切换回来
[root@HA2 ~]# drbdadm secondary mysql
[root@HA1 ~]# drbdadm primary mysql

Ps:这一步不是必要的,只是习惯性喜欢将HA1设为Primary
3、创建mysql的数据目录
[root@HA1 ~]# mount /dev/drbd0 /mysql/
[root@HA1 ~]# mkdir /mysql/data
[root@HA1 ~]# chown -R mysql.mysql /mysql/data/

4、安装mysql
[root@HA1 tmp]# tar xvf mysql-5.5.24-linux2.6-i686.tar.gz -C /usr/local/
[root@HA1 tmp]# cd /usr/local/
[root@HA1 local]# ln -sv mysql-5.5.24-linux2.6-i686 mysql
[root@HA1 local]# cd mysql
[root@HA1 mysql]# cp support-files/my-large.cnf /etc/my.cnf
[root@HA1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@HA1 mysql]# chkconfig --add mysqld

Ps:在节点HA2上执行同样的上述操作;
节点HA1:
[root@HA1 mysql]# chown -R mysql.mysql .
[root@HA1 mysql]# vim /etc/my.cnf

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第8张图片
[root@HA1 mysql]# scp /etc/my.cnf HA2:/etc/
[root@HA1 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mysql/data/

节点HA2:
[root@HA1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@HA1 mysql]# chkconfig --add mysqld
[root@HA2 mysql]# chown -R root.mysql .

Ps:由于只有能在drbd的Primary节点上才能挂载,因此只在挂载了drbd的节点上进行初始化mysql;切勿两节点都进行初始化操作;
5、分别在两节点上启动Mysql,验证基于drbd的mysql是否均能启动
节点HA1:
[root@HA1 mysql]# service mysqld start


[root@HA1 mysql]# service mysqld stop
[root@HA1 mysql]# umount /mysql/
[root@HA1 mysql]# drbdadm secondary mysql

节点HA2:
[root@HA2 mysql]# drbdadm primary mysql
[root@HA2 mysql]# mount /dev/drbd0 /mysql/
[root@HA2 mysql]# service mysqld start


由此可见基于的drbd的mysql在两节点上启动均正常
取消drbd和Mysql的开启启动,将其定义为高可用集群的资源,并且停止其服务
# service mysqld stop
# umount /mysql
# service drbd stop
# chkconfig mysqld off
# chkconfig drbd off

三、安装corosync+pacemaker
安装corosync+pacemaker需要安装以下软件包:
cluster-glue、cluster-glue-libs、heartbeat、resource-agents、corosync、heartbeat-libs、pacemaker、corosynclib、libesmtp、pacemaker-libs
下载地址:http://clusterlabs.org/rpm/下载符合自己平台架构的软件包
1、安装这些软件包:
Ps:我将所有的软件包下载至ha目录中
[root@HA1 ha]# yum localinstall -y --nogpgcheck ./*.rpm
[root@HA2 ha]# yum localinstall -y --nogpgcheck ./*.rpm

2、配置corosync:
[root@HA1 ha]# cd /etc/corosync/
[root@HA1 corosync]# cp corosync.conf.example corosync.conf
[root@HA1 corosync]# vim /etc/corosync.conf

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第9张图片
[root@HA1 corosync]# corosync-keygen         #生成集群节点之间认证的密钥
[root@HA1 corosync]# scp -p corosync.conf authkey HA2:/etc/corosync/           
#为HA2节点提供相同的配置文件和密钥文件
[root@HA1 corosync]# mkdir /var/log/cluster
[root@HA1 corosync]# ssh HA2 mkdir /var/log/cluster

3、启动corosync
[root@HA1 corosync]# service corosync start
[root@HA1 corosync]# ssh HA2 service corosync start
[root@HA1 corosync]# grep -e "Corosync Cluster Engine" -e "configuration file"
/var/log/cluster/corosync.log
#查看服务是否正常启动


[root@HA1 corosync]# grep TOTEM /var/log/cluster/corosync.log
#查看初始化成员节点通知是否正常发出


[root@HA1 corosync]# grep pcmk_startup /var/log/cluster/corosync.log
#查看pacemaker是否正常启动

节点HA1启动正常,同样方法检测节点HA2启动是否正常

[root@HA1 corosync]# crm status

#查看集群节点的启动情况

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第10张图片

四、定义集群服务:
1、设置集群的工作属性
[root@HA1 corosync]# crm
crm(live)configure# property stonith-enabled=false
#关闭stonith设备检测,如果具有stonith设备不必执行该项
crm(live)configure# property no-quorum-policy=ignore
#关闭法定投票人数策略,如果是多节点集群则不必关闭法定投票人数策略
crm(live)configure# rsc_defaults resource-stickiness=100
#定义全局资源粘性值
crm(live)configure# show

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第11张图片

2、定义drbd资源,接受corosync的调度
crm(live)configure# primitive drbd0 ocf:linbit:drbd params drbd_resource=mysql op monitor role=Master interval=50s timeout=30s op monitor role=Slave interval=60s timeout=30s op start timeout=240s op stop timeout=100s
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# ms MS-drbd drbd0 meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"crm(live)configure# verify
crm(live)configure# commit
crm(live)# status

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第12张图片

3、定义文件系统资源
crm(live)configure# primitive FS ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/mysql fstype=ext3 op start timeout=60s op stop timeout=60s
crm(live)configure# verify
crm(live)configure# commit
crm(live)# status

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第13张图片

4、定义mysql为一个资源,接受corosync的调度
crm(live)configure# primitive Mysql-server lsb:mysqld
crm(live)configure# verify
crm(live)configure# commit
crm(live)# status

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第14张图片
Mysql启动失败,因为drbd的Primary节点在HA1上挂载,mysql在节点HA2上启动自然启动不起来
5、设置资源约束,规定启动顺序
crm(live)configure# colocation drbd-fs-mysql INFINITY: MS-drbd FS Mysql-server
#定义资源约束,将所有资源捆绑在一起,使其只能处于一个节点上,此处也可以讲这三个资源定义为一个group,同样可以实现colocation的效果
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# order drbd-fs-mysql-after mandatory: MS-drbd FS Mysql-server
#定义启动顺序:DRBD资源,文件系统资源,Mysql服务资源
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第15张图片
crm(live)configure# status

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第16张图片

6、测试资源流转
[root@HA1 corosync]# crm node standby
[root@HA2 ha]# crm status

Corosync+pacemaker实现基于drbd分散式存储的mysql高可用集群_第17张图片

到此Corosync+pacemaker基于drbd分散式存储的mysql高可用集群已经实现,以上内容在您实现过程中出现了任何问题,欢迎在此交流;并请各位大虾们予以批评指正,谢谢!