如何以最短停機時間加密 MySQL 或 MariaDB 的未加密 Amazon RDS 資料庫執行個體?

3 分的閱讀內容
0

我嘗試為 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-RRSOURCE-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_FileExec_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-ENSOURCE-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_userpassword123

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-endpointSOURCE-EU資料庫執行個體端點

使用者名稱 (repl_user) 和密碼 (password123) 是您在步驟 10 中建立的使用者名稱和密碼。使用從步驟 4 中擷取的值 Relay_Master_Log_FileExec_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-EUNEW-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-EUNEW-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

提示: 最佳實務是先在測試執行個體上測試此操作,再將其套用至生產環境。


相關資訊

使用讀取複本

如何加密 Amazon RDS 快照?

對 MySQL 文件中的複寫進行疑難排解

使用外部的主要執行個體,設定二進位日誌檔位置複寫

AWS 官方
AWS 官方已更新 3 年前