elasticacheで挙動がおかしくなった話

  •  
 
ズィスト2020年12月25日 - 18:25 に投稿

皆さんこんにちは
今回はAWSのelasticacheを使おうとして挙動がおかしくなった話をご紹介します。
この記事ではmemcacheについてとなります。

環境

今回問題が起きた環境はこちら

  • EC2インスタンス (centos)
    • php,apache,Drupalなどインストール済み
  • Elasticache (memcache)
    • クラスター構成

概要

memcacheを使用するためremiリポジトリからphp拡張モジュールのphp-pecl-memcachedをインストールしました。
しかし、ここに落とし穴がありました。

elasticacheのドキュメントには以下のような記述があります。

以下のプログラムは、ElastiCache クラスタークライアントを使用してクラスター設定エンドポイントに接続し、キャッシュにデータ項目を追加する方法を示しています。さらに操作を行わなくても、プログラムは自動検出を使用してクラスター内のすべてのノードに接続します。

PHP 向けの ElastiCache クラスタークライアントを使用するには、まず Amazon EC2 インスタンスにインストールする必要があります。詳細については、「ElastiCache Cluster Client for PHP のインストール」を参照してください

aws公式ドキュメントから引用

Elasticacheを使用する際にはaws版のmemcachedを使用する必要がありました。
これに気づかず、remiリポジトリからインストールしたmemcached使用していたため動作がおかしくなりました。
aws版のmemcacheをインストールすることで解決しました。
インストール方法については公式ドキュメントを参照してください。

remiリポジトリのmemcacheを使用するとどうなるか

以下はDrupla上での動作となります。
コンテンツにリビションが複数ある状態でコンテンツのリビジョンを確認すると現在のリビジョンが1つになったり、複数になったりします。
また該当コンテンツを複数回ブラウザで表示すると内容が変わります。

Drupalにおけるmemcacheの設定

Drupalでmamcecheを使用する場合はmemcacheモジュールをインストールして、設定ファイルを編集する必要があります。
ここにも落とし穴があります。
D8のこのモジュールのREADMEにはElasticacheについて何も触れられていませんが、D7のREADMEには以下のような記述があります。

Amazon Elasticache You can use the Drupal Memcache module to talk with Amazon Elasticache, but to enable Automatic Discovery you must use Amazon's forked version of the PECL Memcached extension with Dynamic Client Mode enabled. ....

READMEより引用

これを参考に以下のように設定する必要があります。

$settings['memcache']['servers'] = ['127.0.0.1:11211' => 'default'];
$settings['memcache']['bins'] = ['default' => 'default'];
$settings['memcache']['key_prefix'] = '';
$settings['memcache']['options'] = [
  Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT,
  Memcached::OPT_CLIENT_MODE  => Memcached::DYNAMIC_CLIENT_MODE,
]

まとめ

Elasticacheを使用する場合はAWSからmemcacheクライアントをダウンロード・インストールを行いましょう。
また、Drupalで使用する場合は更に設定に注意しましょう。

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。