本教學示範在兩台已安裝 MySQL 5.1.48 (RPM 套件) 的 Linux 伺服器上建立主從同步,並透過 MySQL-Proxy 實現讀寫分離。為避免版本相容性問題,主從伺服器的 MySQL 版本應保持一致。
[mysqld] server-id = 1 log-bin = mysql-bin binlog-do-db = data binlog-ignore-db = mysql log-bin = /var/log/mysql/updatelog log-slave-updates slave-skip-errors
關鍵參數說明:
server-id:唯一識別碼,Master 必須為 1~2³²⁻¹ 間的正整數log-bin:啟用二進制日誌,記錄所有數據變更binlog-do-db / binlog-ignore-db:指定同步/忽略的資料庫log-slave-updates:將從庫接收到的更新也寫入自身二進制日誌(鏈式同步需開啟)GRANT REPLICATION SLAVE ON *.* TO 'test'@'192.168.0.2' IDENTIFIED BY 'your_password';
僅授予 REPLICATION SLAVE 權限,遵循最小權限原則。
/usr/bin/mysqladmin -uroot shutdown /usr/bin/mysqld_safe &
# Master 上執行 FLUSH TABLES WITH READ LOCK; cd /var/lib/mysql tar -czf data.tar.gz data scp ./data.tar.gz root@192.168.0.2:/var/lib/mysql
注意: 鎖表期間不可寫入,操作需迅速完成。
[mysqld] server-id = 3 log-bin = mysql-bin master-host = 192.168.0.1 master-user = test master-password = your_password master-port = 3306 master-connect-retry = 60 replicate-ignore-db = mysql replicate-do-db = data log-slave-updates slave-skip-errors
server-id 唯一且不衝突;master-connect-retry 設定斷線重連間隔(秒)。
# Slave 上執行 cd /var/lib/mysql tar -xzf data.tar.gz # 無需修改權限,預設保持原狀 # 登入 MySQL 啟動同步 SLAVE START; SHOW SLAVE STATUS\G
確認 Slave_IO_Running: Yes 且 Slave_SQL_Running: Yes 表示同步正常。
因備份過程中 Master 仍在寫入,需以實際 SHOW MASTER STATUS 為準:
# Master SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | updatelog.000012 | 15016 | data | mysql | +------------------+----------+--------------+------------------+ # Slave 修正位點 SLAVE STOP; CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='test', MASTER_PASSWORD='your_password', MASTER_LOG_FILE='updatelog.000012', MASTER_LOG_POS=15016; SLAVE START;
UNLOCK TABLES;
至此主從同步配置完成,可透過 Seconds_Behind_Master: 0 驗證無延遲。
需編譯安裝以下套件(版本為示範時期版本,實際部署請取最新穩定版):
編譯安裝通用流程:./configure && make && make install
yum install libtermcap-devel ncurses-devel libevent-devel readline-devel
cp etc/lua.pc /usr/local/lib/pkgconfig/lua5.1.pc
系統自帶 glib2 版本較舊,需手動編譯安裝 glib-2.18.4。
需從源碼編譯 MySQL 客戶端:
./configure --prefix=/usr/local/mysql --without-server make && make install
隨後編譯 mysql-proxy 指定路徑:
./configure --prefix=/usr/local/mysql-proxy --with-mysql=/usr/local/mysql --with-lua
建立 /var/lib/bin/mysql-proxy.sh:
#!/bin/bash LUA_PATH="/usr/local/mysql-proxy/lib/mysql-proxy/lua/?.lua" \ /usr/local/mysql-proxy/bin/mysql-proxy \ --proxy-backend-addresses=192.168.0.1:3306 \ --proxy-read-only-backend-addresses=192.168.0.2:3306 \ --proxy-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/rw-splitting.lua \ >> /var/log/mysql-proxy.log &
賦予執行權限並啟動:chmod a+x /var/lib/bin/mysql-proxy.sh && /var/lib/bin/mysql-proxy.sh
netstat -an | grep 404 # 應顯示 4040 (代理端口) 和 4041 (管理端口) 皆處於 LISTEN 狀態
Seconds_Behind_Master 持續為 0