AWS DMS（Database Migration Service） レプリケーションインスタンスについて解説します

## レプリケーションとは
レプリケーションとは、「複製(レプリカ)を作る」という意味です。別の場所に、リアルタイムでデータをコピーする技術のことを指します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/ad54c3ba-7068-4348-84f7-e423431a074f.png)

https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_ReplicationInstance.html


今回は、RDSレプリケーションの仕組みが理解出来るように、MySQLで解説します。

## 用途

### 1. データベース移行
**オンプレミスからクラウドへの移行**
オンプレミスのデータベースをAWSのクラウド環境（例えば、Amazon RDSやAmazon Aurora）に移行する際に使用します。
**クラウド間の移行**
AWS内の異なるリージョン間や異なるクラウドプロバイダー間でデータベースを移行する際に使用します。

### 2. データベースの統合
**データの統合**
複数のデータベースを一つのデータベースに統合する際に使用します。

### レプリケーションとバックアップの違い

| 項目             | レプリケーション                                                                 | バックアップ                                                                 |
|------------------|----------------------------------------------------------------------------------|------------------------------------------------------------------------------|
| 目的             | データの可用性と信頼性の向上、負荷分散、災害復旧                                 | データの保護と復旧、災害復旧                                                 |
| データの複製方法 | データをリアルタイムまたは定期的に複製し、複数の場所に保存                       | データのスナップショットを定期的に取得し、バックアップファイルとして保存     |
| データの一貫性   | 高い（特に同期レプリケーションの場合）                                           | 一貫性は低い（バックアップ時点のデータのみ）                                 |
| パフォーマンス   | リアルタイムレプリケーションはパフォーマンスに影響を与えることがある             | バックアッププロセス中にパフォーマンスに影響を与えることがある               |
| データの復旧時間 | 短い（データが常に最新の状態であるため）                                         | 長い（バックアップファイルからの復旧が必要）                                 |
| データの保存場所 | 複数のサーバーやデータセンター                                                   | 専用のバックアップストレージ（オンプレミスまたはクラウド）                   |
| 使用例           | データベースレプリケーション、ファイルシステムレプリケーション、クラウドサービス | データベースバックアップ、ファイルシステムバックアップ、クラウドストレージ   |
| コスト           | 高い（複数のサーバーやデータセンターが必要）                                     | 低い（専用のバックアップストレージのみが必要）                               |
| メンテナンス     | 継続的な監視と管理が必要                                                         | 定期的なバックアップスケジュールの設定と管理が必要                           |

# どんな手順で実現するのか？
1.[ターゲットとなるデータベースを作成する](#ターゲットとなるデータベースを作成する)
2.[レプリケーションするインスタンスを作成する](#レプリケーションするインスタンスを作成する)
3.[ソースエンドポイントを作成する](#ソースエンドポイントを作成する)
4.[ターゲットエンドポイントを作成する](#ターゲットエンドポイントを作成する)
5.[レプリケーションタスクを作成し実行する](#レプリケーションタスクを作成し実行する)

## ターゲットとなるデータベースを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/84e0cccf-c8fd-43a3-a99c-627d5b1680c7.png)


## レプリケーションするインスタンスを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/82527d80-ddab-4dfd-b468-05ee648eafb8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/53c736eb-53bf-45b7-bb73-34822caa1d06.png)

### 接続とセキュリティ

**パブリックアクセス可能:** チェックボックスをオンにする。
このオプションを選択すると、AWS DMS によってレプリケーションインスタンスにパブリック IP アドレスが割り当てられるため、お客様の VPC の外部のデータベースに接続できるようになります。

## ソースエンドポイントを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/29c1b6b1-c22e-41d0-9482-5e600ea25b79.png)

### エンドポイント設定

| 設定項目                                      | 設定値                                                                 |
|-----------------------------------------------|----------------------------------------------------------------------|
| **エンドポイントタイプ**                      | `ソースエンドポイント` を選択する。                                   |
| **エンドポイント識別子**                      | 例`source-endpoint` と入力する。                                        |
| **ソースエンジン**                            | `MySQL` を選択する。                         |
| **エンドポイントデータベースへのアクセス**    | `アクセス情報を手動で提供する` を選択する。                           |
| **サーバー名**                                | 例`DBServerDNSName` を入力する。             |
| **ポート**                                    | `3306` と入力する。                                                   |
| **ユーザー名**                                | `XXXX` と入力する。                                                   |
| **パスワード**                                | `XXXXXX` と入力する。                                                 |
| **Secure Socket Layer (SSL) モード**          | `none` を選択する。                          |



## ターゲットエンドポイントを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/688cb2ed-9cf7-417e-97fc-5373b4b95032.png)


### エンドポイント設定


| 設定項目                                      | 設定値                                                                 |
|-----------------------------------------------|----------------------------------------------------------------------|
| **エンドポイントタイプ**                      | `ターゲットエンドポイント` を選択する。                               |
| **RDS DB インスタンスの選択**                 | チェックボックスをオンにする。                                        |
| **RDS インスタンス**                          | 作成した RDS インスタンスを選択する。       |
| **エンドポイント識別子**                      | 例`target-endpoint` と入力する。                                        |
| **ターゲットエンジン**                        | `MySQL` を選択する。                         |
| **エンドポイントデータベースへのアクセス**    | `アクセス情報を手動で提供する` を選択する。                           |
| **ユーザー名**                                | `XXX` と入力する。                                                    |
| **パスワード**                                | `XXXXXXXX` と入力する。                                               |
| 残りの設定                                    | すべてデフォルト値のままにする。                                      |


## レプリケーションタスクを作成し実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/881a92da-5acb-4e03-acb4-871176c63c5b.png)

### タスク設定、テーブルマッピング設定、および移行タスクのスタートアップ設定の各項目とその設定値


#### タスク設定

| 設定項目                                      | 設定値                                                                 |
|-----------------------------------------------|----------------------------------------------------------------------|
| **タスク識別子**                              | 例`replication-cdc`                                         |
| **レプリケーションインスタンス**              | 例`replication-instance`            |
| **ソースデータベースエンドポイント**          | 例`source-endpoint`                |
| **ターゲットデータベースエンドポイント**      | 例`target-endpoint`                |
| **移行タイプ**                                | `移行と複製`                                              |
| **編集モード**                                | `ウィザード`                                              |
| **ソーストランザクションのカスタム CDC 停止モード** | `カスタム CDC 停止モードを無効にする`                      |
| **ターゲットテーブル準備モード**              | `何もしない`                                         |
| **フルロードの完了後にタスクを停止する**      | `停止しない`                                              |
| **LOB column settings**                       | `制限付き LOB モード`                                      |
| **最大 LOB サイズ (KB)**                      | 例`32`                                                      |
| **検証の有効化**                              | チェックボックスをオンにする。                                        |
| **CloudWatch ログの有効化**                   | チェックボックスをオンにする。                                        |
| 残りの設定                                    | すべてデフォルト値のままにする。                                      |

#### テーブルマッピング

| 設定項目                                      | 設定値                                                                 |
|-----------------------------------------------|----------------------------------------------------------------------|
| **編集モード**                                | `ウィザード`                                              |
| `Selection rules`                             | `Selection rules` をクリックし、`新しい選択ルールの追加` を選択する。 |
| **スキーマ**                                  | ドロップダウンリストから `スキーマの入力` を選択する。                 |
| **ソース名**                                  | 元となる `データベース名` を入力する。                                 |

#### 移行タスクのスタートアップ設定

| 設定項目                                      | 設定値                                                                 |
|-----------------------------------------------|----------------------------------------------------------------------|
| **Start migration task**                      | `作成時に自動的に行う` を選択する。                                    |


#### タスクの作成
`タスクの作成` をクリックします。
`Status` が `ロード完了、レプリケーション進行中` に変わるまで待機します。

**タスクの実行中の確認**
タスクの実行中は、その詳細を表示し、テーブルとレプリケーションした行数に関する情報を確認できます。この処理は数分で完了します。[Status] が ロード完了、レプリケーション進行中 に変わるまで待機します。

## 仲間を募集しています！

ARIではエンジニア・ITコンサルタント・PM職全方位で仲間を募集しております。
カジュアル面談、随時受付中です！
ご興味ある方はこちらをご覧ください。

https://note.com/ari_hr/n/n4aed9ba75421