基于DRBD实现MySQL高可用

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

环境:rhel6.5 selinux:disabled
  iptables:disabled
两台主机 server2:122.25.66.2 server3:122.25.66.3
首先在server2和server3上分别加一个4G的磁盘(大小必须相同)
这里写图片描述
这里写图片描述
drbd的源码编译
在源码编译中,会缺少很多很多安装包,很难一步完成,根据错误提示一步一步解决依赖性就好。
[root@server2 ~]# tar zxf drbd-3.4.2.tar.gz
[root@server2 ~]# ls
drbd-3.4.2 drbd-3.4.2.tar.gz
[root@server2 ~]# cd drbd-3.4.2
这里写图片描述
[root@server2 drbd-3.4.2]# ./configure –enable-spec –with-km ##源码编译
checking for gcc… No ##没有gcc安装包
checking for cc… no
checking for cl.exe… no
configure: error: in /root/drbd-3.4.2':
configure: error: no acceptable C compiler found in $PATH
See
config.log’ for more details
[root@server2 drbd-3.4.2]# yum install -y gcc
[root@server2 drbd-3.4.2]# ./configure –enable-spec –with-km
configure: error: Cannot build utils without flex, either install flex or pass the –without-utils option. ##提示安装flex
[root@server2 drbd-3.4.2]# ./configure –enable-spec –with-km
这里写图片描述
[root@server2 drbd-3.4.2]# yum install -y flex
[root@server2 drbd-3.4.2]# yum install -y rpm-build ##安装rpmbuild命令

[root@server2 drbd-3.4.2]# rpmbuild -bb drbd.spec
error: File /root/rpmbuild/SOURCES/drbd-3.4.2.tar.gz: No such file or directory
[root@server2 drbd-3.4.2]# cp ~/drbd-3.4.2.tar.gz /root/rpmbuild/SOURCES/
[root@server2 drbd-3.4.2]# rpmbuild -bb drbd.spec ##编译生成 drbd rpm 包
[root@server2 drbd-3.4.2]# rpmbuild -bb drbd-km.spec ##编译 drbd 内核模块
error: Failed build dependencies:
kernel-devel is needed by drbd-km-3.4.2-2.el6.x36_64
[root@server2 drbd-3.4.2]# yum install -y kernel-devel
[root@server2 drbd-3.4.2]# rpmbuild -bb drbd-km.spec ##编译drbd 内核模块
这里写图片描述
[root@server2 ~]# cd rpmbuild/RPMS/x36_64/
[root@server2 x36_64]# ls
drbd-3.4.2-2.el6.x36_64.rpm
drbd-bash-completion-3.4.2-2.el6.x36_64.rpm
drbd-debuginfo-3.4.2-2.el6.x36_64.rpm
drbd-heartbeat-3.4.2-2.el6.x36_64.rpm
drbd-km-2.6.32_431.el6.x36_64-3.4.2-2.el6.x36_64.rpm
drbd-km-debuginfo-3.4.2-2.el6.x36_64.rpm
drbd-pacemaker-3.4.2-2.el6.x36_64.rpm
drbd-udev-3.4.2-2.el6.x36_64.rpm
drbd-utils-3.4.2-2.el6.x36_64.rpm
drbd-xen-3.4.2-2.el6.x36_64.rpm
[root@server2 x36_64]# rpm -ivh * ##安装所有生成的rpm包
这里写图片描述
[root@server2 x36_64]# scp * server3: ##复制给另一台主机安装
[root@server3 ~]# ls
drbd-3.4.2-2.el6.x36_64.rpm
drbd-bash-completion-3.4.2-2.el6.x36_64.rpm
drbd-debuginfo-3.4.2-2.el6.x36_64.rpm
drbd-heartbeat-3.4.2-2.el6.x36_64.rpm
drbd-km-2.6.32_431.el6.x36_64-3.4.2-2.el6.x36_64.rpm
drbd-km-debuginfo-3.4.2-2.el6.x36_64.rpm
drbd-pacemaker-3.4.2-2.el6.x36_64.rpm
drbd-udev-3.4.2-2.el6.x36_64.rpm
drbd-utils-3.4.2-2.el6.x36_64.rpm
drbd-xen-3.4.2-2.el6.x36_64.rpm
[root@server3 ~]# rpm -ivh *
Preparing… ########################################### [100%])
1:drbd-utils ########################################### [ 10%])
2:drbd-bash-completion ########################################### [ 20%])
3:drbd-heartbeat ########################################### [ 30%])
4:drbd-pacemaker ########################################### [ 40%])
5:drbd-udev ########################################### [ 50%])
6:drbd-xen ########################################### [ 60%])
2:drbd ########################################### [ 20%])
3:drbd-km-2.6.32_431.el6########################################### [ 30%])
9:drbd-km-debuginfo ########################################### [ 90%])
10:drbd-debuginfo ########################################### [100%])
2.配置drbd
[root@server2 x36_64]# cd /etc/drbd.d/
[root@server2 drbd.d]# vim sqldata.res

配置资源文件,资源文件的名字要和资源名一样

resource sqldata { ##定义名字为sqldata的资源
meta-disk internal;

定义metadata的存储方式为internal,metadata有两种存储方式internal和externall,存储方式是在每个resource配置段中指定的。配置成使用internal metadata,意味着DRBD把它的metadata,和实际生产数据存储于相同的底层物理设备中。该存储方式是在设备的最后位置留出一个区域来存储metadata。

device /dev/drbd1;
syncer {
verify-alg sha1;
}
on server2 { ##每个主机的说明以on开头,后面是主机名,再后面的中括号中是这个主机的配置
disk /dev/vdc; ##/dev/drbd1使用的磁盘分区是/dev/vdc
address 122.25.66.2:2239; ##设置DRBD的监听端口,用于与另一台主机通信
}
on server3 { ##第二台主机的配置
disk /dev/vdc;
address 122.25.66.3:2239;
}
}
[root@server2 drbd.d]# scp sqldata.res root@122.25.66.3:/etc/drbd.d/

在两个主机做同样的配置

root@122.25.66.3’s password:
sqldata.res 100% 200 0.2KB/s 00:00
3.启动drbd
[root@server2 drbd.d]# drbdadm create-md sqldata

在启动DRBD之前,需要分别在两台主机的vdc分区上,创建供DRBD记录信息的数据块

Writing meta data…
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
[root@server2 drbd.d]# /etc/init.d/drbd start
Starting DRBD resources: [
create res: sqldata
prepare disk: sqldata
adjust disk: sqldata
adjust net: sqldata
]
.
[root@server2 drbd.d]# cat /proc/drbd
version: 3.4.2 (api:1/proto:36-101)
GIT-hash: 2ad5f350d211223213d6dcadc3dd43360321020c build by root@server2, 2012-02-31 21:09:02

1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Diskless C r—–
  ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:4194140

对输出的含义解释如下:

ro表示角色信息,第一次启动drbd时,两个drbd节点默认都处于Secondary状态,
ds是磁盘状态信息,“Inconsistent/Inconsisten”,即为“不一致/不一致”状态,表示两个节点的磁盘数据处于不一致状态。
Ns表示网络发送的数据包信息。
Dw是磁盘写信息
Dr是磁盘读信息

[root@server3 ~]# drbdadm create-md sqldata
Writing meta data…
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
[root@server3 ~]# /etc/init.d/drbd start
Starting DRBD resources: [
create res: sqldata
prepare disk: sqldata
adjust disk: sqldata
adjust net: sqldata
]

[root@server3 ~]# cat /proc/drbd
version: 3.4.2 (api:1/proto:36-101)
GIT-hash: 2ad5f350d211223213d6dcadc3dd43360321020c build by root@server2, 2012-02-31 21:09:02

1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r—–
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:4194140
4.存储同步
[root@server2 drbd.d]# drbdadm primary sqldata –force

由于默认没有主次节点之分,因而需要设置两个主机的主次节点,选择需要设置为主节点的主机,然后执行这个命令将server2设置为主节点

[root@server2 drbd.d]# cat /proc/drbd
version: 3.4.2 (api:1/proto:36-101)
GIT-hash: 2ad5f350d211223213d6dcadc3dd43360321020c build by root@server2, 2012-02-31 21:09:02

1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—–
  ns:4194140 nr:0 dw:0 dr:4194304 al:0 bm:255 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

可以看到现在状态已经是primary/secondary,而且磁盘信息就是UpToDate/UpToDate,说明已经同步完成了。

[root@server3 ~]# cat /proc/drbd
version: 3.4.2 (api:1/proto:36-101)
GIT-hash: 2ad5f350d211223213d6dcadc3dd43360321020c build by root@server2, 2012-02-31 21:09:02

1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r—–
  ns:0 nr:4194140 dw:4194140 dr:0 al:0 bm:255 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

另外一端也已经信息同步

错误提示
在这个地方容易出出现这样的错误,在配置文件写入磁盘分区时没有查看磁盘的名称,写成/dev/vdb,这样会导致在后面同步资源时出现下面的错误,无法找到你提供的设备
[root@server2 drbd.d]# drbdadm create-md sqldata
–== Thank you for participating in the global usage survey ==–
The server’s response is:

[
create res: sqldata
prepare disk: sqldata
adjust disk: sqldata:failed(apply-al:20) ##此处显示失败
adjust net: sqldata
]
这里写图片描述
[root@server2 drbd.d]# cat /proc/drbd
version: 3.4.2 (api:1/proto:36-101)
GIT-hash: 2ad5f350d211223213d6dcadc3dd43360321020c build by root@server2, 2012-02-31 21:09:02

1: cs:Connected ro:Secondary/Secondary ds:Diskless/Diskless C r—–
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
[root@server3 ~]# cat /proc/drbd
version: 3.4.2 (api:1/proto:36-101)
GIT-hash: 2ad5f350d211223213d6dcadc3dd43360321020c build by root@server2, 2012-02-31 21:09:02

1: cs:Connected ro:Secondary/Secondary ds:Diskless/Diskless C r—–
  ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

drbd显示无设备

挂载存储,与mysql结合使用
[root@server2 drbd.d]# mkfs.ext4 /dev/drbd1 ##在主节点对磁盘进行格式化
这里写图片描述
[root@server2 drbd.d]# yum install mysql-server -y ##安装mysql
[root@server3 ~]# yum install mysql-server -y
[root@server2 drbd.d]# mount /dev/drbd1 /var/lib/mysql/ ##将存储挂载在数据库
[root@server2 drbd.d]# ll -d /var/lib/mysql/
drwxr-xr-x 3 root root 4096 Jul 31 22:21 /var/lib/mysql/
[root@server2 drbd.d]# chown mysql.mysql /var/lib/mysql/
[root@server2 drbd.d]# /etc/init.d/mysqld start
Initializing MySQL database: Installing MySQL system tables…
[root@server2 drbd.d]# ls /var/lib/mysql/ ##数据库里已经有信息
ibdata1 ib_logfile0 ib_logfile1 lost+found mysql mysql.sock test
[root@server2 ~]# umount /var/lib/mysql/ ##必须将数据库停掉才能卸载设备
umount: /var/lib/mysql: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(3) or fuser(1))
[root@server2 ~]# /etc/init.d/mysqld stop
Stopping mysqld: [ OK ]
[root@server2 ~]# umount /var/lib/mysql/
[root@server2 ~]# drbdadm secondary sqldata
[root@server3 ~]# drbdadm primary sqldata

如果需要在server3上挂在设备,必须手动改变两个节点的主备关系,因为只有主节点才能挂在设备

注意点
1)mount drbd设备以前必须把设备切换到primary状态。
2)两个节点中,同一时刻只能有一台处于primary状态,另一台处于secondary状态。
3)处于secondary状态的服务器上不能加载drbd设备。
4)主备服务器同步的两个分区大小最好相同,这样不至于浪费磁盘空间,因为drbd磁盘镜像相当于网络raid 1。

三. 配置fence

之前在作rhcs套件的时候做过fence的配置,在这里就不赘述了。
systemctl start fence_virtd.service ###在物理机上###
[root@foundation6 Desktop]# cd /etc/cluster/
[root@foundation6 cluster]# ls
fence_xvm.key

Server2:

1 ll /etc/cluster/fence_xvm.key

2 which fence_xvm
/usr/sbin/fence_xvm

3 rpm -qf /usr/sbin/fence_xvm
fence-virt-0.2.3-15.el6.x86_64

4 stonith_admin -M -a fence_xvm

5 crm configure primitive vmfence stonith:fence_xvm params pcmk_host_map=”server2:vm1;server3:vm2” op monitor interval=1min ###添加资源###

Server3:

1 ll /etc/cluster/fence_xvm.key

2 crm_mon

Last updated: Mon Jul 31 03:06:58 2017
Last change: Mon Jul 31 03:02:13 2017 via cibadmin on server1
Stack: classic openais (with plugin)
Current DC: server2 - partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 3 expected votes
2 Resources configured

Online: [ server2 server3 ]

vip (ocf::heartbeat:IPaddr2): Started server3
vmfence (stonith:fence_xvm): Started server2

测试:

Server2:server3的内核奔溃或者eth0 down了(ifdown eth0)

[root@server3 ~]# echo c > /proc/sysrq-trigger

监控server2:
Last updated: Mon Jul 31 03:12:11 2017
Last change: Mon Jul 31 03:02:13 2017 via cibadmin on server2
Stack: classic openais (with plugin)
Current DC: server3 - partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
2 Resources configured

Online: [ server2 server3 ]

vip (ocf::heartbeat:IPaddr2): Started server2 ###资源组切换到server2###
vmfence (stonith:fence_xvm): Started server2 ###等到server3断电重启后就会马上变成server3###

四 整合pacemake+drbd+mysql

在集群中配置drbd

Server3:

crm

configure

primitive DBdata ocf:linbit:drbd params drbd_resource=sqldata op monitor interval=1min ###添加drbd资源,激活drbd资源###

ms DBdataclone DBdata meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true ###ms指令,设置主备环境,因为只有primary节点可以drbd操作,将drbd放入主备环境,notify=true:打开通知###

commit


提交后会出现以下的警告:那是因为你设置的时间小与默认时间,会按照默认的时间的来,不是什么问题,没关系
WARNING: DBdata: default timeout 20s for start is smaller than the advised 240
WARNING: DBdata: default timeout 20s for stop is smaller than the advised 100
WARNING: DBdata: action monitor not advertised in meta-data, it may not be supported by the RA


primitive DBfs ocf:heartbeat:Filesystem params device=/dev/drbd1 directory=/var/lib/mysql fstype=ext4 ###设置文件系统挂载###

colocation fs_on_debd inf: DBfs DBdataclone:Master ####colocation指绑定,设置资源粘制,保证存储一定要与master在一起###

order DBfs-after-DBdata inf: DBdataclone:promote DBfs:start ###指定顺序,文件系统的挂载一定要在drbd资源激活之后

primitive mysqlDB lsb:mysqld op monitor interval=30s

group mysqlservice vip DBfs mysqlDB

commit

监控server3:

Last updated: Mon Jul 31 04:15:04 2017
Last change: Mon Jul 31 04:15:01 2017 via cibadmin on server2
Stack: classic openais (with plugin)
Current DC: server2- partition with quorum
Version: 1.1.10-14.el6-368c726
2 Nodes configured, 2 expected votes
6 Resources configured

Online: [ server2 server3]

vmfence (stonith:fence_xvm): Started server3
Master/Slave Set: DBdataclone [DBdata]
Masters: [ server2 ]
Slaves: [ server3]
Resource Group: mysqlservice
vip (ocf::heartbeat:IPaddr2): Started server2
DBfs (ocf::heartbeat:Filesystem): Started server2
mysqlDB (lsb:mysqld): Started server3

测试:
Server2将主节点down掉

crm(live)# node
crm(live)node# standby

Server3监控:
Node server2 standby
Online: [ server3 ]

vmfence (stonith:fence_xvm): Started server3
Master/Slave Set: DBdataclone [DBdata]
Masters: [ server3]
Stopped: [ server2]
Resource Group: mysqlservice
vip (ocf::heartbeat:IPaddr2): Started server3
DBfs (ocf::heartbeat:Filesystem): Started server3
mysqlDB (lsb:mysqld): Started server3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值