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

MySQL多實例管理利器:mysqld_multi配置實戰與主從拓撲構建

     編輯:MySQL 綜合教學

為什麼需要多實例?

  • 資源隔離:不同業務獨享 CPU/內存/IO,避免「壞鄰居」效應
  • 版本並存:舊系統 5.6、新系統 8.0 同機運行,平滑遷移
  • 多租戶/測試環境:單物理機承載多個獨立實例,成本優化
  • 高可用拓撲:單機構建「一主多從」或「多主一從」演練複製邏輯

核心組件:mysqld_multi

官方提供的 Perl 腳本,通過單一配置文件管理多個 [mysqldN] 實例組,支持批量啟停、狀態報告。

完整配置實戰(3個實例:3306/3307/3308)

1. 主配置 /etc/my.cnf 定義 [mysqld_multi] 管理段

[mysqld_multi]
mysqld     = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user       = multi_admin
password   = MultiPass123!
log        = /usr/local/mysql/logs/mysqld_multi.log
# config-file 由啟動腳本傳入,不寫死在此處

2. 實例專屬配置文件 /usr/local/mysql/etc/mysqld_multi.cnf

[mysqld1]
socket     = /tmp/mysql.sock1
port       = 3306
pid-file   = /usr/local/mysql/var1/mysqld.pid
datadir    = /usr/local/mysql/var1
user       = mysql
server-id  = 1
log-bin    = /usr/local/mysql/var1/binlog
# 實例 1 專屬參數...
innodb_buffer_pool_size = 512M

[mysqld2]
socket     = /tmp/mysql.sock2
port       = 3307
pid-file   = /usr/local/mysql/var2/mysqld.pid
datadir    = /usr/local/mysql/var2
user       = mysql
server-id  = 2
log-bin    = /usr/local/mysql/var2/binlog
innodb_buffer_pool_size = 512M

[mysqld3]
socket     = /tmp/mysql.sock3
port       = 3308
pid-file   = /usr/local/mysql/var3/mysqld.pid
datadir    = /usr/local/mysql/var3
user       = mysql
server-id  = 3
log-bin    = /usr/local/mysql/var3/binlog
innodb_buffer_pool_size = 512M

3. 部署啟動腳本 /usr/sbin/mysqld_multi.server

# 從源碼包 support-files/mysqld_multi.server 複製
cp /usr/local/src/mysql-5.7.42/support-files/mysqld_multi.server /usr/sbin/
chmod 755 /usr/sbin/mysqld_multi.server

# 編輯腳本,強制指定 config-file(關鍵修復)
vim /usr/sbin/mysqld_multi.server
# 找到 start/stop/report case 分支,追加 --config-file 參數
'$mysqld_multi' start $2
# 改為
'$mysqld_multi' --config-file=/usr/local/mysql/etc/mysqld_multi.cnf start $2

# 同理修改 stop、report 分支

4. 初始化各實例數據目錄

for i in 1 2 3; do
    mkdir -p /usr/local/mysql/var$i
    chown -R mysql:mysql /usr/local/mysql/var$i
    /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql \
        --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var$i
done

5. 啟動實例組

# 啟動所有
mysqld_multi.server start

# 或指定範圍
mysqld_multi --config-file=/usr/local/mysql/etc/mysqld_multi.cnf start 1-3

6. 授權管理用戶關閉權限(必須,否則 stop 失效)

# 以實例 1 為例,登錄並授權
mysql -uroot -S /tmp/mysql.sock1 -p -e "
GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'MultiPass123!';
FLUSH PRIVILEGES;
"
# 其餘實例同理執行(或複製 user 表權限)

7. 管理操作速查

操作命令
啟動所有mysqld_multi.server start
停止所有mysqld_multi.server stop
啟動指定mysqld_multi --config-file=... start 2
停止指定mysqld_multi --config-file=... stop 2
啟動範圍mysqld_multi --config-file=... start 1-3
查看狀態mysqld_multi --config-file=... report

構建單機「一主多從」複製拓撲(演練/測試專用)

  1. 實例 1 (3306) 為主庫,實例 2/3 (3307/3308) 為從庫
  2. 主庫配置:log-bin、server-id=1、binlog_format=ROW、gtid_mode=ON
  3. 從庫配置:server-id=2/3、relay-log、read_only=ON、gtid_mode=ON
  4. 主庫創建複製賬號:
    CREATE USER 'repl'@'127.0.0.1' IDENTIFIED BY 'ReplPass123!';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'127.0.1';
    FLUSH PRIVILEGES;
  5. 從庫建立複製鏈接(GTID 模式自動定位):
    CHANGE MASTER TO
      MASTER_HOST='127.0.0.1',
      MASTER_PORT=3306,
      MASTER_USER='repl',
      MASTER_PASSWORD='ReplPass123!',
      MASTER_AUTO_POSITION=1;
    START SLAVE;
    SHOW SLAVE STATUS\G

避坑指南

  • Socket 衝突:每實例必須唯一 socket、port、pid-file、datadir
  • 內存總和超限:Σ innodb_buffer_pool_size ≤ 物理內存 70%,預留 OS/其他進程
  • 文件描述符:ulimit -n 65535、open_files_limit 同步調大
  • AppArmor/SELinux:需為每個 datadir、log-bin 目錄添加策略
  • mysqld_multi 停止失效:90% 因 multi_admin 缺 SHUTDOWN 權限或密碼錯誤
  • 生產環境慎用:單點故障域、IO 爭搶、升級維護窗口疊加,**生產核心業務建議物理隔離/容器化/雲托管**

總結

mysqld_multi 是 MySQL 多實例管理的**官方標準工具**,通過 [mysqldN] 分組配置、統一啟停腳本、專用管理賬號,實現單機多實例的全生命週期管理。掌握其配置邏輯與授權機制,能快速搭建測試拓撲、驗證複製邏輯、演練故障轉移。但請牢記:**單機多實例僅適配開發測試、非核心業務、資源受限場景**,生產核心鏈路請堅持「一機一實例」或容器化編排。

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