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

Corosync + DRBD + MySQL 高可用架構部署實戰

     編輯:MySQL 綜合教學

架構概覽

本文實現雙節點 MySQL 高可用集群:

  • Corosync:集群通訊層,提供消息傳遞、成員管理、法定票數
  • Pacemaker:集群資源管理器(CRM),基於 Corosync 實現資源監控、遷移、故障切換
  • DRBD:分布式塊設備複製,雙主/主從模式同步數據目錄,保證存儲層高可用
  • VIP (IPaddr2):虛擬 IP 漂移,對應用層透明化故障切換

環境:CentOS 6.x,雙節點 test1.local (192.168.10.55) / test2.local (192.168.10.56),共享存儲掛載點 /mydrbd,VIP 192.168.10.3/24。


前置條件配置

1. 網絡與主機名

# /etc/hosts 兩節點一致
192.168.10.55 test1.local
192.168.10.56 test2.local

驗證:ping test1.local、ping test2.local 雙向通畅。

2. SSH 互信

ssh-keygen -t rsa -P ''
ssh-copy-id test1.local
ssh-copy-id test2.local

3. 時間同步

# 兩節點 crontab
*/5 * * * * /usr/sbin/ntpdate 192.168.10.1 >/dev/null 2>&1

DRBD 部署:存儲層高可用基石

1. 安裝編譯 (內核模塊)

wget https://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz
tar zxf drbd-8.4.3.tar.gz && cd drbd-8.4.3
./configure --prefix=/usr/local/drbd --with-km
make KDIR=/usr/src/kernels/$(uname -r)
make install
mkdir -p /usr/local/drbd/var/run/drbd
cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/

# 編譯內核模塊
make clean
make KDIR=/usr/src/kernels/$(uname -r)
cp drbd.ko /lib/modules/$(uname -r)/kernel/lib/
modprobe drbd
lsmod | grep drbd

2. 創建專用分區

fdisk /dev/sdb  # 新建 9G 主分區 /dev/sdb1
partprobe /dev/sdb

3. 全局配置 /usr/local/drbd/etc/drbd.d/global_common.conf

global {
    usage-count no;
}
common {
    protocol C;  # 同步模式:數據寫入本地並發送遠端、遠端落盤後才返回成功
    handlers {
        pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger; reboot -f";
        local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger; halt -f";
    }
    startup { wfc-timeout 30; degr-wfc-timeout 30; }
    disk { on-io-error detach; }
    net {
        cram-hmac-alg "sha1";
        shared-secret "mydrbd1fa2jg8";
    }
    syncer { rate 200M; }
}

4. 資源配置 /usr/local/drbd/etc/drbd.d/mydrbd.res

resource mydrbd {
    on test1.local {
        device /dev/drbd0;
        disk /dev/sdb1;
        address 192.168.10.55:7789;
        meta-disk internal;
    }
    on test2.local {
        device /dev/drbd0;
        disk /dev/sdb1;
        address 192.168.10.56:7789;
        meta-disk internal;
    }
}

5. 初始化與啟動

# 兩節點同步配置
scp -r /usr/local/drbd/etc/drbd.* test2.local:/usr/local/drbd/etc/

# 初始化元數據
drbdadm create-md mydrbd

# 啟動服務
service drbd start

# 查看狀態:雙 Secondary,Inconsistent
cat /proc/drbd

6. 首次同步:提升主節點

# test1.local 執行
drbdadm -- --overwrite-data-of-peer primary mydrbd

# 觀察同步進度
watch -n1 cat /proc/drbd
# 直到 ds:UpToDate/UpToDate

7. 格式化與測試

# 主節點格式化、掛載、寫入測試
mkfs.ext3 /dev/drbd0
mkdir /mydrbd && mount /dev/drbd0 /mydrbd
touch /mydrbd/test_file

# 降級為 Secondary,另一節點提升 Primary 驗證數據同步
umount /mydrbd
drbdadm secondary mydrbd
# test2.local: drbdadm primary mydrbd && mount /dev/drbd0 /mydrbd && ls /mydrbd

Corosync + Pacemaker 部署

1. 安裝軟件源與包

wget -P /etc/yum.repos.d/ https://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/network:ha-clustering:Stable.repo
yum install corosync pacemaker crmsh -y
mkdir /var/log/cluster

2. Corosync 配置 /etc/corosync/corosync.conf

totem {
    version: 2
    secauth: on
    threads: 2
    interface {
        ringnumber: 0
        bindnetaddr: 192.168.10.0
        mcastaddr: 239.212.16.19
        mcastport: 5405
        ttl: 1
    }
}
logging {
    to_logfile: yes
    logfile: /var/log/cluster/corosync.log
    to_syslog: no
    timestamp: on
}
service {
    ver: 0
    name: pacemaker
}
aisexec {
    user: root
    group: root
}

3. 生成認證鑰匙並分發

corosync-keygen
scp -p /etc/corosync/authkey /etc/corosync/corosync.conf test2.local:/etc/corosync/

4. 啟動驗證

service corosync start
ssh test2.local 'service corosync start'

# 檢查集群狀態
crm status
# 預期:2 nodes configured, online: [test1.local test2.local]

Pacemaker 資源配置

進入 CRM 交互模式:crm configure

1. 集群屬性

property stonith-enabled=false
property no-quorum-policy=ignore
rsc_defaults resource-stickiness=100
commit

2. DRBD 主從資源

primitive mysqldrbd ocf:linbit:drbd \
    params drbd_resource=mydrbd \
    op start timeout=240 \
    op stop timeout=100 \
    op monitor role=Master interval=10 timeout=20 \
    op monitor role=Slave interval=20 timeout=20

ms ms_mysqldrbd mysqldrbd \
    meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true

commit

關鍵點:資源名 mysqldrbd、主從組名 ms_mysqldrbd 必須不同;notify=true 確保角色變更通知文件系統資源。

3. 文件系統資源 + 約束

primitive mystore ocf:heartbeat:Filesystem \
    params device=/dev/drbd0 directory=/mydrbd fstype=ext3 \
    op start timeout=60 op stop timeout=60

# 文件系統必須跟隨 DRBD Master
colocation mystore_with_ms_mysqldrbd inf: mystore ms_mysqldrbd:Master

# 順序:先提升 DRBD Master,再掛載文件系統
order mystore_after_ms_mysqldrbd mandatory: ms_mysqldrbd:promote mystore:start

commit

4. MySQL 資源 + 約束

# 禁用開機自啟
chkconfig mysqld off  # 兩節點均執行

primitive mysqld lsb:mysqld

# MySQL 必須與文件系統同節點
colocation mysqld_with_mystore inf: mysqld mystore

# 順序:文件系統掛載後啟動 MySQL
order mysqld_after_mystore mandatory: mystore:start mysqld:start

commit

5. VIP 資源 + 約束

primitive myip ocf:heartbeat:IPaddr2 \
    params ip=192.168.10.3 nic=eth0 cidr_netmask=24

# VIP 綁定在 DRBD Master 節點
colocation myip_with_ms_mysqldrbd inf: myip ms_mysqldrbd:Master

commit

MySQL 數據目錄遷移至 DRBD

1. 主節點初始化數據目錄

# 確保 DRBD 掛載於 /mydrbd
mkdir -p /mydrbd/data
chown -R mysql:mysql /mydrbd/data

# 初始化數據庫
/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydrbd/data --basedir=/usr/local/mysql

# 修改 my.cnf
datadir=/mydrbd/data

# 手動啟動驗證
service mysqld start
mysql -uroot -e "CREATE DATABASE drbd_mysql;"
service mysqld stop

2. 從節點配置

# 切換 DRBD Master 到 test2.local
crm node standby test1.local
crm node online test1.local
# 驗證 test2.local 為 Master 且文件系統已掛載

# 配置 my.cnf 指向共享數據目錄
echo "datadir=/mydrbd/data" >> /etc/my.cnf
service mysqld start
mysql -uroot -e "SHOW DATABASES;"  # 可見 drbd_mysql
service mysqld stop

故障切換驗證

1. 正常運行狀態

crm status
# Master/SlaveSet: ms_mysqldrbd [mysqldrbd]
# Masters: [test1.local]
# Slaves: [test2.local]
# mystore: Started test1.local
# mysqld: Started test1.local
# myip: Started test1.local

2. 模擬主節點故障

crm node standby test1.local
crm status
# Masters: [test2.local]
# 所有資源自動遷移至 test2.local

3. 客戶端透明連接

# 任意時刻連接 VIP
mysql -uroot -h 192.168.10.3 -p
# 故障切換期間最多丟失未提交事務,連接短暫中斷後自動恢復

4. 恢復主節點

crm node online test1.local
# test1.local 變為 Slave,資源保持在 test2.local (stickiness=100)
# 如需手動切回:crm resource move ms_mysqldrbd test1.local

關鍵運維要點

  1. 資源不可開機自啟:DRBD、MySQL、文件系統必須由 Pacemaker 托管
  2. DRBD 同步模式選 C:強一致性,犧牲寫性能換數據零丟失
  3. STONITH 生產環境必須啟用:防止腦裂導致數據雙寫損壞,配置 IPMI/PDU/云 API 等隔離設備
  4. 監控告警:監控 crm status、/proc/drbd 狀態、VIP 存活、MySQL 連通性
  5. 備份策略:從節點掛載只讀快照備份,不影響主節點性能

總結

本架構通過 Corosync 提供集群心跳、Pacemaker 管理資源生命周期、DRBD 保障存儲級數據同步、VIP 實現訪問入口高可用,構建了企業級 MySQL 雙節點高可用集群。生產環境建議補全 STONITH 隔離、引入備份節點、部署監控體系,並定期演練故障切換流程。

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