MySQL Cluster Replication With MySQL Cluster and non-NDB
- 環境介紹
因為筆電的空間和RAM有限,僅能在3台VM上來建置所有的場景VM配置:
(3台環境資源配置均相同就不分開寫了)
hostname-> IP Address
ol65-> 192.168.56.101
ol65-cluster1-> 192.168.56.103
ol65-cluster2->192.168.56.104:
OS: Oracle Linux 6.5
RAM: 4G
mysql-5.6.19-ndb-7.3.6-cluster-commercial-advanced
mysql-5.6.21-enterprise-commercial-advanced (這只有在192.168.56.101)
第一座MySQL cluster:
mgm_node: 192.168.56.101:1186
data_node_1: 192.168.56.103:50501
data_node_2: 192.168.56.104:50502
sql_node_1: 192.168.56.103:3306
sql_node_2: 192.168.56.104:3306
sql_node_2: 192.168.56.104:3306
第二座MySQL cluster:
slave_mgm: 192.168.56.101:1188
Table schema:
slave_mgm: 192.168.56.101:1188
slave_data_1: 192.168.56.103:50503
slave_data_2: 192.168.56.104:50504
slave_sql_1: 192.168.56.103:3306
slave_sql_2: 192.168.56.104:3306
MySQL Server
slave: 192.168.56.101:3306
slave_sql_2: 192.168.56.104:3306
MySQL Server
slave: 192.168.56.101:3306
- 架構
![]() |
MySQL Cluster Replication with MySQL Cluster |
![]() |
MySQL Cluster Replication with non-NDB |
- 前置設定
Table schema:
在Slave的mysql資料庫中新建此表,這個表是用來記錄已經從Master寫到Slave中的操作,所以之後的failover可以從這個表中找到線索
CREATE TABLE `ndb_apply_status` (
`server_id` INT(10) UNSIGNED NOT NULL,
`epoch` BIGINT(20) UNSIGNED NOT NULL,
`log_name` VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`start_pos` BIGINT(20) UNSIGNED NOT NULL,
`end_pos` BIGINT(20) UNSIGNED NOT NULL,
PRIMARY KEY (`server_id`) USING HASH
) ENGINE=NDBCLUSTER DEFAULT CHARSET=latin1;
這張表的storage engine如果是NDBCLUSTER的話只適用於cluster架構中,若不是可以改成MyISAM`server_id` INT(10) UNSIGNED NOT NULL,
`epoch` BIGINT(20) UNSIGNED NOT NULL,
`log_name` VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`start_pos` BIGINT(20) UNSIGNED NOT NULL,
`end_pos` BIGINT(20) UNSIGNED NOT NULL,
PRIMARY KEY (`server_id`) USING HASH
) ENGINE=NDBCLUSTER DEFAULT CHARSET=latin1;
Config file:
my.cnf (master_1:192.168.56.103:3306)
server_id = 1
log-bin
binlog_format = ROW
expire_logs_days = 7 #清理過期多少天的bin log
ndb-log-update-as-write=0
my.cnf (master_2:192.168.56.104:3306)
server_id = 2
log-bin
binlog_format = ROW
expire_logs_days = 7 #清理過期多少天的bin log
ndb-log-update-as-write=0
my.cnf (slave_1:192.168.56.103:3307)
server_id = 3
slave-exec-mode = IDEMPOTENT
skip-slave-start #(可設可不設)
slave-skip-errors = ddl_exist_errors
my.cnf (slave_2:192.168.56.104:3307)
server_id = 4
slave-exec-mode = IDEMPOTENT
skip-slave-start #(可設可不設)
slave-skip-errors = ddl_exist_errors
- Replication設定
其設定如同一般的replication設定一樣,但這邊官網建議要使用two replication channel,這個設定跟後面在做failover時找bin log位置有關,下面簡單寫一下two repl channel:
primary master (M)
secondary master (M')
primary slave (S)
secondary slave (S')
我上面的參數(Config file)不論是single或two channel都可以用(single channel只差在另一台master SQL Node的bin log沒有開啟跟slave SQL Node沒有設那幾個參數),然後同時間只有S是有啟動replication,S'是等主複製掛了才切換到這台上面。
其實我個人認為這個是用在2座cluster做replication時用的,在文件failover章節中的方式是M→S、M'→S',然後在最下面寫一句說:"理論上也可以是M→S'或M'→S,但還沒實驗過!",寫這樣超機車的,但我簡單測過後不論是對NDB或non-NDB都是沒問題的
- Failover
假設今天sql_node_1掛掉時replication就會中止,此時要將master切換到sql_node_2去,如下圖所示:

Failover
Step_01:
在slave_sql_2上面執行並記錄資料:
SELECT @latest:=MAX(epoch) FROM mysql.ndb_apply_status;
Step_02:
在sql_node_2上面執行:
SELECT @file:=SUBSTRING_INDEX(File, '/', -1), @pos:=Position
FROM mysql.ndb_binlog_index
WHERE epoch >@latest
ORDER BY epoch ASC LIMIT 1;
*這個@latest就是步驟一所得到的數值,若你在sql_node_2上面執行後沒有查出任何資料(Empty set (0.00 sec))就表示sql_node_2上面bin log中的資料,在slave中已寫到最新的位置上,如果在sql_node_2上面繼續寫入的話就會看到新的bin log位置。
Step_03:
接下來就是執行change master to的指令了,記得master的內容要改成sql_node_2的資料,master_log_file和master_log_pos就是步驟二中查出來的資料。
Step_04:
start slave;
show slave status\G
若沒有錯誤的話就完成failover動作啦!
參考文件:
http://johanandersson.blogspot.tw/2009_05_01_archive.html

留言
張貼留言