您的位置:首页 > 运维架构 > 网站架构

基于DRBD实现MySQL高可用

2012-12-01 19:08 369 查看
DRBD:分布式复制块设备

DRBD---Distributed Replicated Block Device 是一种基于Linux的软件组件, 它是由内核模块和相关程序而组成的,通过网络镜像促进共享存储系统的替换。也就是说:当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证 实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。

DRBD的工作原理图:




下面我们基于DRBD来实现MySQL高可用的目的
环境:Red Hat Enterprise Linux Server release 5.8
节点1:172.16.9.2 node2.test.com
节点2:172.16.9.3 node3.test.com

配置过程:
一、配置高可用的前提

1、主机名和'uname -n'的结果保持一致
Node2:
sed -i 's@\(HOSTNAME=\).*@\1node2.test.com@g'
hostname node2.test.com

Node3:
sed -i 's@\(HOSTNAME=\).*@\1node3.test.com@g'
hostname node3.test.com

2、双方可以解析彼此的主机名:2节点都要配置
vim /etc/hosts
172.16.9.2      node2.test.com      node2
172.16.9.3      node3.test.com      node3

3、建立双机互信:2节点上都要配置
ssh-keygen -t rsa -P ""
ssh-copy-id -i /root/.ssh/id_rsa.pub dr2  root@node3

4、时间同步:
date '12011340';ssh node3 'date 12011340'

5、在两节点上分别创建一个磁盘分区以供之后使用(这里不再给出集体步骤)
注:2节点磁盘分区大小必须保持一致

二、安装drbd所需的rpm包
drbd共有两部分组成:内核模块和用户空间的管理工具
内核模块相关包:最新版本:drbd83-8.3.13
管理工具相关包:对应版本:kmod-drbd83-8.3.13
下载地址为:http://mirrors.sohu.com/centos/5.8/extras/i386/RPMS/

rpm -ivh drbd83-8.3.13-2.el5.centos.i386.rpm kmod-drbd83-8.3.13-1.el5.centos.i686.rpm

提供配置文件,将原来的文件覆盖
cp /usr/share/doc/drbd83-8.3.13/drbd.conf /etc

配置/etc/drbd.d/global-common.conf,修改为对应以下内容
global {
usage-count no;
# minor-count dialog-refresh disable-ip-verification
}

##########中间没做修改,为默认###############

disk {
on-io-error detach;
#fencing resource-only;
}

net {
cram-hmac-alg "sha1";
shared-secret "mydrbdlab";
}

syncer {
rate 1000M;
}
}

定义一个资源mydrbd;
resource mydrbd {
on node2.test.com {
device /dev/drbd0;
disk /dev/sda5;
address 172.16.9.2:7789;
meta-disk internal;
}
on node3.test.com {
device /dev/drbd0;
disk /dev/sda5;
address 172.16.9.3:7789;
meta-disk internal;
}
}

配置的文件全部同步到另外一个节点之上
scp -r /etc/drbd.* node3:/etc/

初始化资源并启动服务(2节点都要配置)
drbdadm create-md mydrbd
service drbd start

查看启动状态
drbd-overview
0:mydrbd  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----


查看状态,同步已经开始
[root@node2 ~]# drbd-overview
0:mydrbd  SyncTarget Secondary/Secondary Inconsistent/UpToDate C r-----
[=>..................] sync'ed: 13.9% (4120/4776)M


将当前节点设置为主节点
drbdsetup /dev/drbd0 primary –o

再次查看状态
[root@node2 ~]# drbd-overview
0:mydrbd  Connected Primary/Secondary UpToDate/UpToDate C r-----

当前节点已经是主节点

对drbd设备进行格式化(只能在主节点上进行)
mke2fs -j -L DRBD /dev/drbd0

一切配置完成就可以挂载使用了

三、安装配置mysql(这些步骤全部在主节点上完成)
这里使用的是绿色版mysql-5.5.28-linux2.6-i686.tar.gz
解压到/usr/local路径下
tar xvf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local/
创建挂载drbd设备的目录及mysql用户
mkdir /data/mydata -pv
groupadd -r -g 333 mysql
useradd -r -g 333 -u 333 mysql
chown -R mysql:mysql /data/mydata

挂载drbd设备
mount /dev/drbd0 /data/mydata

配置mysql
cd /usr/local
ln -sv mysql-5.5.28-linux2.6-i686 mysql
cd mysql
chown -R root:mysql .

初始化mysql
scripts/mysql_install_db --user=myql --datadir=/data/mydata

提供脚本和配置文件
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
cp support-files/my-large.cnf /data/mydata/my.cnf

编辑两个文件,在里面添加
datadir=/data/mydata

提供mysql的路径
vim /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin

source /etc/profile.d/mysql.sh   #使之生效


一切配置完毕,启动mysql服务
service mysqld start
进入mysql,手动创建一个数据库(方便后续测试)
退出mysql,并关闭服务,不让其开机自动启动
service mysqld stop
chkconfig mysqld off

切换主备节点,在另一个节点上配置mysql(注:不必再一次初始化mysql了)
挂载drbd设备,配置mysql过程和第一个节点一样,配置后可以登录mysql看下是否有刚刚创建的数据库;如果一切正常,停止mysql服务,不让其自动启动。

四、配置高可用服务(这里采用corosync + pacemaker)

安装高可用所需要的rpm包:下载地址:http://clusterlabs.org/rpm/
cluster-glue-1.0.6-1.6.el5.i386.rpm
libesmtp-1.0.4-5.el5.i386.rpm
cluster-glue-libs-1.0.6-1.6.el5.i386.rpm
pacemaker-1.1.5-1.1.el5.i386.rpm
corosync-1.2.7-1.1.el5.i386.rpm
pacemaker-cts-1.1.5-1.1.el5.i386.rpm
corosynclib-1.2.7-1.1.el5.i386.rpm
pacemaker-libs-1.1.5-1.1.el5.i386.rpm
heartbeat-3.0.3-2.3.el5.i386.rpm
perl-TimeDate-1.16-5.el5.noarch.rpm
heartbeat-libs-3.0.3-2.3.el5.i386.rpm
resource-agents-1.0.4-1.1.el5.i386.rpm

这里包含所有依赖的包,yum 安装即可:
yum –y localinstall –nogpgcheck *rpm
修改配置文件:
cd  /etc/corosync
cp corosync.conf.example corosync.conf

vim corosync.conf
添加如下内容
service {
ver:  0
name: pacemaker
}

aisexec {
user:   root
group:  root
}

同时将原来内容做下修改:
secauth: on
bindnetaddr: 172.16.0.0     #修改为主机所在网段
to_syslog: no

生成节点间通信时用到的认证密钥文件:
corosync-keygen

将corosync.conf和authkey复制至另一节点:
scp -r corocync.conf authkey node3:/etc/corosync/

分别为两个节点创建corosync生成的日志所在的目录:
mkdir /var/log/cluster
ssh node3  'mkdir /var/log/cluster'

接下来就可以启动corosync服务了
Service corosync start
Ssh node3 'service corosync start'

五、定义资源

首先定义高可用集群的一些属性
crm
ccrm(live)# configure
crm(live)configure# property no-quorum-policy=ignore    #取消法定票数的机制
crm(live)configure# property stonith-enabled=false  #禁用隔离设备

接下来定义drbd资源
crm(live)configure# primitive drbd ocf:linbit:drbd params drbd_resource="mydrbd" op start timeout=240 op stop timeout=240
#根据自己需要定义资源的名字,类型等
crm(live)configure# master ms_mydrbd drbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
#master关键字定义主从资源,后面指定资源name,meta 指定额外参选数,master-max指定最多有几个master,
#master-node-max指定一个节点最多运行几个master,clone-max指定有几个clone资源,
#clone-node-max指定一个节点最多运行几个clone资源,notify指当出现故障时是否通知对方

定义文件系统资源
crm(live)configure# primitive myFS ocf:heartbeat:Filesystem params device="dev/drbd0" directory="/data/mydata" fstype="ext3" op start timeout=60 op stop timeout=60

定义资源约束
crm(live)configure# colocation myFS_on_ms_mydrbd inf: myFS ms_mydrbd:Master
crm(live)configure# order myFS_after_ms_mydrbd mandatory: ms_mydrbd:promote myFS:start
#将资源系统和drbd资源绑定在一个节点上,并定义其启动次序
crm(live)configure# verify
crm(live)configure# commit

查看刚定义的资源的状态
crm status
============
Last updated: Mon Nov 12 16:45:35 2012
Stack: openais
Current DC: node2.test.com - partition with quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
2 Resources configured.
============

Online: [ node3.test.com node2.test.com ]

Master/Slave Set: ms_mydrbd [drbd]
Masters: [ node3.test.com ]
Slaves: [ node2.test.com ]
myFS   (ocf::heartbeat:Filesystem):    Started node3.test.com

定义IP资源及与其相关的约束
crm(live)configure# primitive IP ocf:heartbeat:IPaddr params ip=172.16.66.1
crm(live)configure# colocation IP_with_ms_mydrbd_master inf: IP ms_mydrbd:Master

查看状态
crm status
============
Last updated: Mon Nov 12 16:54:25 2012
Stack: openais
Current DC: node2.test.com - partition with quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
4 Resources configured.
============

Online: [ node3.test.com node2.test.com ]

Master/Slave Set: ms_mydrbd [drbd]
Masters: [ node3.test.com ]
Slaves: [ node2.test.com ]
myFS   (ocf::heartbeat:Filesystem):    Started node3.test.com
MYSQL  (lsb:mysqld):   Started node3.test.com
IP (ocf::heartbeat:IPaddr):    Started node3.test.com

这时就可以看到资源在node3 上已经启动起来了,进入mysql测试能否正常运行,可以的话一个简单的基于DRBD的mysql高可用就完工了!!

测试高可用资源能否实现故障转移,接下来可以手动将node3 故障:
crm node standby
##等待一会看资源是否转移
crm(live)# status
============
Last updated: Mon Nov 12 17:09:50 2012
Stack: openais
Current DC: node2.test.com - partition with quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
4 Resources configured.
============

Node node3.test.com: standby
Online: [ node2.test.com ]

Master/Slave Set: ms_mydrbd [drbd]
Masters: [ node2.test.com ]
Stopped: [ drbd:1 ]
myFS   (ocf::heartbeat:Filesystem):    Started node2.test.com
MYSQL  (lsb:mysqld):   Started node2.test.com
IP (ocf::heartbeat:IPaddr):    Started node2.test.com

看到资源转移成功,说明高可用集群构建成功!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql DRBD