前置き
先日、Memorystore for Memcachedのベータ版がリリースされました
https://cloud.google.com/blog/ja/products/databases/fully-managed-memorystore-for-memcached
このサービスは、オープンソースの分散型メモリキャッシュサービスである Memcached の、 Google Cloud の基盤を用いたフルマネージドサービスです。
従前より Google Cloud には、 Memorystore という Redisのフルマネージド サービスが存在しており、同等のユースケースへの対応としては Memorystore を選択することになっていましたが、今後はMemcachedも選択肢として挙げられる様になりました。
基本的にはRedisでだいたいの要件はまかなえるはずですが、マルチスレッドでの利用が実現可能になっているのがMemcachedの特徴ですので、単一ノードなどの要件次第ではMemorystore for Memcachedが活躍するシーンもあると思います。
https://aws.amazon.com/jp/elasticache/redis-vs-memcached/
今回はそんなMemorystore for Memcachedが如何に簡単に利用出来るかをお伝えしたいと思います。
実践
以下のコマンドはCloud Shellで実施しております。
(Google Cloud SDK 287.0.0)
Memorystore for Memcachedのインスタンスを構築するのは非常に簡単です。
以下のコマンドを実行するだけです。
(正確には計測しておりませんが体感で5分くらいで構築が完了します。)
gcloud beta memcache instances create myinstance --node-count=3 --node-cpu=4 --node-memory=10GB --region=asia-northeast1
(APIが有効になっていない場合は、以下のようにAPIを有効にするかどうか聞かれますので、 y
を押して、有効にしてください。)
API [memcache.googleapis.com] not enabled on project [138935972256].
Would you like to enable and retry (this will take a few minutes)?
(y/N)? y
これだけで東京リージョンに3つのノード上に分散した運用不要なMemcachedを構築することができます。簡単過ぎてびっくりです。
Memcachedの情報については以下のコマンドで確認できます。(インスタンスを作成したときに吐き出される情報と同じです。)
gcloud beta memcache instances describe myinstance --region=asia-northeast1
今回は以下のようなインスタンスが作成されました。
authorizedNetwork: projects/ca-oiso-test/global/networks/default
createTime: '2020-04-05T00:32:21.016657687Z'
discoveryEndpoint: 10.29.80.5:11211
memcacheFullVersion: memcached-1.5.16
memcacheNodes:
- host: 10.29.80.8
nodeId: node-a-1
parameters: {}
port: 11211
state: READY
zone: us-central1-a
- host: 10.29.80.7
nodeId: node-b-1
parameters: {}
port: 11211
state: READY
zone: us-central1-b
- host: 10.29.80.6
nodeId: node-f-1
parameters: {}
port: 11211
state: READY
zone: us-central1-f
memcacheVersion: MEMCACHE_1_5
name: projects/ca-oiso-test/locations/us-central1/instances/myinstance
nodeConfig:
cpuCount: 4
memorySizeMb: 10240
nodeCount: 3
parameters: {}
state: READY
updateTime: '2020-04-05T00:37:53.225286065Z'
zones:
- us-central1-a
- us-central1-b
containers:
- us-central1-c
- us-central1-f
検証
実際に使ってみましょう。
疎通確認
今回作成した Memcached インスタンスと同一のサブネットに、 GCE インスタンスを作成し、接続します。以下が参考コマンドです。
gcloud beta compute --project=ca-oiso-test instances create instance-3 --zone=asia-northeast1-b --machine-type=n1-standard-1 --subnet=default --network-tier=PREMIUM --no-restart-on-failure --maintenance-policy=TERMINATE --preemptible --service-account=138935972256-compute@developer.gserviceaccount.com --scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append --tags=http-server --image=debian-9-stretch-v20200309 --image-project=debian-cloud --boot-disk-size=10GB --boot-disk-type=pd-standard --boot-disk-device-name=instance-3 --reservation-affinity=any
検証はこちらのVMで行います。
事前準備としてtelnetをインストールします。
sudo apt-get install telnet
その後、以下のコマンドを利用して接続してみます。
export NODE_IP=10.29.80.69 #いずれかのNodeのIP
telnet $NODE_IP 11211
以下が表示されれば成功です。
Trying 10.29.80.69...
Connected to 10.29.80.69.
実際に触ってみましょう。
get test
END
set test 1 0 11
Cloud Ace!!!
STORED
get test
VALUE test 1 11
Cloud Ace!!!
正常に動作していることが確認できます。
簡単な負荷テスト
memslapを利用して簡単な負荷テストをしてみましょう
http://docs.libmemcached.org/bin/memslap.html
どなたがが作成してくれたmemslapのDockerイメージをお借りして実行します。
https://hub.docker.com/r/mapk0y/memslap
3000スレッドのワークロードを実行してみます。
sudo docker run -it --rm mapk0y/memslap --servers=$NODE_IP --execute-number=3000
0.760secで処理が完了しました。
用途によりますが、KVSとして十分なパフォーマンスが発揮できていると言えますね。
Threads connecting to servers 1
Took 0.760 seconds to load data
最後に
ほとんど手間もかからずに、運用不要な Memcached を利用することが出来ました。検証まで含めて約10分程度で試してみることが出来ます。
クラウドとかコンテナ使うと環境構築みたいな無駄な作業をカットできるので、本当に生産性上がるなーとつくづく、思います。
Memorystore for Redisと合わせて、KVSをGoogle Cloudで利用する際にご検討ください。