在CentOS6.5_x64这种较早期的系统上部署MySQL高可用,DRBD是非常实用的块级复制方案。DRBD8.4.2版本相对成熟,能够将两台服务器的本地磁盘实时镜像,上层直接跑MySQL即可获得近似共享存储的体验。本文基于两台节点node1与node2,系统均为CentOS6.5_x64,内核版本2.6.32-431.el6.x86_64,演示如何从零完成DRBD8.4.2的安装与基础资源配置,并最终将MySQL数据目录迁移到DRBD设备上。

一、环境准备与源码编译安装DRBD8.4.2
CentOS6.5_x64默认的yum源中drbd版本往往偏低或缺失内核模块源码,因此推荐下载drbd-8.4.2.tar.gz官方包进行编译。编译前需要安装kernel-devel、gcc、make等基础工具,并且确认当前运行内核与kernel-devel版本完全一致,否则模块加载时会报版本魔术不匹配。两台机器都需要执行相同的编译步骤,以保证主从协议一致。
解压后进入目录,先编译内核模块再编译用户态工具。模块编译时需指定KDIR指向对应内核源码目录。完成后执行make install,系统会在/lib/modules下生成drbd.ko,并通过depmod刷新依赖。用户态工具安装后提供drbdadm、drbdsetup等命令,它们是后续资源配置的核心。
下面给出两台节点通用的编译安装示例,注意替换实际内核路径。若遇到gcc警告可忽略,但链接错误通常意味着头文件缺失。
# 安装依赖 yum -y install kernel-devel gcc make flex perl # 下载并解压 cd /usr/local/src wget https://ipipp.com/drbd/8.4.2/drbd-8.4.2.tar.gz tar zxvf drbd-8.4.2.tar.gz cd drbd-8.4.2 # 编译内核模块 make KDIR=/usr/src/kernels/2.6.32-431.el6.x86_64 make install # 编译用户态工具 cd drbd-8.4.2/user make make install # 加载模块 modprobe drbd lsmod | grep drbd
二、DRBD资源配置与MySQL数据目录规划
DRBD的配置文件分为全局通用配置和资源配置。全局文件/etc/drbd.d/global_common.conf定义协议、磁盘读写参数和同步速率。对于MySQL这类随机小文件写多的负载,建议使用protocol C保证强一致,并将同步速率限制在网卡带宽的百分之七十,避免全量同步时挤占业务网络。
资源文件定义块设备、节点IP和低层磁盘。我们假设两台机各有一块空闲盘/dev/sdb,规划为资源r0,设备名为/dev/drbd0,文件系统格式化为ext4后挂载到/data/mysql,再将MySQL的datadir指向该目录。资源文件中必须明确node-id与地址,且两个节点的配置应完全对称,仅节点名和IP互换。
以下为global_common.conf的精简示例,以及r0.res资源文件内容。注意floating方式可省略显式节点块,但新手建议使用on语句清晰描述。
# /etc/drbd.d/global_common.conf
global {
usage-count no;
}
common {
protocol C;
disk {
on-io-error detach;
}
net {
cram-hmac-alg sha1;
shared-secret "mysqlha";
}
syncer {
rate 80M;
}
}
# /etc/drbd.d/r0.res
resource r0 {
on node1 {
device /dev/drbd0;
disk /dev/sdb;
address 192.168.0.1:7788;
meta-disk internal;
}
on node2 {
device /dev/drbd0;
disk /dev/sdb;
address 192.168.0.2:7788;
meta-disk internal;
}
}
三、初始化设备与MySQL切换验证
配置就绪后,在两节点依次执行drbdadm create-md r0初始化元数据,然后drbdadm up r0启动资源。此时两节点都处于Secondary状态,需要手动将node1提升为Primary:drbdadm primary --force r0。首次提升会触发全量同步,可通过cat /proc/drbd观察进度,状态从SyncSource变为Connected即完成。
在Primary节点对/dev/drbd0做文件系统并挂载。接着停止MySQL服务,将原有/var/lib/mysql数据拷贝至/data/mysql,修改my.cnf中datadir与socket路径,启动MySQL验证读写正常。此时node2虽为Secondary无法挂载,但磁盘已实时镜像,一旦node1宕机,在node2执行drbdadm primary r0并挂载即可拉起MySQL,实现故障转移。
以下代码展示初始化与挂载的关键步骤,以及MySQL配置调整片段。实际生产中应配合heartbeat或corosync自动切换,但手动流程有助于理解DRBD底层行为。
# 两节点均执行 drbdadm create-md r0 drbdadm up r0 # node1提升并格式化 drbdadm primary --force r0 mkfs.ext4 /dev/drbd0 mkdir -p /data/mysql mount /dev/drbd0 /data/mysql # 迁移数据 service mysqld stop cp -a /var/lib/mysql/* /data/mysql/ # 修改 /etc/my.cnf # datadir=/data/mysql # socket=/data/mysql/mysql.sock service mysqld start
通过上述步骤,CentOS6.5_x64上的MySQL便拥有了基于DRBD8.4.2的块级镜像能力。日常运维中需监控/proc/drbd状态,避免出现Split-Brain。若发生脑裂,应在次要节点使用drbdadm disconnect与drbdadm invalidate重新同步,而非强行双写,否则MySQL数据文件将损坏。
MySQLDRBD8.4.2CentOS6.5_x64修改时间:2026-08-14 09:09:33