首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 多實例部署與高可用架構實戰:Heartbeat + DRBD + MySQL 生產級方案

     編輯:MySQL 綜合教學

MySQL 多實例部署與高可用架構實戰:Heartbeat + DRBD + MySQL 生產級方案

本文記錄生產環境 MySQL 多實例規範化部署、Heartbeat 心跳監測、DRBD 塊級鏡像、雙機熱備自動故障轉移的完整實施過程,含配置文件模板、初始化腳本、資源代理、聯調驗證。

一、多實例部署規範

1. 目錄規劃

/data/
├── 3306/
│   ├── data/          # 數據目錄
│   ├── my.cnf         # 實例配置
│   └── mysql          # 啟動腳本
├── 3307/
│   ├── data/
│   ├── my.cnf
│   └── mysql
└── 3308/ ...

2. 實例配置模板 /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

3. 啟動腳本 /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

4. 初始化與啟動流程

# 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;"

5. 新增實例(以 3308 為例)

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 + DRBD + MySQL

架構原理

┌─────────────┐     Heartbeat (心跳/資源接管)     ┌─────────────┐
│  Node A     │ ◄─────────────────────────────────► │  Node B     │
│  (Primary)  │        DRBD (同步鏡像塊設備)        │ (Standby)   │
│  MySQL 3306 │                                     │  MySQL 3306 │
│  VIP: 192.168.200.91                            │             │
└─────────────┘                                     └─────────────┘
        ▲                                                   ▲
        │              Shared Storage (DRBD /dev/drbd0)    │
        └───────────────────────────────────────────────────┘

1. Heartbeat 3.0 部署

# 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

2. DRBD 部署

# 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

3. MySQL 部署在 DRBD 掛載點

# 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

三、故障轉移驗證

  1. 主節點 systemctl stop heartbeat 或物理斷電
  2. 備節點 Heartbeat 檢測心跳超時(deadtime 30s)
  3. 依次接管:VIP → DRBD Primary → 掛載 /data → 啟動 MySQL
  4. 應用透過 VIP 192.168.200.91 無感切換
  5. RTO ≈ 40-60s(Heartbeat 檢測 + DRBD 切換 + 掛載 + MySQL 恢復)

四、運維關鍵點

  • authkeys 必須 chmod 600,否則 Heartbeat 拒絕啟動
  • DRBD protocol C 同步寫入,確保零數據丟失,延遲略高
  • auto_failback on:主節點恢復後自動遷回,視業務決定是否開啟
  • MySQL datadir 在 DRBD 上,故障轉移時數據零拷貝
  • 定期 drbdadm verify mysql_data 校驗數據一致性
  • 監控 /proc/drbd、Heartbeat 日誌、MySQL 錯誤日誌三位一體

五、總結

多實例規範化部署(目錄隔離、配置模板化、腳本化管理)是高可用基石。Heartbeat + DRBD + MySQL 經典雙機熱備架構,通過 VIP 漂移 + 塊級同步鏡像 + 資源代理聯動 實現分鐘級自動故障轉移。生產建議:引入 MHA/Orchestrator 實現多節點集群自動化故障轉移、GTID 復制簡化拓撲管理、定期演練故障轉移驗證 RTO/RPO。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved