多實例核心需求
- 單機運行多個隔離的 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 | 官方工具、學習成本低 |
生產環境通用加固清單(無論哪種方案)
- 各實例
server-id 唯一,log-bin、relay-log 路徑隔離。
innodb_buffer_pool_size 總和 ≤ 物理內存 70%,避免 OOM。
- 文件描述符限制:
ulimit -n 65535、LimitNOFILE=65535 在 systemd 中。
- 監控掛載:Prometheus
mysqld_exporter 多實例採集(不同 --web.listen-address)。
- 備份策略:
xtrabackup 指定 --socket 逐實例備份,驗證恢復演練。