如何以最短停機時間加密 MySQL 或 MariaDB 的未加密 Amazon RDS 資料庫執行個體?
我嘗試為 MySQL 或 MariaDB 建立未加密 Amazon Relational Database Service (Amazon RDS) 執行個體的加密讀取複本。但是,我收到了錯誤訊息。我該如何解決此問題?
簡短描述
Amazon RDS 對加密的資料庫執行個體設定了下列限制:
- 您無法修改現有的未加密 Amazon RDS 資料庫執行個體來加密執行個體。
- 您無法從未加密執行個體建立加密的讀取複本。
因為您無法加密現有的 Amazon RDS 執行個體,所以必須建立新的加密執行個體。否則,在建立未加密 Amazon RDS for MySQL 執行個體的加密讀取複本時,即會收到下列錯誤訊息:
"You cannot create an encrypted Read Replica from an unencrypted DB instance. (Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterCombination; Request ID:)"
若要以最短停機時間加密未加密的資料庫執行個體,請遵循下列步驟:
1. 加密從未加密資料庫執行個體之讀取複本擷取的未加密快照。
2. 從加密快照還原新的資料庫執行個體,以部署新的加密資料庫執行個體。
3. 使用 MySQL 複寫將來源變更同步至新的加密資料庫執行個體。
4. 確認新的加密資料庫執行個體與來源資料庫執行個體同步。
5. 切換您的連線,然後將流量重新導向至新的資料庫執行個體。
解決方法
以最短停機時間設定複寫
1. 為來源的未加密 Amazon RDS 資料庫執行個體建立臨時讀取複本。在此範例中,來源的未加密資料庫執行個體稱為 SOURCE-EU,而臨時讀取複本稱為 TEMP-RR。
2. 連線至 TEMP-RR 並監控複本延遲,直到 Seconds_Behind_Master 在值為 0 時保持穩定。這表示 TEMP-RR 與 SOURCE-EU 同步:
mysql> SHOW SLAVE STATUS \G Seconds_Behind_Master: 0
3. 停止 TEMP-RR 上的複寫流程。
MySQL > call mysql.rds_stop_replication; +---------------------------+ | Message | +---------------------------+ | Slave is down or disabled | +---------------------------+
4. 請注意 Relay_Master_Log_File 和 Exec_Master_Log_Pos 來自 TEMP-RR 的值:
mysql> SHOW SLAVE STATUS \G Relay_Master_Log_File: mysql-bin-changelog.000012 Exec_Master_Log_Pos: 123
5. 在 SOURCE-EU 中,設定 Binlog 保留時間參數,以保留完成操作所需時間的二進位日誌。在下列範例中,Binlog 保留時間設為 24 小時:
mysql> call mysql.rds_set_configuration('binlog retention hours', 24);
6. 拍攝 TEMP-RR 的快照。或者,在拍攝快照後刪除 TEMP-RR。
7. 複製 TEMP-RR 的快照,然後將啟用加密設為是。
8. 從啟用加密的已複製快照中,還原新的資料庫執行個體。在此範例中,新的加密資料庫執行個體稱為 NEW-RR-EN。
9. 修改 SOURCE-EU 安全群組的傳入規則,以允許來自 NEW-RR-EN 的流量。如果您在兩個資料庫執行個體上使用相同的安全群組,即可使用與 SOURCE-EU 相同的安全群組 ID 參照。
注意: 請務必允許從 NEW-RR-EN 到 SOURCE-EU 的輸出流量。
10. 登入 SOURCE-EU、設定複寫使用者,然後向使用者授予必要權限:
mysql> create user 'repl_user'@'%' identified by 'password123'; mysql> grant replication slave, replication client on *.* to 'repl_user'@'%'; mysql> show grants for 'repl_user'@'%';
注意: 使用您自己的複寫使用者名稱和密碼,分別取代 repl_user 和 password123。
11. 連線至 NEW-RR-EN,然後建立到 SOURCE-EU 的複寫連線:
mysql> CALL mysql.rds_set_external_master ( 'rds-endpoint' , 3306 , 'repl_user' , 'password123' , 'mysql-bin.000012' , 123 , 0 );
rds-endpoint 是 SOURCE-EU 的資料庫執行個體端點。
使用者名稱 (repl_user) 和密碼 (password123) 是您在步驟 10 中建立的使用者名稱和密碼。使用從步驟 4 中擷取的值 Relay_Master_Log_File 和 Exec_Master_Log_Pos,以透過 mysql.rds_set_external_master 程序設定複寫。
注意: 如果 SOURCE-EU 可公開存取,而且 NEW-RR-EN (新的加密資料庫執行個體) 已設為「私人」,請使用 SOURCE-EU 的私人 IP 地址,而不是 rds-endpoint。
12. 從 NEW-RR-EN 開始複寫:
mysql > CALL mysql.rds_start_replication;
13. 從 NEW-RR-EN 確認複寫成功,並在 SOURCE-EU 和 NEW-RR-EN 之間完成同步。
mysql> SHOW SLAVE STATUS \G
如果您在來源資料庫執行個體和讀取複本之間的連線成功,則輸出內容如下所示:
Slave_IO_State: Waiting for master to send event Seconds Behind master: 0
14. Seconds_Behind_Master 在值為 0 時保持穩定後,請停止流量並關閉 SOURCE-EU 上的連線。然後,停機開始。
注意: 停止所有連線至 SOURCE-EU 的應用程式伺服器和用戶端,以確定 SOURCE-EU 沒有新的變更。或者,您可以暫時鎖定 SOURCE-EU 使用的安全群組。如此可防止來自任何應用程式或用戶端的輸入流量,NEW-RR-EN 和使用者執行這些動作時的主機除外。
15. 身為資料庫的主要使用者,請連線至 NEW-RR-EN,然後停止複寫:
MySQL > call mysql.rds_stop_replication;
重要: 執行此命令後,NEW-RR-EN 再也不會複寫 SOURCE-EU 的資料。
16. 停止 SOURCE-EU 和 NEW-RR-EN 之間的複寫關係,將 NEW-RR-EN 升級至獨立伺服器:
MySQL > call mysql.rds_reset_external_master;
17. 在所有連線字串中指定 NEW-RR-EN DNS 端點,將所有應用程式、用戶端及資料庫連線指向至 NEW-RR-EN。或者,重新命名 SOURCE-EU 並修改 NEW-RR-EN,以使用與 SOURCE-EU 所用相同的名稱。
18. 在 NEW-RR-EN 上,確認其安全群組規則允許適當應用程式和用戶端的輸入流量。
19. 將應用程式和用戶端指向至 NEW-RR-EN 並測試環境後,刪除 SOURCE-EU。
提示: 最佳實務是先在測試執行個體上測試此操作,再將其套用至生產環境。
相關資訊
相關內容
- 已提問 4 個月前lg...
- 已提問 10 個月前lg...
- 已提問 1 年前lg...
- 已提問 7 個月前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前