多實例部署是單機資源隔離、多版本共存、業務邊界劃分的經典方案。本文以 RHEL 6.4 + MySQL 5.6.26 二進制包為例,詳述用戶創建、目錄規劃、配置文件隔離、啟動腳本封裝、數據初始化、密碼管理、服務驗證全流程,並給出生產環境多實例監控、備份、升級標準化建議。
mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz(通用二進制包,免編譯)yum -y install ncurses-devel libaio-devel# 1. 創建專用用戶
useradd -M -s /sbin/nologin mysql
# 2. 解壓安裝包至統一目錄
tar xf mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz -C /usr/local
mv /usr/local/mysql-5.6.26-linux-glibc2.5-x86_64 /usr/local/mysql
# 3. 實例級目錄隔離(核心:basedir 共享,datadir/socket/log/pid 獨立)
mkdir -p /data/{3306,3307}/{data,log}
tree /data/
# /data/
# ├── 3306
# │ ├── data
# │ └── log
# └── 3307
# ├── data
# └── log
[client] port = 3306 socket = /data/3306/mysql.sock [mysqld] port = 3306 socket = /data/3306/mysql.sock pid-file = /data/3306/data/mysql.pid basedir = /usr/local/mysql datadir = /data/3306/data server-id = 1 # log-bin=mysql-bin # log-bin-index=mysql-bin.index log_error = /data/3306/log/mysql-error.log slow_query_log = 1 slow_query_log_file = /data/3306/log/mysql-slow.log
[client] port = 3307 socket = /data/3307/mysql.sock [mysqld] port = 3307 socket = /data/3307/mysql.sock pid-file = /data/3307/data/mysql.pid basedir = /usr/local/mysql datadir = /data/3307/data server-id = 2 # log-bin=mysql-bin # log-bin-index=mysql-bin.index log_error = /data/3307/log/mysql-error.log slow_query_log = 1 slow_query_log_file = /data/3307/log/mysql-slow.log
核心隔離點**:port、socket、pid-file、datadir、server-id、log_error、slow_query_log_file 必須唯一。
#!/bin/sh
. /etc/init.d/functions
port=3306
mysql_user="root"
mysql_pwd=""
mysql_sock="/data/${port}/mysql.sock"
CmdPath="/usr/local/mysql/bin"
usage() { printf "Usage: /data/${port}/mysql {start|stop|restart}\n"; }
start_mysql() {
if [ ! -e "$mysql_sock" ]; then
/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
action "Starting MySQL..." /bin/true
else
printf "MySQL is running...\n"; exit
fi
}
stop_mysql() {
if [ ! -e "$mysql_sock" ]; then
printf "MySQL is stopped...\n"; exit
else
action "Stoping MySQL..." /bin/true
${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
fi
}
restart_mysql() { stop_mysql >/dev/null; sleep 2; start_mysql >/dev/null; action "Restarting MySQL..." /bin/true; }
[ $# -ne 1 ] && usage
case $1 in start) start_mysql;; stop) stop_mysql;; restart) restart_mysql;; *) usage;; esac
同上,僅修改 port=3307 及對應路徑變量。
chown -R mysql:mysql /data chmod +x /data/3306/mysql /data/3307/mysql echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile source /etc/profile
cd /usr/local/mysql/scripts ./mysql_install_db --defaults-file=/data/3306/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data ./mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data /data/3306/mysql start /data/3307/mysql start netstat -lntp | grep 330 # tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 12345/mysqld # tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 12346/mysqld
# 實例 3306
mysql -S /data/3306/mysql.sock -e "UPDATE mysql.user SET password=PASSWORD('123456') WHERE user='root'; FLUSH PRIVILEGES;"
# 實例 3307
mysql -S /data/3307/mysql.sock -e "UPDATE mysql.user SET password=PASSWORD('123456') WHERE user='root'; FLUSH PRIVILEGES;"
# 寫回啟動腳本(避免每次操作輸入密碼)
sed -i 's/mysql_pwd=""/mysql_pwd="123456"/g' /data/3306/mysql /data/3307/mysql
| 維度 | 建議 |
|---|---|
| 端口規劃 | 3306 基線,業務隔離遞增(3307, 3308...),避開系統保留端口 |
| 資源隔離 | cgroups 限制 CPU/記憶體、獨立磁碟掛載 datadir、獨立 tmpdir |
| 監控接入 | Prometheus mysqld_exporter 多端口採集、標籤區分 instance=3306/3307 |
| 備份策略 | 實例級獨立備份腳本、錯峰執行、Binlog 統一歸檔 |
| 升級發布 | 滾動升級:停一啟一、驗證無誤再升級下一實例、保留回滾腳本 |
| 配置管理 | Ansible/SaltStack 模版化渲染 my.cnf、啟動腳本、防火牆規則 |
mysql -u root -p -S /data/3307/mysql.sockmysqladmin -u root -p123456 -S /data/3306/mysql.sock shutdowntail -f /data/3306/log/mysql-error.log多實例部署的核心是「basedir 共享,datadir 隔離,配置參數化,運維標準化」。將上述流程封裝為 Ansible Role 或 Shell 函數庫,實現「單條命令部署新實例、單條命令滾動升級」,讓多實例管理從手工藝走向工業化。