

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

# 設定 Amazon Aurora MySQL 的多來源複寫
<a name="AuroraMySQL.Replication.MultiSource"></a>

透過多來源複寫，您可以將 Amazon Aurora MySQL 資料庫叢集設定為從多個來源 MySQL 資料庫接收二進位日誌事件的複本。每個來源可以是 RDS for MySQL 資料庫執行個體、另一個 Aurora MySQL 資料庫叢集，或在 Amazon RDS 外部執行的 MySQL 資料庫。

執行下列引擎版本的 Aurora MySQL 資料庫叢集支援多來源複寫：
+ Aurora MySQL 8.4.8 及更高版本

如需 MySQL 多來源複寫的詳細資訊，請參閱 [MySQL 文件中的 MySQL 多來源複寫](https://dev.mysql.com/doc/refman/8.4/en/replication-multi-source.html)。 MySQL 

**注意**  
Aurora MySQL 上的多來源複寫會使用 Aurora 資料庫叢集的寫入器 （主要） 執行個體做為複寫目標。連線到叢集的寫入器執行個體時，必須呼叫所有複寫預存程序。

## 多來源複寫的使用案例
<a name="AuroraMySQL.Replication.MultiSource.UseCases"></a>

在下列情況下，請考慮在 Aurora MySQL 上使用多來源複寫：
+ **碎片合併** – 需要將託管於不同資料庫執行個體的多個碎片中的資料合併或合併至單一 Aurora MySQL 資料庫叢集的應用程式。
+ **合併報告** – 需要從多個來源合併的資料產生報告的應用程式，利用 Aurora 的讀取擴展功能。
+ **長期備份** – 建立在多個 MySQL 相容資料庫執行個體之間分佈之資料合併長期備份的要求。
+ **跨引擎遷移** – 在遷移期間，將來自多個 RDS for MySQL 執行個體或外部 MySQL 伺服器的資料合併到單一 Aurora MySQL 叢集。
+ **多租用戶彙總 – **將多個單一租用戶資料庫合併為多租用戶 Aurora 叢集，以實現成本最佳化和簡化管理。

## 多來源複寫的先決條件
<a name="AuroraMySQL.Replication.MultiSource.Prerequisites"></a>

在 Aurora MySQL 資料庫叢集上設定多來源複寫之前，請先完成二進位日誌複寫的標準先決條件，如中所述[設定 Aurora MySQL 的二進位日誌複寫](AuroraMySQL.Replication.MySQL.SettingUp.md)。這包括在每個來源上啟用二進位記錄、保留二進位日誌、建立複寫使用者，以及建立每個來源的副本或傾印。對於多來源複寫，請為每個來源資料庫執行個體重複這些步驟。

除了標準先決條件之外，請確定您符合多來源複寫的下列需求。
+ 驗證 Aurora MySQL 目標叢集版本和組態
  + Aurora MySQL 資料庫叢集必須執行支援的引擎版本 (Aurora MySQL 8.4.8 及更高版本）。
  + 在 Aurora MySQL 寫入器執行個體上啟用自動遞交。將資料庫叢集`autocommit`參數群組`1`中的 參數設定為 。
+ 設定每個來源的網路連線

  對於每個來源資料庫執行個體，請確定 Aurora MySQL 寫入器執行個體可以連線到指定連接埠上的來源。選項包括：
  + 如果來源和目標都位於相同的 VPC 中，請在來源資料庫執行個體上設定安全群組，以允許來自 Aurora MySQL 叢集安全群組的連接埠 3306 （或您的自訂連接埠） 上的傳入連線。
  + 如果它們位於不同的 VPCs中，請設定 VPC 對等互連或使用傳輸閘道。如需詳細資訊，請參閱[由不同 VPC 中的 EC2 叢集存取 VPC 中的資料庫執行個體](USER_VPC.Scenarios.md#USER_VPC.Scenario3)。
  + 如果來源位於 外部 AWS，請確保網路路由可用 （例如，透過 或 VPN 連接）。

**注意**  
由於多來源複寫涉及多個來源，因此您必須獨立驗證每個來源的連線。確保安全群組和路由同時容納所有來源端點。

## 在 Aurora MySQL 資料庫叢集上設定多來源複寫通道
<a name="AuroraMySQL.Replication.MultiSource.Configure"></a>

在 Aurora MySQL 上設定多來源複寫通道類似於設定單一來源複寫。對於多來源複寫，首先在來源執行個體上啟用二進位記錄，將資料從來源匯入 Aurora MySQL 叢集，然後使用二進位日誌座標或 GTID 自動定位從每個來源開始複寫。

**重要**  
連線到 Aurora MySQL 資料庫叢集的**寫入器執行個體**時，必須呼叫所有多來源複寫預存程序。如果發生容錯移轉，您必須重新連線至新的寫入器執行個體。

### 步驟 1：將資料從來源資料庫執行個體匯入 Aurora MySQL 叢集
<a name="AuroraMySQL.Replication.MultiSource.Configure.Step1"></a>

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

1. 判斷來源資料庫執行個體上目前的二進位日誌檔案和位置。

   ```
   SHOW BINARY LOG STATUS;
   ```

   ```
   SHOW MASTER STATUS;
   ```

   輸出範例：

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

   記錄 `File`和 `Position`值。您在後續步驟中需要它們。

1. 使用 將資料庫從來源資料庫執行個體複製到 Aurora MySQL 叢集`mysqldump`。

   ```
   mysqldump --databases {{database_name}} \
     --single-transaction \
     --compress \
     --order-by-primary \
     -u {{RDS_user_name}} \
     -p'{{RDS_password}}' \
     --host={{source-endpoint.region.rds.amazonaws.com}} | mysql \
     --host={{aurora-cluster-endpoint.cluster-xxxxxx.region.rds.amazonaws.com}} \
     --port=3306 \
     -u {{aurora_user_name}} \
     -p'{{aurora_password}}'
   ```
**提示**  
對於大型資料庫，請考慮使用或 AWS DMS 建立快照並還原，以減少資料傳輸時間。

1. 資料匯入完成後，如果您之前已將其設定為唯讀，則可以在來源資料庫執行個體上重新啟用寫入。

### 步驟 2：開始從來源資料庫執行個體複寫至 Aurora MySQL 叢集
<a name="AuroraMySQL.Replication.MultiSource.Configure.Step2"></a>

對於每個來源資料庫執行個體，請連線至 Aurora MySQL 資料庫叢集的**寫入器執行個體**，並執行預存程序以在頻道上設定和啟動複寫。

```
CALL mysql.rds_set_external_source_for_channel(
  '{{source-endpoint.region.rds.amazonaws.com}}',
  3306,
  '{{repl_user}}',
  '{{password}}',
  '{{mysql-bin-changelog.000031}}',
  107,
  0,
  '{{channel_1}}'
);

CALL mysql.rds_start_replication_for_channel('{{channel_1}}');
```

如果您的來源資料庫執行個體使用 GTID 式複寫，您可以使用自動定位，而不是指定二進位日誌座標：

```
CALL mysql.rds_set_external_source_with_auto_position_for_channel(
  '{{source-endpoint.region.rds.amazonaws.com}}',
  3306,
  '{{repl_user}}',
  '{{password}}',
  0,
  0,
  '{{channel_1}}'
);

CALL mysql.rds_start_replication_for_channel('{{channel_1}}');
```

**注意**  
使用 GTID 自動定位時，請確保在所有來源執行個體`gtid_mode`和 Aurora MySQL 叢集中一致地設定 和 `enforce_gtid_consistency` 參數。

為每個來源資料庫執行個體重複這些步驟，並為每個執行個體指定唯一的頻道名稱 （例如，、`channel_1``channel_2`、`channel_3`)。

## 搭配多來源複寫使用篩選條件
<a name="AuroraMySQL.Replication.MultiSource.Filters"></a>

您可以使用複寫篩選條件來指定要複寫至 Aurora MySQL 多來源複本的資料庫和資料表。如需複寫篩選條件的詳細資訊，請參閱 [使用 Aurora MySQL 設定複寫篩選條件](AuroraMySQL.Replication.Filters.md)。以下說明多來源複寫可用的其他頻道層級篩選功能。

透過多來源複寫，您可以在兩個層級設定複寫篩選條件：
+ **全域篩選條件** – 套用至所有頻道。使用 Aurora MySQL 資料庫叢集參數群組 （例如，`replicate-do-db`、) 設定 `replicate-ignore-db`。
+ **頻道層級篩選條件** – 僅適用於特定頻道，覆寫該頻道的全域篩選條件。
+ 變更頻道層級篩選條件後，您必須重新啟動複寫。
+ 如果未設定頻道特定的篩選條件，Aurora MySQL 會套用該頻道的全域篩選條件。
+ 如果全域和頻道層級同時套用篩選條件，則只會套用該頻道的頻道層級篩選條件。

## 監控多來源複寫管道
<a name="AuroraMySQL.Replication.MultiSource.Monitoring"></a>

您可以使用下列方法監控 Aurora MySQL 多來源複本上的個別頻道。

### 使用 SHOW REPLICA 狀態
<a name="AuroraMySQL.Replication.MultiSource.Monitoring.ShowReplicaStatus"></a>

連線至 Aurora MySQL 資料庫叢集的寫入器執行個體並執行：

```
-- View status for all channels
SHOW REPLICA STATUS\G

-- View status for a specific channel
SHOW REPLICA STATUS FOR CHANNEL '{{channel_1}}'\G
```

要監控的關鍵欄位：


| 欄位 | 說明 | 
| --- | --- | 
| Replica\_IO\_Running | 頻道的 I/O 執行緒是否正在執行 | 
| Replica\_SQL\_Running | 頻道的 SQL 執行緒是否正在執行 | 
| Seconds\_Behind\_Source | 頻道的複寫延遲以秒為單位 | 
| Last\_IO\_Error | 在頻道上遇到的最後一個 I/O 錯誤 | 
| Last\_SQL\_Error | 頻道上遇到的最後一個 SQL 錯誤 | 
| Source\_Log\_File | 從來源讀取的目前二進位日誌檔案 | 
| Exec\_Source\_Log\_Pos | SQL 執行緒已套用的二進位日誌中的位置 | 

### 使用 CloudWatch 指標
<a name="AuroraMySQL.Replication.MultiSource.Monitoring.CloudWatch"></a>

監控每個複寫通道的 `ReplicationChannelLag` CloudWatch 指標。此指標提供 60 秒期間的每個頻道複寫延遲資料，並可使用 15 天。若要尋找複寫通道延遲，請使用 Aurora 資料庫叢集執行個體識別符和複寫通道名稱做為維度。您可以設定 CloudWatch 警示，以在延遲超過特定閾值時接收通知。如需詳細資訊，請參閱[在 Amazon Aurora 叢集中監控指標](MonitoringAurora.md)。

## 管理多來源複寫預存程序
<a name="AuroraMySQL.Replication.MultiSource.StoredProcedures"></a>

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

## 考量和最佳實務
<a name="AuroraMySQL.Replication.MultiSource.Considerations"></a>

如需一般複寫最佳化建議，包括二進位日誌格式、平行工作者和增強型 Binlog，請參閱 [最佳化 Aurora MySQL 的二進位日誌複寫](binlog-optimization.md)。以下是多來源複寫特有的考量事項。

### 資源規劃
<a name="AuroraMySQL.Replication.MultiSource.Considerations.Resources"></a>

執行多個複寫通道時，在複本上配置的複寫執行緒總數為： (`replica_parallel_workers` \+ 1 個協調器執行緒） × 通道數量。例如，當`replica_parallel_workers`預設值為 4 和 10 個頻道時，Aurora MySQL 會配置 50 個複寫執行緒。根據您的總來源輸送量和頻道計數，考慮使用較大的資料庫執行個體類別 （例如 db.r6g.2xlarge 或更大）。每個頻道都會收到相同數量的平行工作者。MySQL 不支援為每個頻道設定不同的平行工作者計數。

### 避免衝突
<a name="AuroraMySQL.Replication.MultiSource.Considerations.Conflicts"></a>

MySQL 多來源複寫不提供衝突偵測或解決方案。您必須確保來自不同來源的變更沒有衝突。常見的策略包括：
+ 每個來源都會寫入不同的資料庫或一組資料表。
+ 使用複寫篩選條件 (`replicate-do-db`)，以確保每個頻道只會複寫其負責的資料庫。
+ 如有需要，請使用 `replicate-rewrite-db`選項將結構描述名稱從來源重新對應到複本上的不同名稱。

若要防止應用程式直接連線至多來源複本的衝突寫入，請在 Aurora MySQL 叢集上啟用唯讀模式： `CALL mysql.rds_set_read_only(1);`

### 操作最佳實務
<a name="AuroraMySQL.Replication.MultiSource.Considerations.Operational"></a>
+ **一次一個頻道** – 一次在一個頻道上執行管理操作 （例如組態變更、略過錯誤或開始/停止複寫）。避免同時變更來自不同連線的多個頻道。
+ **監控每個頻道延遲** – 使用 `ReplicationChannelLag` CloudWatch 指標監控每個頻道的複寫延遲。
+ **來源容錯移轉處理** – 如果來源資料庫執行個體容錯移轉 （例如 Amazon RDS 多可用區域容錯移轉），複寫通道可能會因為 I/O 錯誤而停止。在來源再次可用之後：
  + 呼叫 `mysql.rds_start_replication_for_channel`以繼續複寫。
  + 如果發生錯誤 1236 （找不到日誌檔案），請呼叫 `mysql.rds_next_source_log_for_channel`以前進到下一個二進位日誌檔案。
+ **Aurora 寫入器容錯移轉** – 如果 Aurora MySQL 寫入器執行個體容錯移轉至讀取器，複寫通道組態會保留在叢集的共用儲存體上。容錯移轉完成後，複寫執行緒會在新的寫入器執行個體上自動重新啟動。

## 限制
<a name="AuroraMySQL.Replication.MultiSource.Limitations"></a>

下列限制專屬於 Aurora MySQL 多來源複寫。如需一般 MySQL 多來源複寫限制 （例如每個通道的平行工作者組態），請參閱 [MySQL 文件中的 MySQL 多來源複寫](https://dev.mysql.com/doc/refman/8.4/en/replication-multi-source.html)。 MySQL 
+ 多來源複寫僅支援 Aurora MySQL 8.4.8 版和更新版本。
+ Aurora MySQL 支援為多來源複本設定最多 **15 個頻道**。

## 疑難排解
<a name="AuroraMySQL.Replication.MultiSource.Troubleshooting"></a>

如需一般複寫疑難排解，請參閱 [ Amazon Aurora MySQL 複寫問題](CHAP_Troubleshooting.md#CHAP_Troubleshooting.MySQL)。以下是多來源複寫特定的疑難排解備註。

### 快照還原後通道組態未還原
<a name="AuroraMySQL.Replication.MultiSource.Troubleshooting.Snapshot"></a>

資料庫叢集快照不包含多來源頻道組態。從快照還原之後：
+ 使用 `mysql.rds_set_external_source_for_channel`或 重新設定每個頻道`mysql.rds_set_external_source_with_auto_position_for_channel`。
+ 如果使用 GTID 自動定位，複本可以自動從停止的位置繼續。
+ 如果使用二進位日誌檔案位置，請比較來源的二進位日誌與還原叢集上上次套用的交易，以判斷目前的位置。

### 一或多個頻道上的複寫延遲增加
<a name="AuroraMySQL.Replication.MultiSource.Troubleshooting.Lag"></a>
+ 檢查寫入器執行個體的 CPU 和 I/O 指標。如果資源使用率很高，請擴展執行個體類別。
+ 考慮增加 `replica_parallel_workers`以提高 SQL 執行緒輸送量。
+ 確認管道上沒有可能封鎖 SQL 執行緒的長時間執行交易或 DDL 操作。
+ 檢查是否存在可能導致複寫處理的衝突篩選條件組態，然後捨棄大量事件。

## 範例：使用三個來源完成多來源設定
<a name="AuroraMySQL.Replication.MultiSource.Example"></a>

下列範例示範將 Aurora MySQL 資料庫叢集設定為三個 RDS for MySQL 來源執行個體的多來源複本。

### 步驟 1：在每個來源上記錄二進位日誌位置
<a name="AuroraMySQL.Replication.MultiSource.Example.Step1"></a>

連接到每個來源並記錄二進位日誌座標：

```
-- On source 1 (orders-db.xxxxx.us-east-1.rds.amazonaws.com)
SHOW BINARY LOG STATUS;
-- Result: mysql-bin-changelog.000045, Position: 3892

-- On source 2 (inventory-db.xxxxx.us-east-1.rds.amazonaws.com)
SHOW BINARY LOG STATUS;
-- Result: mysql-bin-changelog.000012, Position: 1567

-- On source 3 (analytics-db.xxxxx.us-east-1.rds.amazonaws.com)
SHOW BINARY LOG STATUS;
-- Result: mysql-bin-changelog.000078, Position: 9421
```

### 步驟 2：從每個來源匯入資料
<a name="AuroraMySQL.Replication.MultiSource.Example.Step2"></a>

```
# Import from source 1
mysqldump --databases orders_db --single-transaction --compress \
 -u admin -p --host=orders-db.xxxxx.us-east-1.rds.amazonaws.com | \
 mysql --host=my-aurora-cluster.cluster-xxxxx.us-east-1.rds.amazonaws.com -u admin -p

# Import from source 2
mysqldump --databases inventory_db --single-transaction --compress \
 -u admin -p --host=inventory-db.xxxxx.us-east-1.rds.amazonaws.com | \
 mysql --host=my-aurora-cluster.cluster-xxxxx.us-east-1.rds.amazonaws.com -u admin -p

# Import from source 3
mysqldump --databases analytics_db --single-transaction --compress \
 -u admin -p --host=analytics-db.xxxxx.us-east-1.rds.amazonaws.com | \
 mysql --host=my-aurora-cluster.cluster-xxxxx.us-east-1.rds.amazonaws.com -u admin -p
```

### 步驟 3：設定和啟動複寫通道
<a name="AuroraMySQL.Replication.MultiSource.Example.Step3"></a>

連線至 Aurora MySQL 寫入器執行個體：

```
-- Configure channel for source 1 (orders)
CALL mysql.rds_set_external_source_for_channel(
 'orders-db.xxxxx.us-east-1.rds.amazonaws.com',
 3306, 'repl_user', 'password',
 'mysql-bin-changelog.000045', 3892, 0, 'orders_channel'
);

-- Configure channel for source 2 (inventory)
CALL mysql.rds_set_external_source_for_channel(
 'inventory-db.xxxxx.us-east-1.rds.amazonaws.com',
 3306, 'repl_user', 'password',
 'mysql-bin-changelog.000012', 1567, 0, 'inventory_channel'
);

-- Configure channel for source 3 (analytics)
CALL mysql.rds_set_external_source_for_channel(
 'analytics-db.xxxxx.us-east-1.rds.amazonaws.com',
 3306, 'repl_user', 'password',
 'mysql-bin-changelog.000078', 9421, 0, 'analytics_channel'
);

-- Start all channels
CALL mysql.rds_start_replication_for_channel('orders_channel');
CALL mysql.rds_start_replication_for_channel('inventory_channel');
CALL mysql.rds_start_replication_for_channel('analytics_channel');
```

### 步驟 4：驗證複寫狀態
<a name="AuroraMySQL.Replication.MultiSource.Example.Step4"></a>

```
SHOW REPLICA STATUS\G
```

確認每個頻道的 ：
+ `Replica_IO_Running: Yes`
+ `Replica_SQL_Running: Yes`
+ `Seconds_Behind_Source: 0` （或低值）

## 相關資源
<a name="AuroraMySQL.Replication.MultiSource.RelatedResources"></a>
+ [MySQL 多來源複寫](https://dev.mysql.com/doc/refman/8.4/en/replication-multi-source.html) – MySQL 文件
+ [Aurora 與 MySQL 之間或 Aurora 與另一個 Aurora 資料庫叢集之間的複寫 (二進位複寫)](AuroraMySQL.Replication.MySQL.md) – Aurora 使用者指南
+ [最佳化 Aurora MySQL 的二進位日誌複寫](binlog-optimization.md) – Aurora 使用者指南
+ [使用 Aurora MySQL 設定複寫篩選條件](AuroraMySQL.Replication.Filters.md) – Aurora 使用者指南
+ [使用 GTID 式複寫](mysql-replication-gtid.md) – Aurora 使用者指南