MySQL Cluster (NDB) 的 SQL Node 作為主庫,向獨立 MySQL Server (InnoDB/MyISAM) 做從庫的異構複製架構,涉及 binlog 格式、權限、網路連通性等多層面配置。本文記錄搭建過程中遇到的 Last_IO_Error: error connecting to master 錯誤診斷全過程。
| 角色 | IP | 節點類型 | MySQL 版本 |
|---|---|---|---|
| MGM 管理節點 | 192.168.55.11 | nodeid=1 | Cluster 7.2.8 |
| Data + SQL Node | 192.168.55.10 | nodeid=2,4 | MySQL 5.5.27 / NDB 7.2.8 |
| Data + SQL Node | 192.168.55.9 | nodeid=3,5 | MySQL 5.5.27 / NDB 7.2.8 |
| 獨立從庫 | 192.168.55.133 | 標準 MySQL | MySQL 5.5.27 |
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog_format = ROW # NDB 必須使用 ROW 格式
binlog-do-db = db_name1
binlog-do-db = db_name2
binlog-ignore-db = db_name3
ndb_nodeid = 4 # Cluster 節點 ID
[mysqld]
server-id = 3
log-bin = mysql-bin
binlog_format = ROW
binlog-do-db = db_name1
binlog-do-db = db_name2
binlog-ignore-db = db_name3
# 在 192.168.55.9 (SQL Node nodeid=5) 執行
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slavemysql'@'192.168.211.133' IDENTIFIED BY '908';
mysql> FLUSH PRIVILEGES;
# 查看主庫狀態
mysql> SHOW MASTER STATUS;
+------------------+----------+------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+------------------+------------------+
| mysql-bin.000003 | 112 | db_name1,db_name2| db_name3 |
+------------------+----------+------------------+------------------+
# 在 192.168.55.133 執行
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.55.9',
MASTER_USER='slaveuser',
MASTER_PASSWORD='000',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=112;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;
Last_IO_Error: error connecting to master 'slaveuser@192.168.55.9:3306' - retry-time: 60 retries: 86400
# 從庫可直接連線主庫
[root@slave]# mysql -h 192.168.55.9 -u slavemysql -p
Enter password:
Welcome to the MySQL monitor...
mysql>
網路通、帳號密碼對、權限已授予,但複製線程連不上。
仔細對比發現兩個關鍵不一致:
| 項目 | 主庫授權 | 從庫 CHANGE MASTER | 問題 |
|---|---|---|---|
| 用戶名 | slavemysql | slaveuser | ❌ 不一致 |
| 密碼 | 908 | 000 | ❌ 不一致 |
| 允許主機 | 192.168.211.133 | 無指定(從庫IP) | ⚠️ 需匹配從庫實際IP |
# 1. 在主庫 (192.168.55.9) 重新授權,匹配從庫實際 IP
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'192.168.55.133' IDENTIFIED BY '000';
mysql> FLUSH PRIVILEGES;
# 2. 在從庫重新配置
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.55.9',
MASTER_USER='slaveuser',
MASTER_PASSWORD='000',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=112;
mysql> START SLAVE;
# 3. 驗證
mysql> SHOW SLAVE STATUS\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
ndb_log_bin=1 (預設開啟)binlog-do-db / replicate-do-db 需在主從雙端一致配置ndb_slave_conflict_role 等衝突解決機制# 1. 網路連通性
telnet master_ip 3306
# 2. 帳號權限驗證
mysql -h master_ip -u repl_user -p
# 3. 主庫授權檢查
SELECT user, host FROM mysql.user WHERE user='repl_user';
SHOW GRANTS FOR 'repl_user'@'slave_ip';
# 4. 從庫配置核對
SHOW SLAVE STATUS\G;
# 重點檢查:Master_Host, Master_User, Master_Port, Master_Log_File, Read_Master_Log_Pos
# 5. 防火牆/SELinux
iptables -L -n | grep 3306
getenforce
此次故障純屬配置參數不一致導致:主庫授權用戶 slavemysql/908,從庫配置 slaveuser/000。複製建立時必須嚴格核對用戶名、密碼、允許主機三要素。Cluster 環境下額外注意 ROW 格式強制與節點 ID 配置。建議建立標準化複製部署腳本,避免手動輸入錯誤。