延續上篇核心思想:程序文件與數據文件安裝在不同物理硬件,目錄結構如下:
硬盤 1 硬盤 2 ├── /usr ├── /data/app_1/ (應用數據、啟動腳本) ├── /home/mysql ├── /data/app_2/ │ └── (指向最新版本的鏈接) ├── /data/app_3/ ├── /home/mysql-3.23.54/ (最新版本 MySQL) └── /home/mysql-old/ (舊版本備份)
./configure --prefix=/home/mysql --without-innodb make make install
--with-charset:僅影響排序,增加遷移複雜度start_mysql.sh#!/bin/sh rundir=`dirname "$0"` echo "$rundir" /home/mysql/bin/safe_mysqld \ --user=mysql \ --pid-file="$rundir"/mysql.pid \ --datadir="$rundir"/var \ -O max_connections=500 \ -O wait_timeout=600 \ -O key_buffer=32M \ --port=3402 \ --socket="$rundir"/mysql.sock &
--pid-file、--socket、--datadir 全指向 $rundir,實現「一個目錄管一個實例」-O 後的全局變量需根據業務實測調整--port 區分不同業務服務,繞開單實例連接數瓶頸rc.local/data/app_1/start_mysql.sh /data/app_2/start_mysql.sh /data/app_3/start_mysql.sh
必須寫絕對路徑,確保開機自啟可靠性。
stop_mysql.sh#!/bin/sh rundir=`dirname "$0"` echo "$rundir" /home/mysql/bin/mysqladmin \ -u mysql \ -S "$rundir"/mysql.sock shutdown
新增服務只需複製目錄、修改 --port 參數。單目錄下的數據與腳本可獨立打包、遷移、版本控制。
mysql.pid、mysql.sock 等臨時文件各歸其主目錄,多實例互不干擾。避免了放在 /tmp 時被系統清理或其他程序誤刪的風險。
程序在硬盤 1,數據在硬盤 2。硬盤 1 掛了,直接把硬盤 2 掛到新服務器(已裝好同版本 MySQL)即可立即對外服務。若配置寫在 my.cnf 還需額外備份配置,而腳本方案天然攜帶配置。
運維心法:「數據與程序分離、實例與實例隔離、配置與代碼同版本」是高可用 MySQL 架構的三板斧。