一、环境介绍

1、DRDB存储软件
DRBD是一个软件来实现数据实时、同步、异步的数据镜像块存储复制解决方案,主要功能是通过Linux内核实现。
DRBD类似网络RAID-1功能写入本地的文件会通过网络以相同方式写在另一文件系统。
对于实现Mysql高可用,DRBD性能比较差,因为每次更新的数据,都会全部同步一次。
三种模式:
单主模式:具有故障转移功能,高可用集群方式采用。
双主模式:需要采用共享cluster文件系统,如GFS和OCFS2。用于需要从2个节点并发访问数据的场合,需要特别配置。
复制模式:有三种不同复制方式,协议A、协议B、协议C,一般使用协议C,只有在本地和远程节点的磁盘已经确认了写操作完成,写才会被认为完成,没有任何数据丢失。
2、Heartbeat集群系统软件
heartbeat(Linux-HA)的工作原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未受到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运 行在对方主机上的资源或者服务。
Heartbeat:(心跳检测)本身是整个集群的基础(cluster messaging layer),负责维护集群各节点的信息以及它们之前通信;只提供主从备份功能,并不能对各个节点进行监控,需要安装ldirectord。
Resource-agent:(资源代理)就是各种的资源的ocf脚本,这些脚本将被LRM调用从而实现各种资源启动、停止、监控等等。
Cluster-glue:相当于一个中间层,可以将heartbeat和crm(pacemaker)联系起来,主要包含2个部分,LRM和STONITH;
Ldirectord:主要配合LVS使用,负责real-server健康检查,自动将real-server中宕机的机器移除,不再分配请求。
3、IP分配
系统:CentOS6.4_x64
主机名 |
角色
|
IP地址
|
db-master
|
主MySQL |
eth0:192.168.0.10/24
eth0:172.0.0.1/24
|
db-backup |
备MySQL |
eth0:192.168.0.20/24
eth0:172.0.0.2/24
|
|
VIP |
192.168.0.100/24 |
4、配置两台节点解析主机名
vi /etc/hosts
192.168.0.202 db-master
192.168.0.203 db-backup
二、安装MySQL
1
2
3
4
|
[root@db-master ~]
[root@db-master ~]
datadir= /data
[root@db-master ~]
|
三、安装DRBD(两个节点配置是完全一样的)
drbd软件下载:http://oss.linbit.com/drbd/
1、下载并安装对应的drbd内核组件:
http://mirror.symnds.com/distributions/elrepo/elrepo/el6/x86_64/RPMS/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[root@db-master ~]
[root@db-master ~]
[root@db-master ~]
[root@db-master ~]
[root@db-master drbd-8.4.4]
[root@db-master drbd-8.4.4]
[root@db-master drbd-8.4.4]
[root@db-master drbd-8.4.4]
[root@db-master drbd-8.4.4]
[root@db-master drbd-8.4.4]
[root@db-master ~]
[root@db-master ~]
drbd 333755 0
libcrc32c 1246 1 drbd
|
2、配置DRBD
1
2
3
4
|
[root@db-master drbd-8.4.4]
[root@db-master drbd]
include "drbd.d/global_common.conf" ;
include "drbd.d/*.res" ;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
[root@db-master drbd]
global {
usage-count yes ;
}
common {
protocol C;
disk {
on-io-error detach;
}
syncer
{
rate 100M;
}
}
resource mysql {
on db-master {
device /dev/drbd0 ;
disk /dev/sdb1 ;
address 192.168.0.10:7789;
meta-disk internal;
}
on db-backup {
device /dev/drbd0 ;
disk /dev/sdb1 ;
address 192.168.0.20:7789;
meta-disk internal;
}
}
|
3、创建供DRBD记录信息数据块
1
2
3
4
5
6
|
[root@db-master ~]
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
success
|
#启动两台DRBD
1
2
3
4
5
|
[root@db-master~]
[root@db-master drbd]
[root@db-master drbd]
tcp 0 0 192.168.0.10:7789 192.168.0.203:33216 ESTABLISHED -
tcp 0 0 192.168.0.10:7789 192.168.0.203:44977
|
4、默认没有分主备节点的,需要设置
1
2
3
4
|
[root@db-master drbd]
version: 8.4.4 (api:1 /proto :86-101)
GIT- hash : 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:06
0: cs:Connected ro:Secondary /Secondary ds:Inconsistent /Inconsistent C
|
说明:
cs:两台数据连接状态
ro:两台主机的状态
ds:磁盘状态是“UpToDate/UpToDate”,同步状态。
#初始化设备并设置主备节点
1
2
3
4
|
[root@db-master drbd]
/dev/drbd0 : State change failed: (-2) Need access to UpToDate data
[root@db-master drbd]
[root@db-backup ~]
|
#再查看状态
1
2
|
[root@masternfs ~]
0:mysql /0 Connected Primary /Secondary UpToDate /UpToDate C r-----
|
5、格式化并挂载分区到/data目录
1
2
3
|
[root@db-master drbd]
[root@db-master drbd]
[root@db-master drbd]
|
四、安装Heartbeat(主备节点配置相同)
软件下载:http://www.linux-ha.org/wiki/Downloads
安装依赖包:
1
|
yum install -y gcc gcc-c++ autoconf libtool pkgconfig glib2-devel libxslt-devel libxml2-devel bzip2 -devel libtool-ltdl-devel libuuid-devel docbook-style-xsl
|
创建需要的组和用户
1
2
|
groupadd haclient
useradd -g haclient -s /sbin/nologin-Mhacluster
|
1.安装资源接管服务(要先安装资源接管服务,否则安装心跳服务会报错)
1
2
3
4
5
|
tar zxvf Reusable-Cluster-Components-glue--glue-1.0.9. tar .bz2
cd Reusable-Cluster-Components-glue--glue-1.0.9
. /autogen .sh
. /configure
make && make install
|
2.安装心跳检测服务
1
2
3
4
|
tar jxvf Heartbeat-3-0-7e3a82377fa8. tar .bz2
cd Heartbeat-3-0-7e3a82377fa8
. /ConfigureMeconfigure
make && make install
|
3.安装资源代理服务
1
2
3
4
5
|
tar jxvf ClusterLabs-resource-agents-v3.9.2-0-ge261943. tar .gz
cd ClusterLabs-resource-agents-b735277
. /autogen .sh
. /configure
make && make install
|
4、配置heartbeat
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@db-master ~]# vi /etc/ha.d/ha.cf
logfile / var /log/ha-log
logfacility local0 #如果未定义上述日志,默认写入/ var /log/message
keepalive 2 #心跳间隔
deadtime 30 #死亡阀值
warntime 10 #警告时间
initdead 120 #首次启动heartbeat,等待多久才启动主服务资源
udpport 694 #连接端口
ucast eth1 172.0 . 0.2 #对方IP,采用网卡的eth1组织心跳,后跟接口IP
auto_failback on #当主节点故障恢复后,自动获取资源并取代从节点
node master #主节点主机名
node slave #备份节点主机名
ping 192.168 . 0.1 #选择ping节点,ping的越好对HA集群越稳定,建议使用网关
|
1
2
3
|
[root@db-master ~]# vi /etc/ha.d/authkeys
auth 2
2 sha1 HI!
|
1
2
|
[root@db-master ~]# vi /etc/ha.d/haresources
db-master IPaddr:: 192.168 . 0.100 / 24 /eth0: 0 drbddisk::mysql Filesystem::/dev/drbd0::/data::ext4 mysqld
|
说明:
db-master IPaddr::192.168.0.204/24/eth0:0 #主机名,后跟虚拟IP地址和接口
drbddisk::data #启动drbd data资源
Filesystem::/dev/drbd0::/data::ext4 #挂载/dev/drbd0到/data
mysqld #服务启动脚本,相当于/etc/init.d/mysql stop/start
五、测试主从切换
主服务器
1
2
3
|
[root@db-master ~]
[root@db-master ~]
[root@db-master ~]
|
备服务器
1
2
3
|
[root@db-master ~]
[root@db-master ~]
[root@db-master ~]
|
六、DRBD使用中问题解决
1>.服务器重启,必须手动执行modprobe drbd才能加载模块
答:这个是可以设置的,如加入rc.local里面,但不推荐。
主服务器故障恢复后,DRBD应该保留人工介入启动,主备切换已经算完成了高可用任务了,所以涉及数据方面还是谨慎为好,修复故障机应该人工来操作的。
2>.主从切换没问题,master故障后,所有写的数据都在备机上,当master恢复后,此时,数据会同步过去吗?试验说明,数据被master上数据覆盖,备机新增数据丢失。
情况一:开启了auto_failback on参数。
主机故障恢复后,先不要启动heartbeat,先加载DRBD到内核并启动DRBD资源,确保当前提供服务的备机和故障主机数据一致,可以cat /proc/drbd查看状态,如果两边不一致,需要把数据推回到故障机,保持两边同步,然后再启动heartbeat完成自动切换。
情况二:没有开启或关闭了auto_failback参数
主机故障恢复后,将DRBD加载到内核,启动heartbeat,正常情况DRBD状态应该是同步状态或正在同步状态。如果未同步,可以先启动DRBD资源,确保当前提供服务的备机和故障主机数据一致,然后在当前提供服务的备机执行hb_standby命令完成切换。
3>.两台数据库都需要关机,启动后造成脑裂(这次脑裂原因是开机自动DRBD造成的)
查看状态cat /porc/drbd可以看到:
0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C
解决方法:首先在备机节点设置从 drbdadm secondary all
如果主机连接状态显示WFConnection则执行drbdadm connect all,再设置主 drbdadm -- --overwrite-data-of-peer primary all
最后查看状态 cat /porc/drbd已经恢复了主从,数据也是同步状态。
本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1330220,如需转载请自行联系原作者