博文主要介绍的是在红帽5.8系统上基于drbd+corosync对高可用mysql服务的实现,这种模式的搭建在企业环境中也是很实用的,让我们一起来看看整个实现过程吧

前提条件说明

(1)节点之间需要传递事务信息,节点之间识别节点是通过节点名称实现,所以需要DNS解析,将相应IP对应节点名称,但是如果依赖DNS服务器时,高可用集群服务又增大了风险,为了避免DNS服务器存在的隐患,配置解析时直接使用本地/etc/hosts配置文件定义

(2)节点名称必须要与‘uname–n’命令显示的名称一致

(3)高可用集群节点的管理,比如停止某一节点时,是不能在自身这个节点停止其服务,需要在一个运行正常的节点上停止其他节点;所以,提供ssh互信通信(配置每个节点基于密钥的方式与节点进行通信)

(4)时间需要同步

节点之间网络通信配置实现

test1节点 IP配置

基于drbd&&corosync实现高可用mysql_drdb+corosync

test2节点 IP配置

基于drbd&&corosync实现高可用mysql_drdb+corosync_02

配置完成重启网络服务

各节点节点名称配置

test1节点名称配置

# vim /etc/sysconfig/network

基于drbd&&corosync实现高可用mysql_drdb+corosync_03

# hostname test1.magedu.com

test2 节点名称配置

# vim /etc/sysconfig/network

基于drbd&&corosync实现高可用mysql_mysql_04

# hostname test2.magedu.com

配置完成重新登录一下终端

主机名解析配置

RS1 主机名解析配置

# vim /etc/hosts

基于drbd&&corosync实现高可用mysql_mysql_05

RS2 主机名解析配置

# vim /etc/hosts

基于drbd&&corosync实现高可用mysql_drdb+corosync_06

节点之间的ssh互信功能配置

节点 test1(简称)配置

# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
# ssh-copy-id -i .ssh/id_rsa.pub root@test2.magedu.com

测试一下

基于drbd&&corosync实现高可用mysql_mysql_07

节点 test2配置

# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
# ssh-copy-id -i .ssh/id_rsa.pub root@test1.magedu.com

测试是否可以进行ssh通信

基于drbd&&corosync实现高可用mysql_mysql_08

时间同步

配置一台主机为时间服务器,进行时间同步,这里直接使用的是实验提供的时间服务器,没有做其他配置

节点test1test2同时同步

# ntpdate 172.16.0.1

定义一条计划任务,时刻同步着时间

# crontab –e  
*/5 * * * * ntpdate 172.16.0.1 >/dev/null

DRBD的实现过程

Drbd是将位于两个系统上的两块磁盘上的磁盘分区做成镜像设备,在底层通过TCP/IP 协议在底层完成数据同步(不同主机,光网络,TCP/IP报文);Drbd工作时在内核上进行数据同步,即drbd是内核的一个功能,向系统中写数据的时候,drbd将数据一分为二通过网卡将数据发送到另一台主机,另一台主机上要有运行一个的服程序;完成这drbd的这些操作的是主机上drbd 的内核模块;drbd内核模块在需要时被装入内核

首先要在在节点1与节点2上创建两个一样的分区,这个比较简单所以过程就省略了

安装drbd软件包

# yum -y --nogpgcheck localinstall
drbd83-8.3.81.el5.centos.i386.rpm
kmod-drbd83-8.3.8-1.el5.centos.i686.rpm

准备配置文件

# cp /usr/share/doc/drbd83-8.3.8/drbd.conf  /etc

配置/etc/drbd.d/global-common.conf

global {
        usage-count no;
        # minor-countdialog-refresh disable-ip-verification
common {
        protocol C;
        handlers {
                # fence-peer"/usr/lib/drbd/crm-fence-peer.sh";
                # split-brain"/usr/lib/drbd/notify-split-brain.sh root";
                # out-of-sync"/usr/lib/drbd/notify-out-of-sync.sh root";
                #before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 ---c 16k";
                #after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
        }
        startup {
                # wfc-timeoutdegr-wfc-timeout outdated-wfc-timeout wait-after-sb
        }
        disk {
                on-io-errordetach;
                # on-io-errorfencing use-bmbv no-disk-barrier no-disk-flushes
                # no-disk-drain no-md-flushesmax-bio-bvecs
        }
        net {
                cram-hmac-alg"sha1"
                shared-secret"mydrbdlab";
        }
        syncer {
                rate 100M;
        }
}

定义一个资源/etc/drbd.d/web.res(文件名以.res结尾)

# vim web.res
resource web {
        device    /dev/drbd1;
        disk      /dev/sda6;
        meta-disk internal;
on test1.magedu.com {
        address172.16.51.77:7789;
}
on test2.magedu.com {
        address172.16.51.78:7789;
}
}

复制配置文件及资源到test1与test2节点

# scp -p web.res global_common.conf test1:/etc/drbd.d/

初始化资源(在test1和test2上分别执行初始化操作命令)

# drbdadm create-md web

基于drbd&&corosync实现高可用mysql_drdb+corosync_09

启动drbd(两个节点之间要同步磁盘数据,所以两个节点同时上线)

# service drbd status

查看同步状态基于drbd&&corosync实现高可用mysql_mysql_10

设置一个test1节点为Primary

基于drbd&&corosync实现高可用mysql_drdb+corosync_11

稍等片刻,再次查看同步状态(主从节点已经设定完成)

基于drbd&&corosync实现高可用mysql_mysql_12

创建文件系统

文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化

# mke2fs -j /dev/drbd0
# mkdir /mydata
# mount /dev/drbd0 /mydata/

准备测试文件(为主从节点调试结果做验证)

基于drbd&&corosync实现高可用mysql_drdb+corosync_13

对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary

test1转换为从节点

# umount /mydata/
# drbdadm secondary mydrbd

基于drbd&&corosync实现高可用mysql_mysql_14

test节点上操作

# drbdadm primary mydrbd

查看状态

基于drbd&&corosync实现高可用mysql_mysql_15

挂载,查看是否同步了数据

基于drbd&&corosync实现高可用mysql_mysql_16

DRBD功能准备完成,下面进行drbd+corosync实现高可用mysql

基于drbd+corosync实现高可用mysql

安装相关的rpm包

# yum -y --nogpgcheck localinstall
cluster-glue-1.0.6-1.6.el5.i386.rpm
cluster-glue-libs-1.0.6-1.6.el5.i386.rpm
corosync-1.4.5-1.1.i386.rpm
corosynclib-1.4.5-1.1.i386.rpm
heartbeat-3.0.3-2.3.el5.i386.rpm
heartbeat-libs-3.0.3-2.3.el5.i386.rpm
libesmtp-1.0.4-5.el5.i386.rpm
openais-1.1.3-1.6.el5.i386.rpm
openaislib-1.1.3-1.6.el5.i386.rpm
pacemaker-1.1.5-1.1.el5.i386.rpm
pacemaker-cts-1.1.5-1.1.el5.i386.rpm
pacemaker-libs-1.1.5-1.1.el5.i386.rpm
resource-agents-1.0.4-1.1.el5.i386.rpm

在节点test1上的操作配置

准备配置文件

# cd /etc/corosync/
# cp corosync.conf.example corosync.conf
# vim corosync.conf

修改组播相关内容

totem {
              secauth:on
       interface{
                     bindnetaddr:172.16.0.0
                     mcastaddr:239.151.51.51

添加的内容

service {
       ver: 0
       name: pacemaker
}
aisexec {
       user: root
       group: root
}

创建日志文件目录

# mkdir /var/log/cluster
# ssh test2 'mkdir /var/log/cluster'

生成一对密钥

# corosync-keygen

复制密钥文件与配置文件到test2节点

# scp -p authkey corosync.conf test2:/etc/corosync/

启动corosync基于drbd&&corosync实现高可用mysql_mysql_17

查看节点状态信息基于drbd&&corosync实现高可用mysql_mysql_18

开始crm配置

说明:因为没有stonith设备并且只有两个节点所以需要禁用stonith功能,并更改节点默认属性

crm(live)configure#property stonith-enabled=false
crm(live)configure#verify
crm(live)configure#property no-quorum-policy=ignore
crm(live)configure#verify
crm(live)configure#commit

定义资源粘性,配置在当前节点test1粘性

crm(live)configure#rsc_defaults resource-stickiness=100
crm(live)configure#verify
crm(live)configure#commit

全局资源配置信息查看

基于drbd&&corosync实现高可用mysql_mysql_19

资源配置

(1)将drbd配置为基本资源

(2)将drbd配置为克隆类资源

资源代理查看

crm(live)# ra
crm(live)ra#providers drbd

查看元数据信息

crm(live)ra# metaocf:heartbeat:drbd

定义一个主资源与一个主从类资源

crm(live)#configure
crm(live)configure#primitive mydrbdservice ocf:heartbeat:drbd params drbd_resource=mydrbd op starttimeout=240 op stop timeout=100 op monitor role=Master interval=20 timeout=30op monitor role=Slave interval=30 timeout=30
crm(live)configure#ms ms_mydrbd mydrbdservice meta master-max=1 master-node-max=1 clone-max=2clone-node-max=1 notify=true
crm(live)configure#verify
crm(live)configure#commit

状态信息查看

基于drbd&&corosync实现高可用mysql_drdb+corosync_20

主从转换验证

crm(live)# node
crm(live)node#standby
crm(live)node#online test1.magedu.com

基于drbd&&corosync实现高可用mysql_mysql_21

配置资源,通过NFS使其能够实现自动挂载

Filesystem资源添加

crm(live)configure#primitive mystore ocf:heartbeat:Filesystem params device=/dev/drbd0directory=/mydata fstype=ext3 op start timeout=60 op stop timeout=60

定义排列colocation使Filesystem必须跟主节点在一起

crm(live)configure#colocation mystore_with_ms_mydrbd inf: mystore ms_mydrbd:Master

定义排列order约束

crm(live)configure#order mystore_after_ms_mydrbd mandatory: ms_mydrbd:promote mystore:start

节点状态信息查看

基于drbd&&corosync实现高可用mysql_mysql_22

在节点test2上查看是否成功挂载

基于drbd&&corosync实现高可用mysql_drdb+corosync_23

主备节点切换验证

crm(live)# node
crm(live)node#standby test2.magedu.com

状态信息查看

基于drbd&&corosync实现高可用mysql_mysql_24

查看test1节点上Filesystem是否成功挂载

基于drbd&&corosync实现高可用mysql_drdb+corosync_25

安装配置mysql服务

现在的主节点是test1,首先在节点1上配置mysql服务

创建mysql用户与mysql

# groupadd -g3306 mysql
# useradd -g 3306-u 3306 -M mysql

准备mysql

# tar xf mysql-5.5.28-linux2.6-i686.tar.gz-C /usr/local/
# ln -sv mysql-5.5.28-linux2.6-i686mysql

准备数据目录

# cd /mydata
# mkdir data
# chownmysql.mysql data -R

更改mysql文件属主属组

# cd/usr/local/mysql
# chown root.mysql/usr/local/mysql/* -R

准备配置文件与服务脚本

# cd/usr/local/mysql
# cpsupport-files/my-large.cnf /etc/my.cnf
# cpsupport-files/mysql.server /etc/init.d/

修改配置文件

# vim /etc/my.cnf

添加以下内容(线程数与datadir目录位置)

thread_concurrency= 2
datadir=/mydata/data

设置mysql服务不能开机启动

# chkconfig --addmysqld
# chkconfigmysqld off

初始化mysql

# cd/usr/local/mysql
#scripts/mysql_install_db --user=mysql --datadir=/mydata/data

启动mysql

基于drbd&&corosync实现高可用mysql_drdb+corosync_26

test2节点mysql服务配置与test1节点相同,说明流程如下

1 关闭节点test1 mysql服务

2 把节点test2 转换成Master

crm(live)# node
crm(live)node#standby test1.magedu.com
crm(live)node#online test1.magedu.com

基于drbd&&corosync实现高可用mysql_mysql_27

3 开始配置test2mysql服务流程与test1相同(不执行初始化操作)

配置mysql服务为高可用

添加mysql为集群资源

crm(live)configure#primitive mysqld lsb:mysqld
crm(live)configure#verify
crm(live)configure#

定义colocation约束(mysqlmystore在一起;即与主节点在一起)

crm(live)configure#colocation mysql_with_mystore inf: mysqld mystore
crm(live)configure#verify

定义order约束(最后启动mysql服务)

crm(live)configure#order mysqld_after_mystore mandatory: mystore mysqld
crm(live)configure#verify
crm(live)configure#commit

节点状态信息查看

基于drbd&&corosync实现高可用mysql_drdb+corosync_28

test2mysql服务启动状态查看

基于drbd&&corosync实现高可用mysql_drdb+corosync_29

主从节点切换测试

crm(live)# node
crm(live)node#standby test2.magedu.com
crm(live)node#online test2.magedu.com

查看状态信息

基于drbd&&corosync实现高可用mysql_drdb+corosync_30

查看test1节点是否成功运行mysql服务

基于drbd&&corosync实现高可用mysql_mysql_31

到这里一个基于drbd与corosync实现的高可用mysql就完成了,希望能为大家提供一些帮助