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

  第二座MySQL cluster:
  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

  • 架構
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

  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

留言

這個網誌中的熱門文章

【工作筆記】SQL Timeout追蹤

MySQL監控軟體MEM及PMM介紹

MySQL Router 設定檔說明