

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 為 Amazon RDS for MySQL 設定多來源複寫
<a name="mysql-multi-source-replication"></a>

透過多來源複寫，您可以將 Amazon RDS for MySQL 資料庫執行個體設定為從多個 RDS for MySQL 來源資料庫執行個體接收二進位日誌事件的複本。執行下列引擎版本的 RDS for MySQL 資料庫執行個體支援多來源複寫：
+ 所有 MySQL 8.4 版
+ 8.0.35 和更高的次要版本
+ 5.7.44 及更高次要版本

如需 MySQL 多來源複寫的相關資訊，請參閱 MySQL 文件中的 [MySQL 多來源複寫](https://dev.mysql.com/doc/refman/8.0/en/replication-multi-source.html)。MySQL 文件包含此功能的詳細資訊，而本主題說明如何在 RDS for MySQL 資料庫執行個體上設定和管理多來源複寫通道。

## 多來源複寫的使用案例
<a name="mysql-multi-source-replication-benefits"></a>

以下是在 RDS for MySQL 上使用多來源複寫的適當案例：
+ 需要將個別資料庫執行個體上的多個碎片合併或結合為單一碎片的應用程式。
+ 需要從合併自多個來源的資料產生報告的應用程式。
+ 為分佈於多個 RDS for MySQL 資料庫執行個體之間的資料建立合併長期備份的需求。

## 多來源複寫的先決條件
<a name="mysql-multi-source-replication-prerequisites"></a>

設定多來源複寫之前，必須符合下列先決條件。
+ 確定每個來源 RDS for MySQL 資料庫執行個體都已啟用自動備份。啟用自動備份時，會啟用二進位記錄。若要了解如何啟用自動備份，請參閱 [啟用自動備份](USER_WorkingWithAutomatedBackups.Enabling.md)。
+ 為了避免複寫錯誤，建議您封鎖對來源資料庫執行個體的寫入操作。您可以在連接至 RDS for MySQL 來源資料庫執行個體的自訂參數群組中，將 `read-only` 參數設定為 `ON`。您可以使用 AWS 管理主控台 或 AWS CLI 建立新的自訂參數群組，或修改現有的參數群組。如需詳細資訊，請參閱[在 Amazon RDS 中建立資料庫參數群組](USER_WorkingWithParamGroups.Creating.md)及[修改 Amazon RDS 中的資料庫參數群組中的參數](USER_WorkingWithParamGroups.Modifying.md)。
+ 對於每個來源資料庫執行個體，將執行個體的 IP 位址新增至多來源資料庫執行個體的 Amazon Virtual Private Cloud (VPC) 安全群組。若要識別來源資料庫執行個體的 IP 位址，您可以執行命令 `dig RDS Endpoint`。在與目的地多來源資料庫執行個體相同的 VPC 中，從 Amazon EC2 執行個體執行 命令。
+ 對於每個來源資料庫執行個體，使用用戶端連線至資料庫執行個體，並建立具有複寫所需權限的資料庫使用者，如下列範例所示。

  ```
  CREATE USER 'repl_user' IDENTIFIED BY 'password';
  GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user';
  ```
**注意**  
從 MySQL 8.4 開始，`REPLICATION SLAVE` 權限已棄用，並取代為 `REPLICATION REPLICA`。對於 MySQL 8.4 和更新版本，請改用下列語法：  

  ```
  CREATE USER 'repl_user' IDENTIFIED BY 'password';
  GRANT REPLICATION CLIENT, REPLICATION REPLICA ON *.* TO 'repl_user';
  ```

## 在 RDS for MySQL 資料庫執行個體上設定多來源複寫通道
<a name="mysql-multi-source-replication-configuring-channels"></a>

設定多來源複寫通道與設定單一來源複寫相似。對於多來源複寫，您必須先在來源執行個體上開啟二進位記錄。然後，將資料從來源匯入至多來源複本。然後，您可以使用二進位日誌座標或使用 GTID 自動定位，從每個來源啟動複寫。

若要將 RDS for MySQL 資料庫執行個體設定為兩個或更多 RDS for MySQL 資料庫執行個體的多來源複本，請執行下列步驟。

**Topics**
+ [步驟 1：將資料從來源資料庫執行個體匯入至多來源複本](#mysql-multi-source-replication-import)
+ [步驟 2：開始從來源資料庫執行個體複寫到多來源複本](#mysql-multi-source-replication-setting-up-start-replication-other)

### 步驟 1：將資料從來源資料庫執行個體匯入至多來源複本
<a name="mysql-multi-source-replication-import"></a>

在每個來源資料庫執行個體上執行下列步驟。

將資料從來源匯入至多來源複本之前，請先執行 `SHOW MASTER STATUS` 命令以確認目前的二進位日誌檔案和位置。請記下這些詳細資訊，以供後續步驟使用。在此範例輸出中，檔案為 `mysql-bin-changelog.000031`，位置為 `107`。

**注意**  
從 MySQL 8.4 開始，`SHOW MASTER STATUS` 命令已棄用，並取代為 `SHOW BINARY LOG STATUS`。對於 MySQL 8.4 和更新版本，請改用 `SHOW BINARY LOG STATUS`。

```
File                        Position   
-----------------------------------
mysql-bin-changelog.000031      107   
-----------------------------------
```

現在，使用 `mysqldump` 將資料庫從來源資料庫執行個體複製到多來源複本，如下列範例所示。

```
mysqldump --databases database_name \
 --single-transaction \
 --compress \
 --order-by-primary \
 -u RDS_user_name \
 -p RDS_password \
 --host=RDS Endpoint | mysql \
 --host=RDS Endpoint \
 --port=3306 \
 -u RDS_user_name \
-p RDS_password
```

複製資料庫之後，您可以在來源資料庫執行個體上將唯讀參數設定為 `OFF`。

### 步驟 2：開始從來源資料庫執行個體複寫到多來源複本
<a name="mysql-multi-source-replication-setting-up-start-replication-other"></a>

對於每個來源資料庫執行個體，使用管理使用者憑證連線至執行個體，並執行以下兩個預存程序。這些預存程序會在通道上設定複寫，並啟動複寫。此範例使用上一個步驟中範例輸出的 binlog 檔案名稱和位置。

```
CALL mysql.rds_set_external_source_for_channel('mysourcehost.example.com', 3306, 'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 1, 'channel_1');
CALL mysql.rds_start_replication_for_channel('channel_1');
```

如需有關使用這些預存程序與其他程序來設定和管理複寫通道的詳細資訊，請參閱 [管理多來源複寫](mysql-stored-proc-multi-source-replication.md)。

## 對多來源複寫使用篩選條件
<a name="mysql-multi-source-replication-filters"></a>

您可以使用複寫篩選條件，指定要以多來源複本複寫的資料庫和資料表。複寫篩選條件可以包含複寫中的資料庫和資料表，或將其排除在複寫之外。如需複寫群組的詳細資訊，請參閱 [使用 MySQL 設定複寫篩選條件](USER_MySQL.Replication.ReadReplicas.ReplicationFilters.md)。

透過多來源複寫，您可以全域設定複寫篩選條件，或是在通道層級設定。通道層級篩選僅適用於執行 8.0 版或 8.4 版的支援資料庫執行個體。下列範例說明如何全域設定篩選條件，或是在通道層級設定。

請注意下列有關於在多來源複寫中篩選的需求和行為：
+ 通道名稱兩側必須要有反引號 (``)。
+ 如果您變更了參數群組中的複寫篩選條件，則具有更新的所有通道都會重新啟動多來源複本的 `sql_thread`，以動態套用變更。如果更新涉及全域篩選條件，則所有處於執行中狀態的複寫通道都會重新啟動。
+ 所有全域篩選條件都會在任何通道特定篩選條件之前套用。
+ 如果全域套用篩選條件，並且在通道層級套用，則只會套用通道層級篩選條件。例如，如果篩選條件是 `replicate_ignore_db="db1,`channel_22`:db2"`，則設定為 `db1` 的 `replicate_ignore_db` 會套用至 `channel_22` 以外的所有通道，且只有 `channel_22` 會忽略來自 `db2` 的變更。

範例 1：設定全域篩選條件

在下列範例中，`temp_data` 資料庫會排除在每個通道的複寫外。

針對 Linux、macOS 或 Unix：

```
aws rds modify-db-parameter-group \
--db-parameter-group-name myparametergroup \
--parameters "ParameterName=replicate-ignore-db,ParameterValue='temp_data',ApplyMethod=immediate"
```

範例 2：設定通道層級篩選條件

在下列範例中，來自 `sample22` 資料庫的變更只會包含在通道 `channel_22` 中。同樣地，來自 `sample99` 資料庫的變更只會包含在通道 `channel_99` 中。

針對 Linux、macOS 或 Unix：

```
aws rds modify-db-parameter-group \
--db-parameter-group-name myparametergroup \
--parameters "ParameterName=replicate-do-db,ParameterValue='\`channel_22\`:sample22,\`channel_99\`:sample99',ApplyMethod=immediate"
```

## 監控多來源複寫通道
<a name="mysql-multi-source-replication-monitoring"></a>

您可以使用下列方法監控多來源複本中的個別通道：
+ 若要監控所有通道或特定通道的狀態，請連線至多來源複本，並執行 `SHOW REPLICA STATUS` 或 `SHOW REPLICA STATUS FOR CHANNEL 'channel_name'` 命令。如需詳細資訊，請參閱 MySQL 文件中的[檢查複寫狀態](https://dev.mysql.com/doc/refman/8.0/en/replication-administration-status.html)。
+ 若要在複寫通道啟動、停止或移除時接收通知，請使用 RDS 事件通知。如需詳細資訊，請參閱[使用 Amazon RDS 事件通知](USER_Events.md)。
+ 若要監控特定通道的延遲，請檢查其 `ReplicationChannelLag` 指標。在此指標中，具有 60 秒 (1 分鐘) 期間的資料點可供使用 15 天。若要尋找通道的複寫通道延遲，請使用執行個體識別符和複寫通道名稱。若要在延遲超過特定閾值時接收通知，您可以設定 CloudWatch 警示。如需詳細資訊，請參閱[使用 Amazon CloudWatch 監控 Amazon RDS 指標](monitoring-cloudwatch.md)。

## 多來源複寫的考量和最佳實務
<a name="mysql-multi-source-replication-considerations"></a>

在 RDS for MySQL 上使用多來源複寫之前，請檢閱下列考量事項和最佳實務：
+ 確定設定為多來源複本的資料庫執行個體有足夠的資源 (例如輸送量、記憶體、CPU 和 IOPS) 可處理來自多個來源執行個體的工作負載。
+ 定期監控多來源複本上的資源使用率，並調整儲存體或執行個體組態，以順利處理工作負載且不會造成資源負擔。
+ 您可以在多來源複本上設定多執行緒複寫，方法是將系統變數 `replica_parallel_workers` 設定為大於 `0` 的值。在此情況下，配置給每個通道的執行緒數目就是此變數的值，加上一個用來管理套用者執行緒的協調器執行緒。
+ 適當設定複寫篩選條件以避免衝突。若要將整個資料庫複寫到複本上的另一個資料庫，您可以使用 `--replicate-rewrite-db` 選項。例如，您可以將資料庫 A 中的所有資料表複寫到複本執行個體上的資料庫 B。當所有來源執行個體使用相同的結構描述命名慣例時，此方法會很有幫助。如需 `--replicate-rewrite-db` 選項的相關資訊，請參閱 MySQL 文件中的[複寫伺服器選項和變數](https://dev.mysql.com/doc/refman/8.0/en/replication-options-replica.html)。
+ 若要避免發生複寫錯誤，請避免寫入複本。建議您在多來源複本上啟用 `read_only` 參數，以封鎖寫入操作。這樣做有助於消除因寫入操作衝突而導致的複寫問題。
+ 若要提高讀取操作 (例如，在多來源複本上執行的排序和高負載聯結) 的效能，請考慮使用 RDS Optimized Reads。此功能有助於處理相依於大型暫存資料表或排序檔案的查詢。如需詳細資訊，請參閱[使用 Amazon RDS Optimized Reads 改善 RDS for MySQL 的查詢效能](rds-optimized-reads.md)。
+ 若要將複寫延遲降至最低，並改善多來源複本的效能，請考慮啟用最佳化寫入。如需詳細資訊，請參閱[使用 RDS Optimized Writes 改善 MySQL 的寫入效能](rds-optimized-writes.md)。
+ 一次在一個通道上執行管理操作 (例如變更組態)，並避免從多個連線對多個通道執行變更。這類做法可能會導致複寫操作發生衝突。例如，從多個連線同時執行 `rds_skip_repl_error_for_channel` 和 `rds_start_replication_for_channel` 程序，可能會導致在非預期的通道上略過事件。
+ 您可以在多來源複寫執行個體上啟用備份，並將資料從該執行個體匯出至 Amazon S3 儲存貯體，以長期存放資料。不過，也請務必在個別來源執行個體上設定具有適當保留的備份。如需將快照資料匯出至 Amazon S3 的詳細資訊，請參閱 [為 Amazon RDS 將資料庫快照資料匯出至 Amazon S3](USER_ExportSnapshot.md)。
+ 若要將讀取工作負載分佈在多來源複本上，您可以從多來源複本建立僅供讀取複本。您可以 AWS 區域 根據您應用程式的需求，在不同的 中尋找這些僅供讀取複本。如需僅供讀取複本的詳細資訊，請參閱 [使用 MySQL 僅供讀取複本](USER_MySQL.Replication.ReadReplicas.md)。

## RDS for MySQL 上的多來源複寫限制
<a name="mysql-multi-source-replication-limitations"></a>

下列限制適用於 RDS for MySQL 的多來源複寫：
+ 目前，RDS for MySQL 支援為多來源複本設定最多 15 個通道。
+ 僅供讀取複本執行個體無法設定為多來源複本。
+ 若要在執行引擎 5.7 版的 RDS for MySQL 上設定多來源複寫，必須在複本執行個體上啟用效能結構描述。在執行引擎 8.0 或 8.4 版的 RDS for MySQL 上，可以選擇啟用效能結構描述。
+ 對於執行引擎 5.7 版的 RDS for MySQL，複寫篩選條件會套用至所有複寫通道。對於執行引擎 8.0 或 8.4 版的 RDS for MySQL，您可以設定套用至所有複寫通道或個別通道的篩選條件。
+ 還原 RDS 快照或執行時間點還原 (PITR)，並不會還原多來源複本通道組態。
+ 當您建立多來源複本的僅供讀取複本時，它只會從多來源執行個體複寫資料。它不會還原任何通道組態。
+ MySQL 不支援為每個通道設定不同數量的平行工作者。每個通道會根據 `replica_parallel_workers` 值取得相同數量的平行工作者。

如果您的多來源複寫目標是多可用區域資料庫叢集，則適用下列額外的限制：
+ 必須先為來源 RDS for MySQL 執行個體設定通道，才能對該執行個體進行任何寫入。
+ 每個來源 RDS for MySQL 執行個體都必須已啟用 GTID 式複寫。
+ 資料庫叢集上的容錯移轉事件會移除多來源複寫組態。要還原該組態，必須重複執行組態步驟。