

# MySQL の memcached サポート
<a name="Appendix.MySQL.Options.memcached"></a>

Amazon RDS は、MySQL 5.6 で導入された InnoDB テーブルに対する `memcached` インターフェイスの使用をサポートしています。`memcached` API を使用すると、NoSQL キー/値データストアと似た方法でアプリケーションが InnoDB テーブルを使用することができます。

**注記**  
memcached インターフェイスは、MySQL 8.4 では使用できなくなりました。DB インスタンスを MySQL 8.4 にアップグレードするときは、既存のオプショングループで `memcached` を無効にする必要があります。

`memcached` インターフェイスは、シンプルなキーベースのキャッシュです。アプリケーションは `memcached` を使用して、キャッシュにあるキーと値のデータペアの挿入、操作、取得を実行します。MySQL 5.6 では、`memcached` プロトコルによって InnoDB テーブルのデータを発行するデーモンサービスを実装するプラグインが導入されました。MySQL `memcached` プラグインの詳細については、「[InnoDB と memcached の統合](https://dev.mysql.com/doc/refman/8.0/en/innodb-memcached.html)」を参照してください。

**RDS for MySQL DB インスタンスの memcached サポートを有効にするには**

1. `memcached` インターフェイスへのアクセスを制御するために使用するセキュリティグループを決定します。既に SQL インターフェイスを使用しているアプリケーションセットが `memcached` インターフェイスにアクセスするアプリケーションセットと同じ場合、SQL インターフェイスで使用されている既存の VPC セキュリティグループを使用できます。異なるアプリケーションセットが `memcached` インターフェイスにアクセスする場合は、新しい VPC または DB セキュリティグループを定義します。セキュリティグループの管理方法の詳細については、「[セキュリティグループによるアクセス制御](Overview.RDSSecurityGroups.md)」を参照してください。

1. カスタム DB オプショングループを作成し、エンジンタイプとバージョンとして MySQL を選択します。オプショングループの作成方法の詳細については、「[オプショングループを作成する](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)」を参照してください。

1. オプショングループに [`MEMCACHED`] オプションを追加します。`memcached` インターフェイスで使用するポート、および、インターフェイスへのアクセスを制御するために使用するセキュリティグループを指定します。オプションの追加方法の詳細については、「[オプショングループにオプションを追加する](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption)」を参照してください。

1. 必要に応じて、オプション設定を変更し、`memcached` パラメータを設定します。オプション設定の変更方法の詳細については、「[オプションの設定を変更する](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ModifyOption)」を参照してください。

1. インスタンスにオプショングループを適用します。オプショングループが適用された場合、Amazon RDS では、そのインスタンスの `memcached` サポートが有効になります。
   + インスタンスを起動するときにカスタムオプショングループを指定して、新しいインスタンスの `memcached` サポートを有効にします。MySQL インスタンスの起動方法の詳細については、「[Amazon RDS DB インスタンスの作成](USER_CreateDBInstance.md)」を参照してください。
   + インスタンスを変更するときにカスタムオプショングループを指定して、既存のインスタンスの `memcached` サポートを有効にします。DB インスタンスの変更の詳細については、「[Amazon RDS DB インスタンスを変更する](Overview.DBInstance.Modifying.md)」を参照してください。

1. `memcached` インターフェイスを介して MySQL テーブル内のアクセス可能な列を指定します。`memcached` プラグインは、`containers` という専用データベースに `innodb_memcache` というカタログテーブルを作成します。`containers` テーブルに行を挿入して InnoDB テーブルをマッピングし、`memcached` を介してアクセスします。`memcached` キー値を格納する InnoDB テーブルの列を 1 つ指定し、キーに関連付けられたデータ値を格納する列を 1 つ以上指定します。また、`memcached` アプリケーションがその列セットを参照するときに使用する名前も指定します。`containers` テーブルに行を挿入する方法の詳細については、「[InnoDB memcached プラグインの内部構造](https://dev.mysql.com/doc/refman/8.0/en/innodb-memcached-internals.html)」を参照してください。InnoDB テーブルをマッピングし、`memcached` を介してアクセスする例については、「[InnoDB memcached プラグインの書き込みアプリケーション](https://dev.mysql.com/doc/refman/8.0/en/innodb-memcached-developing.html)」を参照してください。

1. `memcached` インターフェイスにアクセスするアプリケーションが、SQL インターフェイスを使用するアプリケーションとは異なるコンピュータまたは EC2 インスタンス上にある場合は、MySQL インスタンスに関連付けられた VPC セキュリティグループに、そのコンピュータの接続情報を追加します。セキュリティグループの管理方法の詳細については、「[セキュリティグループによるアクセス制御](Overview.RDSSecurityGroups.md)」を参照してください。

インスタンスの `memcached` サポートを無効にするには、インスタンスを変更して MySQL バージョンのデフォルトオプショングループを指定します。DB インスタンスの変更の詳細については、「[Amazon RDS DB インスタンスを変更する](Overview.DBInstance.Modifying.md)」を参照してください。

## MySQL memcached のセキュリティ上の考慮事項
<a name="w2aac47c83c15c13"></a>

`memcached` プロトコルはユーザー認証をサポートしていません。MySQL `memcached` セキュリティ上の考慮事項の詳細については、MySQL ドキュメントの「[InnoDB memcached プラグインのセキュリティ上の考慮事項](https://dev.mysql.com/doc/refman/8.0/en/innodb-memcached-security.html)」を参照してください。

以下の対策をとると、`memcached` インターフェイスのセキュリティを高めることができます。
+ `MEMCACHED` オプションをオプショングループに追加するときに、デフォルトの 11211 とは異なるポートを指定します。
+ 既知の信頼されたクライアントアドレスおよび EC2 インスタンスのみにアクセスを制限する VPC セキュリティグループに、`memcached` インターフェイスを関連付けます。セキュリティグループの管理方法の詳細については、「[セキュリティグループによるアクセス制御](Overview.RDSSecurityGroups.md)」を参照してください。

## MySQL memcached の接続情報
<a name="w2aac47c83c15c15"></a>

`memcached` インターフェイスにアクセスするには、アプリケーションで Amazon RDS インスタンスの DNS 名と `memcached` ポート番号の両方を指定する必要があります。例えば、インスタンスの DNS 名が `my-cache-instance.cg034hpkmmjt.region.rds.amazonaws.com` で、memcached インターフェイスがポート 11212 を使用している場合、PHP で指定する接続情報は次のようになります。

 

```
1. <?php
2. 
3. $cache = new Memcache;
4. $cache->connect('my-cache-instance.cg034hpkmmjt.region.rds.amazonaws.com',11212);
5. ?>
```

**MySQL DB インスタンスの DNS 名と memcached ポートを確認するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. AWS マネジメントコンソールの右上隅で、DB インスタンスを含むリージョンを選択します。

1. ナビゲーションペインで、[**データベース**] を選択します。

1. MySQL DB インスタンスの名前を選択して詳細を表示します。

1. [**Connect**] セクションで、[**Endpoint**] フィールドの値を書き留めます。DNS 名はエンドポイントと同じです。また、[**Connect**] セクションのポートは `memcached` インターフェイスへのアクセスには使用されないことにご注意ください。

1. [**Details**] セクションで、[**Option Group**] フィールドにリストされた名前を書き留めます。

1. ナビゲーションペインで、[**オプショングループ**] を選択します。

1. MySQL DB インスタンスで使用するオプショングループの名前を選択して、オプショングループの詳細を表示します。[**Options**] セクションで、[**MEMCACHED**] オプションの [**Port**] 設定の値を書き留めます。

## MySQL memcached のオプション設定
<a name="w2aac47c83c15c17"></a>

Amazon RDS は、MySQL `memcached` パラメータを Amazon RDS `MEMCACHED` オプションのオプション設定として公開します。

### MySQL memcached のパラメータ
<a name="w2aac47c83c15c17b4"></a>
+  `DAEMON_MEMCACHED_R_BATCH_SIZE` - COMMIT を実行して新しいトランザクションをスタートする前に実行する `memcached` 読み取りオペレーション (get) の回数を指定する整数値。指定できる値は 1〜4294967295 で、デフォルトは 1 です。このオプションは、インスタンスが再開されるまで有効になりません。
+  `DAEMON_MEMCACHED_W_BATCH_SIZE` - COMMIT を実行して新しいトランザクションをスタートする前に実行する `memcached` 書き込み操作 (add、set、incr など) の回数を指定する整数値。指定できる値は 1〜4294967295 で、デフォルトは 1 です。このオプションは、インスタンスが再開されるまで有効になりません。
+  `INNODB_API_BK_COMMIT_INTERVAL` - InnoDB `memcached` インターフェイスを使用するアイドル状態の接続を自動コミットする頻度を指定する整数値。指定できる値は 1〜1073741824 で、デフォルトは 5 です。このオプションは即座に反映され、インスタンスを再開する必要はありません。
+  `INNODB_API_DISABLE_ROWLOCK` - InnoDB `memcached` インターフェイスを使用しているときに行ロックの使用を無効 (1=true) または有効 (0=false) にするブール値。デフォルトは 0 (false) です。このオプションは、インスタンスが再開されるまで有効になりません。
+  `INNODB_API_ENABLE_MDL` - ブール値。0 (false) に設定すると、InnoDB `memcached` プラグインで使用するテーブルがロックされ、SQL インターフェイスを介して DDL によってそのテーブルを削除または変更できなくなります。デフォルトは 0 (false) です。このオプションは、インスタンスが再開されるまで有効になりません。
+  `INNODB_API_TRX_LEVEL` - `memcached` インターフェイスで処理されるクエリのトランザクション分離レベルを指定する整数値。指定できる値は 0〜3 です。デフォルトは 0 です。このオプションは、インスタンスが再開されるまで有効になりません。

次の MySQL `memcached` のパラメータは Amazon RDS によって設定され、ユーザーが変更することはできません: `DAEMON_MEMCACHED_LIB_NAME`、`DAEMON_MEMCACHED_LIB_PATH`、`INNODB_API_ENABLE_BINLOG`。MySQL 管理者が `daemon_memcached_options` を使用して設定したパラメータは、Amazon RDS の個々の `MEMCACHED` オプション設定として使用できます。

### MySQL daemon\$1memcached\$1options のパラメータ
<a name="w2aac47c83c15c17b6"></a>
+  `BINDING_PROTOCOL` - 使用するバインディングプロトコルを指定する文字列。指定できる値は、`auto`、`ascii`、または `binary` です。デフォルトは `auto` で、サーバーが自動的にクライアントとプロトコルを交渉します。このオプションは、インスタンスが再開されるまで有効になりません。
+  `BACKLOG_QUEUE_LIMIT` - による処理待ちが可能なネットワーク接続の数を指定する整数値。`memcached`この値を増やすと、クライアントが `memcached` インスタンスに接続できないというエラーの発生回数が減る可能性がありますが、サーバーのパフォーマンスは向上しません。指定できる値は 1〜2048 で、デフォルトは 1024 です。このオプションは、インスタンスが再開されるまで有効になりません。
+  `CAS_DISABLED` - 比較と交換 (CAS: compare and swap) の使用を有効 (1=true) または無効 (0=false) にするブール値。項目ごとのサイズが 8 バイトずつ小さくなります。デフォルトは 0 (false) です。このオプションは、インスタンスが再開されるまで有効になりません。
+  `CHUNK_SIZE` - 最小項目のキー、値、およびフラグに割り当てる最小のチャンクサイズ (バイト単位) を指定する整数値。指定できる値は 1〜48 です。デフォルトは 48 で、値を小さくするとメモリ効率が大幅に向上します。このオプションは、インスタンスが再開されるまで有効になりません。
+  `CHUNK_SIZE_GROWTH_FACTOR` - 新しいチャンクのサイズを制御する浮動小数点値。新しいチャンクのサイズは、前のチャンクのサイズに `CHUNK_SIZE_GROWTH_FACTOR` を掛けた値です。指定できる値は 1〜2 で、デフォルトは 1.25 です。このオプションは、インスタンスが再開されるまで有効になりません。
+  `ERROR_ON_MEMORY_EXHAUSTED` - ブール値。1 (true) に設定すると、項目を格納するメモリが不足した場合、`memcached` は項目を削除するのではなく、エラーを返します。0 (false) に設定した場合、メモリ不足になると `memcached` は項目を削除します。デフォルトは 0 (false) です。このオプションは、インスタンスが再開されるまで有効になりません。
+  `MAX_SIMULTANEOUS_CONNECTIONS` - 同時接続の最大数を指定する整数値。この値を 10 未満に設定すると、MySQL は起動できなくなります。指定できる値は 10〜1024 で、デフォルトは 1024 です。このオプションは、インスタンスが再開されるまで有効になりません。
+  `VERBOSITY` - `memcached` サービスが MySQL エラーログに記録する情報のレベルを指定する文字列。デフォルトは「v」です。このオプションは、インスタンスが再開されるまで有効になりません。指定できる値は次のとおりです。
  +  `v` - メインイベントループの実行中に発生したエラーと警告を記録します。
  +  `vv` - v で記録する情報に加えて、各クライアントのコマンドとレスポンスも記録します。
  +  `vvv` - vv で記録する情報に加えて、内部の状態移行も記録します。

これらの MySQL `DAEMON_MEMCACHED_OPTIONS` のパラメータは Amazon RDS によって設定され、ユーザーが変更することはできません: `DAEMON_PROCESS`、`LARGE_MEMORY_PAGES`、`MAXIMUM_CORE_FILE_LIMIT`、`MAX_ITEM_SIZE`、`LOCK_DOWN_PAGE_MEMORY`、`MASK`、`IDFILE`、`REQUESTS_PER_EVENT`、`SOCKET`、`USER`。