GAE / Node で Memcached クラスタ ( Memcached Multiple Instances ) を使うポイント


概要

先日 bitnami に出会い簡単に memcached server を立てられたことに感動 したので、今回はその勢いのままクラスタ版の扱い方をまとめてみます

基本 runtime: nodejs 向けのまとめですが、クライアントライブラリ部分を読み替えることで どの runtime に対しても流用できると思います

クラスタの構築

ローカルからアクセス

  • 早速ローカルから接続テストをしてみます
  • ただ、その前に少々下準備が必要です

primary server に公開鍵を設定

  • グローバルメニュー[GCE]
  • VM インスタンス
  • primary server ( memcached-cluster-1-node-0 等 ) を選択
  • 編集
  • SSH キーが0 個あります ( 表示して編集する )
  • ssh-keygen 等で作成した公開鍵を user 名 bitnami で設定
  • 保存

確認

ssh -i /path/to/key bitnami@SERVER1_EXTERNAL_IP

SSH ポートフォワーディング

ssh -N 
    -L 11211:SERVER1_INTERNAL_IP:11211 
    -L 11212:SERVER2_INTERNAL_IP:11211 
    -L 11213:SERVER3_INTERNAL_IP:11211 
    -i /path/to/key bitnami@SERVER1_EXTERNAL_IP

memcached-cli で確認

  • ローカルでの確認には memcached-cli を利用します
connect_to_server1
memcached-cli 127.0.0.1:11211
127.0.0.1:11211>
connect_to_server2
memcached-cli 127.0.0.1:11212
127.0.0.1:11212>
connect_to_server3
memcached-cli 127.0.0.1:11213
127.0.0.1:11213>

GAE / Node App からアクセス

Memcached クライアント MemJS

アプリケーションへの設定

  • GAE からは GCE の内部 IP に直接接続できるので SSH トンネルは必要ありません
    • 内部IPは VM インスタンス一覧画面に表示されています

  • app.yaml に Memjs が必要としている環境変数を設定
    • パスワードは VM インスタンス詳細のカスタムメタデータ PROVISIONER_PEER_PASSWORD に書いてあります
app.yaml
env_variables:
    # https://github.com/alevy/memjs
    MEMCACHIER_SERVERS: SERVER1_INTERNAL_IP,SERVER2_INTERNAL_IP,SERVER3_INTERNAL_IP
    MEMCACHIER_USERNAME: user
    MEMCACHIER_PASSWORD: ************

アプリケーションから実行・確認

  • あとはライブラリの仕様通りに getset するだけ

memcached-cli で確認用のデータをセット

>set test huga

テストコードをデプロイ

test.ts
import * as Memjs from 'memjs';

// memcache 部分抜粋
const client = Memjs.Client.create();
client.get('test', (err: any, val: Buffer) => {
    console.log(err, val.toString());
});
gcloud app deploy app.yaml

Logger から確認してみる

できた! ヾ(゚∀゚○)ノ≡ヽ(○゚∀゚)ノ゙

削除

gcloud deployment-manager deployments delete DEPLOYMENT_ID ( memcached-cluster-1等 )

おわり

Memcached クラスタ ( Memcached Multiple Instances ) を扱うために必要な情報が断片化していたので、一つの記事としてまとめてみました
誰かのお役に立つことができれば幸いです m(__)m