摘要: 長期以來有很多的用戶查閱如何將RDS的資料同步到本地的資料庫環境中,本篇本文以在阿裡雲的ECS伺服器為例來說明如何將RDS的資料同步到本機資料庫中。RDS對外提供服務是一個DNS位址+埠3306,這樣就遮罩了RDS後端的主從節點,那麼該如何將資料同步到本地?那麼我們來看一下RDS的主從架構:
長期以來有很多的用戶查閱如何將RDS的資料同步到本地的資料庫環境中,本篇本文以在阿裡雲的ECS伺服器為例來說明如何將RDS的資料同步到本機資料庫中。RDS對外提供服務是一個DNS位址+埠3306,這樣就遮罩了RDS後端的主從節點,那麼該如何將資料同步到本地?那麼我們來看一下RDS的主從架構:
套用串連RDS,流量通過SLB指向主從節點的master,所以如果我們串連RDS的帳戶具有REPLICATION SLAVE, REPLICATIONCLIENT的權限,則就可以把主庫master的產生的binlog同步到本機資料庫中去,實現資料同步。
但是這種根據binlog檔案和位元點來同步RDS的資料到本地的方式非常容易導致同步中斷,因為當RDS發生了主備切換(主備切換,重啟,跨機遷移),本機資料庫所指向RDS的binlog 位點則會發生變化(RDS主庫與備庫的binlog位點是不一致的),這樣就會導致本機資料庫與RDS的資料複製同步中斷。
在RDS 5.6的組建中主備同步使用新複製方式GTID,RDS的主備具有相同的GTID,那麼如果主備發生切換,重啟或者遷移,主備的GTID是不會發生變化,那麼ECSàRDS的同步鏈路則不會發生中斷,所以如果要將RDS的資料同步到本地,則需要將RDS升級到5.6的組建。
下面我們將RDS資料同步到本地的一些關鍵步驟羅列出來:
1.在ECS伺服器上安裝MySQL,詳細步驟可以參考如下:
http://www.centoscn.com/mysql/2014/0924/3833.html
一些關鍵注意點:
a.資料庫的組建至少為5.6.16及以上
b.需要在my.cnf中設定的一些關鍵參數:
server-id ###Slave設定需要
master-info-repository=file### Slave設定需要
relay-log-info_repository=file### Slave設定需要
binlog-format=ROW### Slave設定需要
gtid-mode=on###開啟GTID需要
enforce-gtid-consistency=true###開啟GTID需要
innodb_data_file_path=ibdata1:200M:autoextend###使用RDS的物理備份中的backup-my.cnf參數
innodb_log_files_in_group=2###使用RDS的物理備份中的backup-my.cnf參數
innodb_log_file_size=524288000###使用RDS的物理備份中的backup-my.cnf參數
2.MySQL安裝好後,可以使用RDS提供的物理備份檔案復原到本地MySQL中,可以參考:
http://help.aliyun.com/knowledge_detail/5973700.html?spm=5176.7114037.1996646101.1.7qe3ot&pos=1
注意:
需要將備份解壓後的檔案backup-my.cnf中的三個參數加到開機檔案中去
innodb_checksum_algorithm=innodb
innodb_data_file_path=ibdata1:200M:autoextend
innodb_log_files_in_group=2
3.資料庫啟動後,開始設定本機資料庫與RDS的同步關聯
a.reset slave;####用於重設本地MySQL的複製關聯,這一步動作有可能報錯:
mysql> reset slave;
ERROR 1794 (HY000): Slave is not configured orfailed to initialize properly. You must at least set –server-id to enableeither a master or a slave. Additional error messages can be found in the MySQLerror log.
原因是由於RDS的備份檔案中包含了RDS的主從複製關聯,需要把這些主從複製關聯清理掉,清理方法:
truncate table slave_relay_log_info;
truncate table mysql.slave_master_info;
truncate tablemysql.slave_worker_info;
然後重啟MySQL;
b.SET @@GLOBAL.GTID_PURGED
=’818795a2-8aa8-11e5-95b1:1-289,8da7b8ab-8aa8-11e5-95b1:1-75′;
打開備份解壓檔案可以看到檔案xtrabackup_slave_info,其中第一行就是我們需要在本地MySQL執行的指令,他表示在備份結束時刻RDS本期GTID值’
c.change master to
master_host=’gtid1.mysql.rds.aliyuncs.com’,
master_user=’qianyi’,master_port=3306,master_password=’qianyi’,
master_auto_position=1;
設定本地MySQL與RDS的複製關聯,帳戶qianyi是在RDS控制系統中新增(注意:
同步帳戶不要以repl開頭);
4.測試同步關聯是否正常,可以在本地MySQL執行show slave statusG查看同步狀態,同時可以在RDS中插入測試一些資料,或者重啟實例,觀察同步情況:
mysql> show slave statusG;
Slave_IO_State: Queueing master event to the relaylog
Master_Host: gtid1.mysql.rds.aliyuncs.com
Master_User: qianyi
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000007
Read_Master_Log_Pos: 625757
Relay_Log_File: slave-relay.000002
Relay_Log_Pos: 2793
Relay_Master_Log_File: mysql-bin.000007
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Exec_Master_Log_Pos: 612921
Relay_Log_Space: 15829
Seconds_Behind_Master:57133
Master_SSL_Verify_Server_Cert: No
Master_Server_Id: 2319282016
Master_UUID: 818795a2-8aa8-11e5-95b1-6c92bf20cfcf
Master_Info_File: /data/work/mysql/data3001/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Reading event from therelay log
Master_Retry_Count: 86400
818795a2-8aa8-11e5-95b1-6c92bf20cfcf:17754-17811
Executed_Gtid_Set: 818795a2-8aa8-11e5-95b1-6c92bf20cfcf:1-17761
Auto_Position: 1
5.做好監控,由於採用MySQL的原生複製,所以可能會導致本地MySQL與RDS的複製出現中斷,可以定時去探查Slave_IO_Running和 Slave_SQL_Running兩個狀態值是否為yes,同時也需要追隨本地MySQL與RDS的延遲: Seconds_Behind_Master。
相關產品:
- 雲資料庫RDS
- 雲資料庫 MongoDB 版
- 資料轉送
- 雲端服務器ECS