

# Amazon Aurora MySQL DB クラスターでのローカル書き込み転送の使用
<a name="aurora-mysql-write-forwarding"></a>

ローカル (クラスター内) 書き込み転送により、アプリケーションは Aurora レプリカで直接、読み取り/書き込みトランザクションを発行できます。その後、これらのトランザクションはライター DB インスタンスに転送されてコミットされます。アプリケーションで*書き込み後の読み取り一貫性* (トランザクション内の最新の書き込みを読み取る機能) が必要なときには、ローカル書き込み転送を使用できます。

リードレプリカは、ライターから非同期で更新を受け取ります。書き込み転送を行わないと、書き込み後の読み取り一貫性を必要とする読み取りをライター DB インスタンス上で処理する必要があります。または、複数のリードレプリカを活用してスケーラビリティを高めるために、複雑なカスタムアプリケーションロジックを開発する必要があります。アプリケーションは、トラフィックを正しいエンドポイントに送信するために、すべての読み取りトラフィックと書き込みトラフィックを完全に分割して、2 セットのデータベース接続を維持する必要があります。クエリがアプリケーション内の単一の論理セッション、つまりトランザクションの一部である場合、この開発オーバーヘッドはアプリケーションの設計を複雑にします。さらに、レプリケーションの遅延はリードレプリカによって異なる場合があるため、データベース内のすべてのインスタンスでグローバルな読み取りの一貫性を実現することは困難です。

書き込み転送により、これらのトランザクションを分割したり、ライターのみに送信したりする必要がなくなるため、アプリケーション開発が簡単になります。この新機能により、トランザクション内の最新の書き込みを読み取る必要があり、書き込み遅延の影響を受けないワークロードの読み取りスケールを簡単に実現できます。

ローカル書き込み転送は、Aurora グローバルデータベースのセカンダリ DB クラスターからプライマリ DB クラスターに書き込みを転送するグローバル書き込み転送とは異なります。Aurora グローバルデータベースの一部である DB クラスターでは、ローカル書き込み転送を使用できます。詳細については、「[Amazon Aurora Global Database の書き込み転送を使用する](aurora-global-database-write-forwarding.md)」を参照してください。

ローカル書き込み転送には Aurora MySQL バージョン 3.04 以降が必要です。

**Topics**
+ [ローカル書き込み転送の有効化](aurora-mysql-write-forwarding-enabling.md)
+ [DB クラスターの書き込み転送が有効になっているかどうかの確認](#aurora-mysql-write-forwarding-describing)
+ [書き込み転送とアプリケーションおよび SQL の互換性](#aurora-mysql-write-forwarding-compatibility)
+ [書き込み転送の分離レベル](#aurora-mysql-write-forwarding-isolation)
+ [書き込み転送の読み取り整合性](aurora-mysql-write-forwarding-consistency.md)
+ [書き込み転送を使用したマルチパートステートメントの実行](#aurora-mysql-write-forwarding-multipart)
+ [書込み転送を使用したトランザクション](#aurora-mysql-write-forwarding-txns)
+ [書き込み転送の設定パラメータ](#aurora-mysql-write-forwarding-params)
+ [書き込み転送のための Amazon CloudWatch メトリクスと Aurora MySQL ステータス変数](aurora-mysql-write-forwarding-cloudwatch.md)
+ [転送されたトランザクションとクエリの識別](#aurora-write-forwarding-processlist)

## DB クラスターの書き込み転送が有効になっているかどうかの確認
<a name="aurora-mysql-write-forwarding-describing"></a>

DB クラスターで書き込み転送を使用できるかどうかを判断するには、クラスターの属性 `LocalWriteForwardingStatus` が `enabled` に設定されていることを確認します。

AWS マネジメントコンソール のクラスターの詳細ページの **[設定]** タブで、**[ローカルリードレプリカの書き込み転送]** のステータスが **[有効]** と表示されます。

すべてのクラスターの書き込み転送設定のステータスを表示するには、次の AWS CLI コマンドを実行します。

**Example**  

```
aws rds describe-db-clusters \
--query '*[].{DBClusterIdentifier:DBClusterIdentifier,LocalWriteForwardingStatus:LocalWriteForwardingStatus}'

[
    {
        "LocalWriteForwardingStatus": "enabled",
        "DBClusterIdentifier": "write-forwarding-test-cluster-1"
    },
    {
        "LocalWriteForwardingStatus": "disabled",
        "DBClusterIdentifier": "write-forwarding-test-cluster-2"
    },
    {
        "LocalWriteForwardingStatus": "requested",
        "DBClusterIdentifier": "test-global-cluster-2"
    },
    {
        "LocalWriteForwardingStatus": "null",
        "DBClusterIdentifier": "aurora-mysql-v2-cluster"
    }
]
```

DB クラスターは、`LocalWriteForwardingStatus` として以下の値を持ちます。
+ `disabled` — 書き込み転送は無効です。
+ `disabling` — 書き込み転送は無効化中です。
+ `enabled` — 書き込み転送は有効です。
+ `enabling` — 書き込み転送は有効化中です。
+ `null` — この DB クラスターでは書き込み転送は使用できません。
+ `requested` — 書き込み転送がリクエストされていますが、まだアクティブではありません。

## 書き込み転送とアプリケーションおよび SQL の互換性
<a name="aurora-mysql-write-forwarding-compatibility"></a>

書き込み転送では、次の種類の SQL ステートメントを使用できます。
+ `INSERT`、`DELETE`、および `UPDATE` などのデータ操作言語 (DML) ステートメント。書き込み転送で使用できるこれらのステートメントのプロパティには、以下で説明するように、いくつかの制限があります。
+ `SELECT ... LOCK IN SHARE MODE` と `SELECT FOR UPDATE` ステートメント。
+ `PREPARE` と `EXECUTE` ステートメント。

書き込み転送機能を持つ DB クラスターでは、特定のステートメントの使用が許可されていないか、古い結果を生成する可能性があります。また、ユーザー定義関数とユーザー定義プロシージャはサポートされていません。したがって、DB クラスターでは、`EnableLocalWriteForwarding` 設定はデフォルトで無効になっています。有効にする前に、アプリケーションコードがこれらの制限の影響を受けないことを確認してください。

書き込み転送で使用する SQL ステートメントには、次の制限が適用されます。場合によっては、書き込み転送が有効な DB クラスターでステートメントを使用できます。この方法は、`aurora_replica_read_consistency` 設定パラメータによってセッション内で書き込み転送が有効化されていない場合に機能します。書き込み転送のために許可されていないステートメントを使用しようとすると、次のようなエラーメッセージが表示されます。

```
ERROR 1235 (42000): This version of MySQL doesn't yet support '{{operation}} with write forwarding'.
```

**データ定義言語 (DDL)**  
ライター DB インスタンスに接続して DDL ステートメントを実行します。リーダー DB インスタンスからは実行できません。

**テンポラリテーブルのデータを使用した永続テーブルの更新**  
書き込み転送が有効な DB クラスターでテンポラリテーブルを使用できます。ただし、ステートメントがテンポラリテーブルを参照している場合は、DML ステートメントを使用して永続テーブルを変更することはできません。例えば、テンポラリテーブルからデータを取る `INSERT ... SELECT` ステートメントを使用することはできません。

**XA トランザクション**  
セッション内で書き込み転送が有効になっている場合、DB クラスターで次のステートメントを使用することはできません。これらのステートメントは、書き込み転送が有効になっていない DB クラスター、または `aurora_replica_read_consistency` 設定が空のセッションで使用できます。セッション内で書き込み転送を有効にする前に、コードでこれらのステートメントが使用されているかどうかを確認してください。  

```
XA {START|BEGIN} xid [JOIN|RESUME]
XA END xid [SUSPEND [FOR MIGRATE]]
XA PREPARE xid
XA COMMIT xid [ONE PHASE]
XA ROLLBACK xid
XA RECOVER [CONVERT XID]
```

**永続テーブルの LOAD ステートメント**  
書き込み転送が有効な DB クラスターでは、以下のステートメントを使用できません。  

```
LOAD DATA INFILE 'data.txt' INTO TABLE t1;
LOAD XML LOCAL INFILE 'test.xml' INTO TABLE t1;
```

**プラグインステートメント**  
書き込み転送が有効な DB クラスターでは、以下のステートメントを使用できません。  

```
INSTALL PLUGIN example SONAME 'ha_example.so';
UNINSTALL PLUGIN example;
```

**SAVEPOINT ステートメント**  
セッション内で書き込み転送が有効になっている場合、DB クラスターで次のステートメントを使用することはできません。これらのステートメントは、書き込み転送が有効になっていない DB クラスター、または `aurora_replica_read_consistency` 設定が空白のセッションで使用できます。セッション内で書き込み転送を有効にする前に、コードでこれらのステートメントが使用されているかどうかを確認してください。  

```
SAVEPOINT t1_save;
ROLLBACK TO SAVEPOINT t1_save;
RELEASE SAVEPOINT t1_save;
```

## 書き込み転送の分離レベル
<a name="aurora-mysql-write-forwarding-isolation"></a>

書き込み転送を使用するセッションでは、`REPEATABLE READ` 分離レベルのみを使用できます。Aurora レプリカで `READ COMMITTED` 分離レベルを使用することもできますが、その分離レベルは書き込み転送では機能しません。`REPEATABLE READ` および `READ COMMITTED` 分離レベルの詳細については、「[Aurora MySQL の分離レベル](AuroraMySQL.Reference.IsolationLevels.md)」を参照してください。

## 書き込み転送を使用したマルチパートステートメントの実行
<a name="aurora-mysql-write-forwarding-multipart"></a>

DML ステートメントは、`INSERT ... SELECT` ステートメントや `DELETE ... WHERE` ステートメントなど、複数の部分から構成される場合があります。この場合、ステートメント全体がライター DB インスタンスに転送され、そこで実行されます。

## 書込み転送を使用したトランザクション
<a name="aurora-mysql-write-forwarding-txns"></a>

トランザクションアクセスモードが読み取り専用に設定されている場合、書き込み転送は使用されません。`SET TRANSACTION` ステートメントまたは `START TRANSACTION` ステートメントを使用して、トランザクションのアクセスモードを指定できます。[transaction\_read\_only](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_transaction_read_only) セッション変数の値を変更することで、トランザクションアクセスモードを指定することもできます。このセッション値は、書き込み転送が有効な DB クラスターに接続しているときにのみ変更できます。

長時間実行されるトランザクションがかなりの期間ステートメントを発行しない場合、アイドルタイムアウト期間を超える可能性があります。この期間のデフォルトは 1 分です。`aurora_fwd_writer_idle_timeout` パラメータを設定して、最大 1 日まで増やすことができます。アイドルタイムアウトを超えたトランザクションは、ライターインスタンスによってキャンセルされます。次に送信するステートメントは、タイムアウトエラーを受け取ります。その後、Aurora はトランザクションをロールバックします。

このタイプのエラーは、書き込み転送が使用できなくなった場合に発生する可能性があります。例えば、DB クラスターを再起動した場合や、書き込み転送を無効にした場合、Aurora は書き込み転送を使用するすべてのトランザクションをキャンセルします。

ローカル書き込み転送を使用しているクラスター内のライターインスタンスが再起動されると、ローカル書き込み転送を使用しているリーダーインスタンス上のアクティブで転送されたトランザクションとクエリは自動的に閉じられます。ライターインスタンスが再び使用可能になったら、これらのトランザクションを再試行できます。

## 書き込み転送の設定パラメータ
<a name="aurora-mysql-write-forwarding-params"></a>

Aurora DB パラメータグループには、書き込み転送機能の設定が含まれています。これらのパラメータの詳細を次の表にまとめ、表に続いて使用上の注意を記載してください。


| パラメータ | スコープ | タイプ | デフォルト値 | 有効値 | 
| --- | --- | --- | --- | --- | 
| aurora\_fwd\_writer\_idle\_timeout | クラスター | 符号なし整数 | 60 | 1-86,400 | 
| aurora\_fwd\_writer\_max\_connections\_pct | クラスター | 符号なし長整数 | 10 | 0-90 | 
| aurora\_replica\_read\_consistency | クラスターまたはインスタンス | 列挙型 | null | EVENTUAL, SESSION, GLOBAL | 

受信する書き込み要求を制御するには、以下の設定を使用してください。
+ `aurora_fwd_writer_idle_timeout` — リーダーインスタンスから転送された接続で、ライター DB インスタンスがアクティビティを待ってから、接続を閉じるまでの秒数。この期間を超えてセッションがアイドル状態のままである場合、Aurora はセッションをキャンセルします。
+ `aurora_fwd_writer_max_connections_pct` - リーダーから転送されたクエリを処理するためにライター DB インスタンスで使用できるデータベース接続の上限。これは、ライターの `max_connections` 設定のパーセンテージで表されます。例えば、`max_connections` が800 回、`aurora_fwd_master_max_connections_pct`または`aurora_fwd_writer_max_connections_pct`が 10 回 の場合、書き込みは最大 80 回 の同時転送セッションを許可します。これらの接続は、`max_connections` 設定によって管理される同じ接続プールから取得されます。

  この設定は、書き込み転送が有効なライターにのみ適用されます。この値を小さくしても、既存の接続は影響を受けません。Aurora は、DB クラスターから新しい接続の作成を試みるときに、この新しい設定値を参照します。デフォルト値は 10 で、`max_connections` 値の 10% を表します。

**注記**  
`aurora_fwd_writer_idle_timeout` と `aurora_fwd_writer_max_connections_pct` は DB クラスターのパラメータであるため、各クラスターのすべての DB インスタンスは、これらのパラメータに同じ値を持ちます。

`aurora_replica_read_consistency` の詳細については、「[書き込み転送の読み取り整合性](aurora-mysql-write-forwarding-consistency.md)」を参照してください。

DB パラメータグループの詳細については、「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」を参照してください。

## 転送されたトランザクションとクエリの識別
<a name="aurora-write-forwarding-processlist"></a>

`information_schema.aurora_forwarding_processlist` テーブルを使用して、転送されたトランザクションとクエリを識別できます。このテーブルの詳細については、「[information\_schema.aurora\_forwarding\_processlist](AuroraMySQL.Reference.ISTables.md#AuroraMySQL.Reference.ISTables.aurora_forwarding_processlist)」を参照してください。

次の例は、ライター DB インスタンス上のすべての転送された接続を示しています。

```
mysql> select * from information_schema.AURORA_FORWARDING_PROCESSLIST where IS_FORWARDED=1 order by REPLICA_SESSION_ID;

+-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+----------------------+----------------+
| ID  | USER     | HOST               | DB       | COMMAND | TIME | STATE        | INFO                                       | IS_FORWARDED | REPLICA_SESSION_ID | REPLICA_INSTANCE_IDENTIFIER     | REPLICA_CLUSTER_NAME | REPLICA_REGION |
+-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+---------------------------------------+
| 648 | myuser   | {{IP_address:port1}}   | sysbench | Query   |    0 | async commit | UPDATE sbtest58 SET k=k+1 WHERE id=4802579 |            1 |                637 | my-db-cluster-instance-2        | my-db-cluster        | us-west-2      |
| 650 | myuser   | {{IP_address:port2}}   | sysbench | Query   |    0 | async commit | UPDATE sbtest54 SET k=k+1 WHERE id=2503953 |            1 |                639 | my-db-cluster-instance-2        | my-db-cluster        | us-west-2      |
+-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+----------------------+----------------+
```

転送側のリーダー DB インスタンスで、`SHOW PROCESSLIST` を実行することにより、これらのライター DB 接続に関連するスレッドを確認できます。ライターの `REPLICA_SESSION_ID` の値、637 と 639 は、リーダーの `Id` 値と同じです。

```
mysql> select @@aurora_server_id;

+---------------------------------+
| @@aurora_server_id              |
+---------------------------------+
| my-db-cluster-instance-2        |
+---------------------------------+
1 row in set (0.00 sec)

mysql> show processlist;

+-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+
| Id  | User     | Host               | db       | Command | Time | State        | Info                                        |
+-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+
| 637 | myuser   | {{IP_address:port1}}   | sysbench | Query   |    0 | async commit | UPDATE sbtest12 SET k=k+1 WHERE id=4802579  |
| 639 | myuser   | {{IP_address:port2}}   | sysbench | Query   |    0 | async commit | UPDATE sbtest61 SET k=k+1 WHERE id=2503953  |
+-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+
12 rows in set (0.00 sec)
```