本文記錄生產環境 MySQL 多實例規範化部署、Heartbeat 心跳監測、DRBD 塊級鏡像、雙機熱備自動故障轉移的完整實施過程,含配置文件模板、初始化腳本、資源代理、聯調驗證。
/data/
├── 3306/
│ ├── data/ # 數據目錄
│ ├── my.cnf # 實例配置
│ └── mysql # 啟動腳本
├── 3307/
│ ├── data/
│ ├── my.cnf
│ └── mysql
└── 3308/ ...
/data/3306/my.cnf[client]
port=3306
socket=/data/3306/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user=mysql
port=3306
socket=/data/3306/mysql.sock
basedir=/application/mysql
datadir=/data/3306/data
server-id=1
log-bin=/data/3306/mysql-bin
relay-log=/data/3306/relay-bin
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
innodb_buffer_pool_size=32M
innodb_log_file_size=4M
innodb_file_per_table=0
skip-name-resolve
lower_case_table_names=1
max_connections=800
# ... 其他調優參數
[mysqld_safe]
log-error=/data/3306/mysql3306.err
pid-file=/data/3306/mysqld.pid
/data/3306/mysql#!/bin/bash
port=3306
mysql_user="root"
mysql_pwd="StrongPass123!"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
start() {
if [ ! -e "$mysql_sock" ]; then
echo "Starting MySQL $port..."
$CmdPath/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 >/dev/null &
else
echo "MySQL $port is running."
fi
}
stop() {
if [ ! -e "$mysql_sock" ]; then
echo "MySQL $port is stopped."
else
echo "Stopping MySQL $port..."
$CmdPath/mysqladmin -u $mysql_user -p$mysql_pwd -S $mysql_sock shutdown
fi
}
case "$1" in
start) start ;;
stop) stop ;;
restart) stop; sleep 2; start ;;
*) echo "Usage: $0 {start|stop|restart}" ;;
esac
# 1. 授權
chown -R mysql.mysql /data/3306 /data/3307
chmod +x /data/3306/mysql /data/3307/mysql
# 2. 初始化數據目錄
cd /application/mysql/scripts
./mysql_install_db --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
./mysql_install_db --basedir=/application/mysql --datadir=/data/3307/data --user=mysql
# 3. 啟動實例
/data/3306/mysql start
/data/3307/mysql start
netstat -lntp | grep 330[6-7]
# 4. 設置密碼
mysqladmin -u root -S /data/3306/mysql.sock password 'StrongPass123!'
mysqladmin -u root -S /data/3307/mysql.sock password 'StrongPass123!'
# 5. 登錄驗證
mysql -uroot -p -S /data/3306/mysql.sock -e "SHOW DATABASES;"
mkdir -p /data/3308/data
cp /data/3306/my.cnf /data/3308/
cp /data/3306/mysql /data/3308/
sed -i 's/3306/3308/g' /data/3308/my.cnf /data/3308/mysql
sed -i 's/server-id=1/server-id=3/' /data/3308/my.cnf
chown -R mysql.mysql /data/3308
cd /application/mysql/scripts
./mysql_install_db --basedir=/application/mysql --datadir=/data/3308/data --user=mysql
/data/3308/mysql start
mysqladmin -u root -S /data/3308/mysql.sock password 'StrongPass123!'
┌─────────────┐ Heartbeat (心跳/資源接管) ┌─────────────┐
│ Node A │ ◄─────────────────────────────────► │ Node B │
│ (Primary) │ DRBD (同步鏡像塊設備) │ (Standby) │
│ MySQL 3306 │ │ MySQL 3306 │
│ VIP: 192.168.200.91 │ │
└─────────────┘ └─────────────┘
▲ ▲
│ Shared Storage (DRBD /dev/drbd0) │
└───────────────────────────────────────────────────┘
# 1. 主機名與 hosts
hostname node1
echo "node1" > /etc/hostname
echo "192.168.1.3 node1" >> /etc/hosts
echo "192.168.1.5 node2" >> /etc/hosts
# 2. 安裝 epel + heartbeat
yum install -y epel-release
yum install -y heartbeat
# 3. 核心配置 /etc/ha.d/ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local1
keepalive 2
deadtime 30
warntime 10
initdead 60
mcast eth1 225.0.0.1 694 1 0
auto_failback on
node node1
node node2
crm no
# 4. 認證 /etc/ha.d/authkeys (權限 600)
auth 1
1 sha1 SharedSecretKey123!
# 5. 資源 /etc/ha.d/haresources
node1 IPaddr::192.168.200.91/24/eth0 drbddisk::mysql_data Filesystem::/dev/drbd0::/data::ext4 mysqld
# 6. 啟動
systemctl start heartbeat
# 1. 環境:雙網卡、雙硬盤(/dev/xvdb 做 DRBD)
# 2. 分區 (parted GPT)
parted /dev/xvdb mklabel gpt
parted /dev/xvdb mkpart primary 0 1024 # /dev/xvdb1 數據
parted /dev/xvdb mkpart primary 1024 2048 # /dev/xvdb2 元數據
# 3. 安裝
yum install -y elrepo-release
yum install -y kmod-drbd84 drbd84-utils
modprobe drbd
echo "modprobe drbd" > /etc/sysconfig/modules/drbd.modules
# 4. 配置 /etc/drbd.d/mysql_data.res
resource mysql_data {
protocol C;
disk { on-io-error detach; }
syncer { rate 330M; verify-alg crc32c; }
on node1 {
device /dev/drbd0;
disk /dev/xvdb1;
address 192.168.1.3:7788;
meta-disk /dev/xvdb2;
}
on node2 {
device /dev/drbd0;
disk /dev/xvdb1;
address 192.168.1.5:7788;
meta-disk /dev/xvdb2;
}
}
# 5. 初始化元數據
drbdadm create-md mysql_data
# 6. 啟動
drbdadm up mysql_data
# 7. 主節點強制提升 Primary,開始同步
drbdadm -- --overwrite-data-of-peer primary mysql_data
watch -n1 cat /proc/drbd # 等待 UpToDate/UpToDate
# 8. 掛載 (主節點)
mkfs.ext4 /dev/drbd0
mkdir /data
mount /dev/drbd0 /data
# 1. 解壓安裝包
tar zxf mysql-5.5.47-linux2.6-x86_64.tar.gz
mv mysql-5.5.47 /application/mysql-5.5.47
ln -s /application/mysql-5.5.47 /application/mysql
# 2. 用戶
groupadd mysql; useradd -g mysql -M mysql
# 3. 多實例配置放在 /data/3306/ (DRBD 掛載點)
# 複製 my.cnf、mysql 啟動腳本至 /data/3306/
# 4. 初始化
/application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
# 5. 修正 mysqld_safe 路徑
sed -i 's#/usr/local/mysql#/application/mysql#g' /application/mysql/bin/mysqld_safe
# 6. 啟動測試
/data/3306/mysql start
lsof -i:3306
# 7. 納入 Heartbeat 資源代理
cp /data/3306/mysql /etc/ha.d/resource.d/mysqld
chmod +x /etc/ha.d/resource.d/mysqld
# 8. 更新 haresources
node1 IPaddr::192.168.200.91/24/eth0 drbddisk::mysql_data Filesystem::/dev/drbd0::/data::ext4 mysqld
systemctl stop heartbeat 或物理斷電authkeys 必須 chmod 600,否則 Heartbeat 拒絕啟動protocol C 同步寫入,確保零數據丟失,延遲略高auto_failback on:主節點恢復後自動遷回,視業務決定是否開啟datadir 在 DRBD 上,故障轉移時數據零拷貝drbdadm verify mysql_data 校驗數據一致性/proc/drbd、Heartbeat 日誌、MySQL 錯誤日誌三位一體多實例規範化部署(目錄隔離、配置模板化、腳本化管理)是高可用基石。Heartbeat + DRBD + MySQL 經典雙機熱備架構,通過 VIP 漂移 + 塊級同步鏡像 + 資源代理聯動 實現分鐘級自動故障轉移。生產建議:引入 MHA/Orchestrator 實現多節點集群自動化故障轉移、GTID 復制簡化拓撲管理、定期演練故障轉移驗證 RTO/RPO。