如何以最短停機時間對未加密的 Amazon RDS for MySQL 或 MariaDB 資料庫執行個體進行加密?
我嘗試為未加密的 Amazon Relational Database Service (Amazon RDS) for MySQL 或 MariaDB 資料庫執行個體建立加密的讀取複本。然而,我收到了一個錯誤。
簡短說明
Amazon RDS 對加密的資料庫執行個體設定了以下限制:
- 您無法修改現有未加密的 Amazon RDS 資料庫執行個體來加密該執行個體。
- 您無法從未加密的執行個體建立加密的讀取複本。
由於您無法加密現有的 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:)」
若要以最短停機時間加密未加密的資料庫執行個體,請完成以下步驟:
- 加密您從資料庫執行個體的未加密讀取複本建立的未加密快照。
- 從加密快照還原新的資料庫執行個體,以部署新的加密資料庫執行個體。
- 使用 MySQL 複寫,同步來源與新加密資料庫執行個體之間的變更。
- 確認新的加密資料庫執行個體已與來源資料庫執行個體同步。
- 切換您的連線,然後將流量重新導向到新的資料庫執行個體。
解決方法
加密未加密的快照
若要加密您從未加密讀取複本建立的未加密快照,請完成以下步驟:
-
為來源未加密 RDS 資料庫執行個體建立臨時讀取複本。在此範例中,來源未加密資料庫執行個體為 SOURCE-EU,臨時讀取複本為 TEMP-RR。
-
連線至 TEMP-RR。然後,執行以下命令來監控複本延遲,直到 Seconds_Behind_Master 穩定維持在 0:
mysql> SHOW SLAVE STATUS \G Seconds_Behind_Master: 0**注意:**穩定值表示 TEMP-RR 已與 SOURCE-EU 同步。
-
執行以下命令,以停止 TEMP-RR 上的複寫程序:
MySQL > call mysql.rds_stop_replication; +---------------------------+ | Message | +---------------------------+ | Slave is down or disabled | +---------------------------+ -
請記下 TEMP-RR 中的 Relay_Master_Log_File 與 Exec_Master_Log_Pos 值,如以下範例所示:
mysql> SHOW SLAVE STATUS \G Relay_Master_Log_File: mysql-bin-changelog.000012 Exec_Master_Log_Pos: 123 -
在 SOURCE-EU 中,設定 binlog retention hours 參數,以保留完成此作業所需時間內的二進位日誌。在以下範例中,binlog retention hours 設為 24 小時:
mysql> call mysql.rds_set_configuration('binlog retention hours', 24); -
建立 TEMP-RR 的快照。您也可以在建立快照後刪除 TEMP-RR。
-
複製 TEMP-RR 的快照 ,然後將 Enable Encryption (啟用加密) 設為 Yes (是)。
從加密快照還原新的資料庫執行個體
從複製的快照還原新的資料庫執行個體,並開啟加密。在此範例中,新的加密資料庫執行個體為 NEW-RR-EN。
修改 SOURCE-EU 安全群組中的傳入規則,以允許來自 NEW-RR-EN 的流量。如果您在兩個資料庫執行個體上使用相同的安全群組,則可以使用與 SOURCE-EU 相同的安全群組 ID 參考。
**注意:**允許從 NEW-RR-EN 傳出流量至 SOURCE-EU。
將來源執行個體的變更同步到新的加密執行個體
若要使用 MySQL 複寫將來源同步至新的加密資料庫執行個體,請完成以下步驟:
- 登入 SOURCE-EU。
- 執行以下命令來設定複寫使用者,並授予該使用者必要權限:
**注意:**將 repl_user 替換為您的複寫使用者名稱,並將 password123 替換為您的密碼。mysql> create user 'repl_user'@'%' identified by 'password123'; mysql> grant replication slave, replication client on *.* to 'repl_user'@'%'; mysql> show grants for 'repl_user'@'%'; - 執行以下命令以連線至 NEW-RR-EN,並建立到 SOURCE-EU 的複寫連線:
注意:將 rds-endpoint 替換為 SOURCE-EU 的資料庫執行個體端點。將 repl_user 與 password123 替換為您建立的使用者名稱與密碼。使用 Relay_Master_Log_File 與 Exec_Master_Log_Pos 值,透過 mysql.rds_set_external_master 程序設定複寫。如果 SOURCE-EU 為公開存取,且 NEW-RR-EN 設為私有,則請使用 SOURCE-EU 的私有 IP 位址,而非 rds-endpoint。mysql> CALL mysql.rds_set_external_master ( 'rds-endpoint' , 3306 , 'repl_user' , 'password123' , 'mysql-bin.000012' , 123 , 0 ); - 從 NEW-RR-EN 執行以下命令以啟動複寫:
mysql > CALL mysql.rds_start_replication;
確認加密執行個體已與來源執行個體同步
若要確認新的加密資料庫執行個體已與來源資料庫執行個體同步,請完成以下步驟:
-
從 NEW-RR-EN 執行以下命令,以確認 SOURCE-EU 與 NEW-RR-EN 之間的複寫已成功且保持同步:
mysql> SHOW SLAVE STATUS \G如果來源資料庫執行個體與讀取複本之間的連線成功,則輸出會類似以下內容:
Slave_IO_State: Waiting for master to send eventSeconds Behind master: 0 -
在 Seconds_Behind_Master 穩定維持在 0 之後,停止流量並關閉 SOURCE-EU 上的連線。
**注意:**停止所有連線至 SOURCE-EU 的應用程式伺服器與用戶端,以確保您不會對 SOURCE-EU 進行變更。您也可以暫時鎖定 SOURCE-EU 所使用的安全群組。您必須阻止來自任何應用程式或用戶端的傳入流量,但 NEW-RR-EN 與使用者執行這些動作的主機除外。
切換您的連線並將流量重新導向到新的資料庫執行個體
若要切換您的連線並將流量重新導向到新的資料庫執行個體,請完成以下步驟:
-
以資料庫領導使用者身分連線至 NEW-RR-EN,然後執行以下命令以停止複寫:
MySQL > call mysql.rds_stop_replication;**注意:**執行此命令後,NEW-RR-EN 將不再從 SOURCE-EU 複寫資料。
-
若要將 NEW-RR-EN 提升為獨立伺服器,請執行以下命令,以停止 SOURCE-EU 與 NEW-RR-EN 之間的複寫關係:
MySQL > call mysql.rds_reset_external_master; -
若要將所有應用程式、用戶端與資料庫連線指向 NEW-RR-EN,請在所有連線字串中指定 NEW-RR-EN DNS 端點。或者,重新命名 SOURCE-EU,然後修改 NEW-RR-EN 以使用與 SOURCE-EU 相同的名稱。
-
確認 NEW-RR-EN 上的安全群組規則允許來自適當應用程式與用戶端的傳入流量。
-
刪除 SOURCE-EU。
**注意:**在生產環境中套用此作業之前,最佳實務是先在測試執行個體上測試此作業。
相關資訊
如何為未加密的 Amazon RDS 資料庫執行個體建立加密的快照?
MySQL 網站上的複寫疑難排解
相關內容
- 已提問 2 年前
- 已提問 2 年前
- 已提問 3 年前
