基于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的源码编译
在源码编译中,会缺少很多很多安装包,很难一步完成,根据错误提示一步一步解决依赖性就好。
[[email protected] ~]# tar zxf drbd-3.4.2.tar.gz
[[email protected] ~]# ls
drbd-3.4.2 drbd-3.4.2.tar.gz
[[email protected] ~]# cd drbd-3.4.2
[[email protected] 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':
config.log’ for more details
configure: error: no acceptable C compiler found in $PATH
See
[[email protected] drbd-3.4.2]# yum install -y gcc
[[email protected] 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
[[email protected] drbd-3.4.2]# ./configure –enable-spec –with-km
[[email protected] drbd-3.4.2]# yum install -y flex
[[email protected] drbd-3.4.2]# yum install -y rpm-build ##安装rpmbuild命令
[[email protected] drbd-3.4.2]# rpmbuild -bb drbd.spec
error: File /root/rpmbuild/SOURCES/drbd-3.4.2.tar.gz: No such file or directory
[[email protected] drbd-3.4.2]# cp ~/drbd-3.4.2.tar.gz /root/rpmbuild/SOURCES/
[[email protected] drbd-3.4.2]# rpmbuild -bb drbd.spec ##编译生成 drbd rpm 包
[[email protected] 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
[[email protected] drbd-3.4.2]# yum install -y kernel-devel
[[email protected] drbd-3.4.2]# rpmbuild -bb drbd-km.spec ##编译drbd 内核模块
[[email protected] ~]# cd rpmbuild/RPMS/x36_64/
[[email protected] 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
[[email protected] x36_64]# rpm -ivh * ##安装所有生成的rpm包
[[email protected] x36_64]# scp * server3: ##复制给另一台主机安装
[[email protected] ~]# 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
[[email protected] ~]# 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
[[email protected] x36_64]# cd /etc/drbd.d/
[[email protected] 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;
}
}
[[email protected] drbd.d]# scp sqldata.res [email protected]:/etc/drbd.d/
在两个主机做同样的配置
[email protected]’s password:
sqldata.res 100% 200 0.2KB/s 00:00
3.启动drbd
[[email protected] 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.
[[email protected] drbd.d]# /etc/init.d/drbd start
Starting DRBD resources: [
create res: sqldata
prepare disk: sqldata
adjust disk: sqldata
adjust net: sqldata
]
.
[[email protected] drbd.d]# cat /proc/drbd
version: 3.4.2 (api:1/proto:36-101)
GIT-hash: 2ad5f350d211223213d6dcadc3dd43360321020c build by [email protected], 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是磁盘读信息
[[email protected] ~]# drbdadm create-md sqldata
Writing meta data…
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
[[email protected] ~]# /etc/init.d/drbd start
Starting DRBD resources: [
create res: sqldata
prepare disk: sqldata
adjust disk: sqldata
adjust net: sqldata
]
[[email protected] ~]# cat /proc/drbd
version: 3.4.2 (api:1/proto:36-101)
GIT-hash: 2ad5f350d211223213d6dcadc3dd43360321020c build by [email protected], 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.存储同步
[[email protected] drbd.d]# drbdadm primary sqldata –force
由于默认没有主次节点之分,因而需要设置两个主机的主次节点,选择需要设置为主节点的主机,然后执行这个命令将server2设置为主节点
[[email protected] drbd.d]# cat /proc/drbd
version: 3.4.2 (api:1/proto:36-101)
GIT-hash: 2ad5f350d211223213d6dcadc3dd43360321020c build by [email protected], 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,说明已经同步完成了。
[[email protected] ~]# cat /proc/drbd
version: 3.4.2 (api:1/proto:36-101)
GIT-hash: 2ad5f350d211223213d6dcadc3dd43360321020c build by [email protected], 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,这样会导致在后面同步资源时出现下面的错误,无法找到你提供的设备
[[email protected] 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
]
[[email protected] drbd.d]# cat /proc/drbd
version: 3.4.2 (api:1/proto:36-101)
GIT-hash: 2ad5f350d211223213d6dcadc3dd43360321020c build by [email protected], 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
[[email protected] ~]# cat /proc/drbd
version: 3.4.2 (api:1/proto:36-101)
GIT-hash: 2ad5f350d211223213d6dcadc3dd43360321020c build by [email protected], 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结合使用
[[email protected] drbd.d]# mkfs.ext4 /dev/drbd1 ##在主节点对磁盘进行格式化
[[email protected] drbd.d]# yum install mysql-server -y ##安装mysql
[[email protected] ~]# yum install mysql-server -y
[[email protected] drbd.d]# mount /dev/drbd1 /var/lib/mysql/ ##将存储挂载在数据库
[[email protected] drbd.d]# ll -d /var/lib/mysql/
drwxr-xr-x 3 root root 4096 Jul 31 22:21 /var/lib/mysql/
[[email protected] drbd.d]# chown mysql.mysql /var/lib/mysql/
[[email protected] drbd.d]# /etc/init.d/mysqld start
Initializing MySQL database: Installing MySQL system tables…
[[email protected] drbd.d]# ls /var/lib/mysql/ ##数据库里已经有信息
ibdata1 ib_logfile0 ib_logfile1 lost+found mysql mysql.sock test
[[email protected] ~]# 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))
[[email protected] ~]# /etc/init.d/mysqld stop
Stopping mysqld: [ OK ]
[[email protected] ~]# umount /var/lib/mysql/
[[email protected] ~]# drbdadm secondary sqldata
[[email protected] ~]# 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 ###在物理机上###
[[email protected] Desktop]# cd /etc/cluster/
[[email protected] 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)
[[email protected] ~]# 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