架構拓撲
+----------------+ DRBD 同步 +----------------+
| Node1 (Master) | ◄─────────────────► | Node2 (Slave) |
| nginxha001 | /dev/drbd0 | nginxha002 |
| 10.0.15.31 | protocol C | 10.0.15.32 |
| | | |
| VIP: 10.0.15.30 (漂移) | |
+----------------+ +----------------+
▲ ▲
└──────── Corosync/Pacemaker 叢集管理 ────┘
環境規格
- OS:CentOS 6.5 / Kernel 2.6.32
- 節點:`nginxha001` (10.0.15.31)、`nginxha002` (10.0.15.32)
- 虛擬 IP (VIP):10.0.15.30
- 共享存儲:`/dev/sdc1` → DRBD `/dev/drbd0` → 掛載 `/mysqldata`
核心組件安裝
# 依賴
yum -y install gcc rpm-build kernel-devel kernel-headers flex ncurses-devel
# DRBD (ELRepo 源)
wget https://elrepo.org/linux/elrepo/el6/x86_64/RPMS/kmod-drbd84-8.4.3-1.el6_4.elrepo.x86_64.rpm
wget https://elrepo.org/linux/elrepo/el6/x86_64/RPMS/drbd84-utils-8.4.3-1.el6.elrepo.x86_64.rpm
yum -y localinstall *.rpm
DRBD 資源配置 (/etc/drbd.d/mysql.res)
resource mysql {
protocol C;
device /dev/drbd0;
disk /dev/sdc1;
meta-disk internal;
on nginxha001 { address 10.0.15.31:7789; }
on nginxha002 { address 10.0.15.32:7789; }
}
DRBD 初始化與主從建立
# 兩節點均執行
fdisk /dev/sdc # 創建同大小分區 sdc1
drbdadm create-md mysql
service drbd start
# 僅主節點執行
drbdadm -- --overwrite-data-of-peer primary mysql
mkfs -t ext4 /dev/drbd0
mount /dev/drbd0 /mysqldata
Corosync + Pacemaker 叢集配置 (CRM Shell)
crm configure
# 基礎屬性
property stonith-enabled=false
property no-quorum-policy=ignore
# 1. MySQL 服務資源 (LSB 腳本)
primitive Mysqld lsb:mysqld
# 2. DRBD 主從資源
primitive Drbd ocf:linbit:drbd \
params drbd_resource="mysql" \
op start timeout="240" op stop timeout="100"
ms My_Drbd Drbd \
meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
# 3. 文件系統資源
primitive FileSys ocf:heartbeat:Filesystem \
params device="/dev/drbd0" directory="/mysqldata" fstype="ext4" \
op start timeout="60" op stop timeout="60"
# 4. VIP 資源
primitive vip ocf:heartbeat:IPaddr \
params ip="10.0.15.30" nic="eth0" cidr_netmask="24" \
op monitor interval="10s"
# 5. 位置/順序約束 (關鍵!)
# 文件系統跟隨 DRBD Master
colocation FileSys_on_My_Drbd inf: FileSys My_Drbd:Master
# DRBD 先於 文件系統
order FileSys_after_My_Drbd inf: My_Drbd:promote FileSys:start
# MySQL 跟隨 文件系統
colocation Mysqld_on_FileSys inf: Mysqld FileSys
order Mysqld_after_FileSys inf: FileSys Mysqld:start
# VIP 跟隨 MySQL
colocation vip_on_Mysqld inf: vip Mysqld
commit
exit
MySQL 配置適配 (/etc/my.cnf)
[mysqld]
datadir = /mysqldata
socket = /mysqldata/mysql.sock
user = mysql
symbolic-links = 0
[mysqld_safe]
log-error = /mysqldata/mysqld.log
pid-file = /mysqldata/mysqld.pid
[client]
socket = /mysqldata/mysql.sock
常用運維命令
| 操作 | 命令 |
| 查看 DRBD 同步進度 | `watch -n1 drbd-overview` / `cat /proc/drbd` |
| 手動切主 | `drbdadm primary mysql` (另一節點自動降為 Secondary) |
| 掛載/卸載 | `mount /dev/drbd0 /mysqldata` / `umount /mysqldata` |
| 清理資源故障 | `crm resource cleanup Mysqld` / `vip` / `FileSys` |
| 查看叢集狀態 | `crm status` / `crm_mon -1` |
關鍵避坑指南
- **DRBD 同步未完成切主會數據不一致** → `drbd-overview` 確認 `UpToDate/UpToDate` 後再操作。
- **MySQL 數據目錄必須在 DRBD 掛載點** → `datadir=/mysqldata`,否則漂移後數據不跟隨。
- **應用連接用 VIP** → 避免應用層感知主備切換。
- **STONITH 生產必須開啟** → 防腦裂,本教程為演示關閉。
- **防火牆放行**:3306 (MySQL)、7789 (DRBD)、5405/5404 (Corosync)、2224 (Pacemaker)。