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

MySQL 多實例部署全方案對比:源碼包、二進制包、RPM 包、mysqld_multi 四種模式深度解析

     編輯:MySQL 綜合教學

多實例核心需求

  • 單機運行多個隔離的 MySQL 進程,各自獨立:port、socket、datadir、basedir、my.cnf。
  • 典型場景:Heartbeat 雙主熱備、開發/測試/生產共用物理機、多租戶隔離。

方案一:源碼包編譯安裝(最靈活,適合深度定制)

關鍵點

  • 每個實例單獨 cmake 指定 CMAKE_INSTALL_PREFIX、MYSQL_TCP_PORT、MYSQL_DATADIR、MYSQL_UNIX_ADDR、SYSCONFDIR。
  • 編譯前 make clean && rm -f CMakeCache.txt 避免參數殘留。
  • 各實例獨立 mysql_install_db 初始化系統表。
  • 啟動腳本直接調用各 basedir/bin/mysqld_safe。

優/缺點

優點缺點
硬編碼參數隔離徹底、可定制編譯優化、版本獨立升級編譯耗時長、維護成本高、需自行管理 systemd 服務

方案二:二進制包解壓部署(最常用,平衡靈活與效率)

核心技巧

  • 解壓一次,cp -R 複製多份作為不同 basedir。
  • 各實例 my.cnf 放在各自 basedir 下(第 3 優先級),啟動時指定 --defaults-file。
  • 共用一套客戶端工具(mysql, mysqldump),建立軟鏈接 /usr/local/bin/mysql -> /usr/local/mysql/bin/mysql。

systemd 服務化

# /etc/systemd/system/mysqld@.service (模板)
[Unit]
Description=MySQL %i Instance
After=network.target

[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf.%i
ExecStop=/usr/local/mysql/bin/mysqladmin --defaults-file=/etc/my.cnf.%i shutdown
PIDFile=/data/mysql_%i/mysql.pid

[Install]
WantedBy=multi-user.target

# 實例化
systemctl enable mysqld@3306
systemctl enable mysqld@3307
systemctl start mysqld@3306

方案三:RPM 包安裝(文件佈局固定,需修改啟動腳本隔離配置)

關鍵操作

  • 安裝單份 RPM,數據目錄預設 /var/lib/mysql。
  • 複製數據目錄建立多實例基線:cp -r /var/lib/mysql /data/mysql_3306。
  • 配置多個 my.cnf(如 /etc/my3306.cnf, /etc/my3307.cnf),指定不同 port/datadir/socket/pid-file。
  • 修改 /etc/init.d/mysqld 複製為 mysqld_3306,調整 extra_args 解析邏輯,強制 --defaults-file。
  • 註冊多服務 chkconfig --add mysqld_3306。

痛點

RPM 文件佈局死板,修改啟動腳本極易遺漏細節(鎖文件、PID 文件、狀態檢查 pidof → ps),維護負擔重。


方案四:mysqld_multi 統一管理(官方工具,單一配置文件多段)

配置文件結構

[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = multi_admin
password = MultiPass@123

[mysqld3306]
port = 3306
datadir = /data/mysql_3306
socket = /data/mysql_3306/mysql.sock
pid-file = /data/mysql_3306/mysql.pid
# ... 其他參數

[mysqld3307]
port = 3307
datadir = /data/mysql_3307
socket = /data/mysql_3307/mysql.sock
pid-file = /data/mysql_3307/mysql.pid
# ... 其他參數

操作命令

mysqld_multi --defaults-file=/etc/my.cnf start 3306
mysqld_multi --defaults-file=/etc/my.cnf stop 3307
mysqld_multi --defaults-file=/etc/my.cnf report 3306,3307

缺陷

  • 無 status 子命令,只能 report 看進程是否在。
  • 啟動/停止非阻塞,無法確認是否真正成功(需自行 sleep + report)。
  • 所有實例共用一個 my.cnf,單點故障風險(誤改影響全局)。

方案選型決策表

場景推薦方案理由
生產高可用、需獨立升級、內核參數調優源碼包硬編碼隔離徹底,編譯期優化
通用生產、中小團隊、追求維護簡單二進制包 + systemd 模板部署快、配置清晰、systemd 原生管理
舊環境只能用 RPM、不想重裝RPM + 改造啟動腳本利用現狀,改造一次
單配置文件集中管理、實例數少(≤5)mysqld_multi官方工具、學習成本低

生產環境通用加固清單(無論哪種方案)

  1. 各實例 server-id 唯一,log-bin、relay-log 路徑隔離。
  2. innodb_buffer_pool_size 總和 ≤ 物理內存 70%,避免 OOM。
  3. 文件描述符限制:ulimit -n 65535、LimitNOFILE=65535 在 systemd 中。
  4. 監控掛載:Prometheus mysqld_exporter 多實例採集(不同 --web.listen-address)。
  5. 備份策略:xtrabackup 指定 --socket 逐實例備份,驗證恢復演練。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved