如何將RDS的數據同步到本地自建數據庫


長期以來有很多的用戶咨詢如何將RDS的數據同步到本地的數據庫環境中,本篇文章以在阿里雲的ECS服務器為例來說明如何將RDS的數據同步到本地數據庫中。RDS對外提供服務是一個DNS地址+端口3306,這樣就屏蔽了RDS后端的主從節點,那么該如何將數據同步到本地?那么我們來看一下RDS的主從架構:

應用連接RDS,流量通過SLB指向主從節點的master,所以如果我們連接RDS的賬戶具有REPLICATION SLAVE, REPLICATION CLIENT的權限,則就可以把主庫master的產生的binlog同步到本地數據庫中去,實現數據同步。

但是這種根據binlog文件和位點來同步RDS的數據到本地的方式非常容易導致同步中斷,因為當RDS發生了主備切換(主備切換,重啟,跨機遷移),本地數據庫所指向RDSbinlog
 
位點則會發生變化(RDS主庫與備庫的binlog位點是不一致的),這樣就會導致本地數據庫與RDS的數據復制同步中斷。
RDS
5.6
的版本中主備同步使用新復制方式GTIDRDS的主備具有相同的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的物理備份文件恢復
innodb_log_files_in_group=2###
使用RDS的物理備份文件恢復
innodb_log_file_size=524288000###
使用RDS的物理備份文件恢復
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 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;
設置本地MySQLRDS的復制關系,賬戶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的原生復制,所以可能會導致本地MySQLRDS的復制出現中斷,可以定時去探測  Slave_IO_Running Slave_SQL_Running兩個狀態值是否為yes,同時也需要關注本地MySQLRDS的延遲: Seconds_Behind_Master


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM