1. 程式人生 > >讓天下沒有難用的資料庫 » 如何將RDS的資料同步到本地自建資料庫

讓天下沒有難用的資料庫 » 如何將RDS的資料同步到本地自建資料庫

長期以來有很多的使用者諮詢如何將RDS的資料同步到本地的資料庫環境中,本篇文章以在阿里雲的ECS伺服器為例來說明如何將RDS的資料同步到本地資料庫中。RDS對外提供服務是一個DNS地址+埠3306,這樣就遮蔽了RDS後端的主從節點,那麼該如何將資料同步到本地?那麼我們來看一下RDS的主從架構:

應用連線RDS,流量通過SLB指向主從節點的master,所以如果我們連線RDS的賬戶具有REPLICATION SLAVE, REPLICATION CLIENT的許可權,則就可以把主庫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,詳細步驟可以參考如下:

一些關鍵注意點:

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的物理備份檔案恢復

innodb_log_files_in_group=2###使用RDS的物理備份檔案恢復

innodb_log_file_size=524288000###使用RDS的物理備份檔案恢復

2.MySQL安裝好後,可以使用RDS提供的物理備份檔案恢復到本地MySQL中,可以參考:

注意:

需要將備份解壓後的檔案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 or failed to initialize properly. You must at least set –server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.

原因是由於RDS的備份檔案中包含了RDS的主從複製關係,需要把這些主從複製關係清理掉,清理方法:

truncate table  slave_relay_log_info;

truncate table  mysql.slave_master_info;

truncate table  mysql.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 status\G檢視同步狀態,同時可以在RDS中插入測試一些資料,或者重啟例項,觀察同步情況:

mysql> show slave status\G;

Slave_IO_State: Queueing master event to the relay log

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 the relay 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。