初めてのMemorystore

## はじめに

[先日来日した Memorystore](https://twitter.com/googlecloud_jp/status/1042580337304326144) を軽く調べましたのでまとめたいと思います。
まぁ待ってればそのうち公式が翻訳されると思いますが・・

## ところで[Memorystore](https://cloud.google.com/memorystore/)ってなんだっけ？

GCPで提供されているPaaSな [Redis](https://redis.io/) です。
Redisが必要なんだけど自分でメンテしたくない人向け。
[RedisLabs](https://redislabs.com/) が類似のサービスになると思います。

## Memorystoreの特徴
### Redisバージョン

[公式によると現時点では3.2.11](https://cloud.google.com/memorystore/docs/redis/redis-overview) 固定です。
> Currently running Redis version 3.2.11

### Redisプロトコル

[公式によると完全な互換性があり、既存のライブラリが使える](https://cloud.google.com/memorystore/docs/redis/redis-overview) とのこと。
> Redis Protocol Compatible. Cloud Memorystore for Redis is fully Redis protocol compliant. You can move your applications using open source Redis to use Cloud Memorystore for Redis without any code changes. There is no need to learn new tools: all existing tools and client libraries just work.

### 可用性

可用性はBasic Tier(基本 Tier)とStandard Tier(標準 Tier) のどちらを選択するかで変わります。

Basic Tierはレプリカが無く、[googleによるメンテナンス他のいくつかの
操作で中身が消える](https://cloud.google.com/memorystore/docs/redis/maintenance-policy?hl=ja) ので、開発やテスト環境向けになります。

[Standard Tierを選択するとレプリカが作成](https://cloud.google.com/memorystore/docs/redis/high-availability?hl=ja)され、メンテやフェイルオーバーなど
でのデータ消失を防ぎます。

### 性能

ウェブUIによると次の通りです。

**最小構成時**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/dd943e93-15c0-d0d9-2534-160714d70308.png)

**最大構成時**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/992c6e85-c0f7-b0f4-1b3e-8d1df803f5ab.png)

[公式による解説はこちら](https://cloud.google.com/memorystore/docs/redis/redis-tiers?hl=ja)。
参考まで基本Tierの月額は標準Tierの半分強程度。

### 容量のリサイズ操作とその際の挙動

容量のリサイズ操作は [公式のこちらに記載](https://cloud.google.com/memorystore/docs/redis/scaling-instances) されています。
またリサイズを行った際の挙動は [公式のこちらに記載](https://cloud.google.com/memorystore/docs/redis/scaling-behavior) されています。

Basic Tierの場合、リサイズ中の読み書きはブロックされます。
またリサイズ後はデータはフラッシュされます。

Standard Tierの場合、最初にレプリカのリサイズが行われその後フェイルオーバーで
マスターとレプリカが入れ替わります。 このためほとんど停止時間がありません。

ただし、フェイルオーバー時にRedisへの接続は切断されます。
またレプリケーションは非同期で行われるため、不整合データが発生する可能性もあります。
Redisに接続するアプリケーションは、これらへの耐性が必要です。

### Standard Tierのフェイルオーバー時のアプリケーションへの影響

フェイルオーバー時の影響は [公式のこちらに記載](https://cloud.google.com/memorystore/docs/redis/high-availability#how_failover_affects_your_applications) されています。

フェイルオーバー発生時にアプリケーションからRedisへの接続は切断されます。
ただしアプリケーションはフェイルオーバー前のマスターと同じ接続先に
再接続しさえすればよいです。

Redisのフェイルオーバーは約３０秒かかります。（ゾーンの障害の場合はさらにかかるかもしれません）

### googleによるMemorystoreのメンテナンス

googleによるMemorystoreのメンテナンスは [公式のこちらに記載](https://cloud.google.com/memorystore/docs/redis/maintenance-policy) されています。

メンテナンスはだいたい四半期に一度のペースで行われるようです。
挙動はリサイズと似た感じになるようです。

### Memorystoreが提供されているリージョン

Memorystoreが提供されているリージョンは[こちらに記載されています](https://cloud.google.com/memorystore/docs/redis/regions)。

### 接続元

接続元については [公式のこちらに記載](https://cloud.google.com/memorystore/docs/redis/connecting-redis-instance) されています。 

Memorystoreと同一プロジェクト、リージョン、ネットワークのGCE、GKE、GAE/FEから接続可能です。
同一リージョン内の別ゾーンからも接続できますが、[ネットワークパフォーマンス的には
同一ゾーンの方が良いとのこと](https://cloud.google.com/memorystore/docs/redis/regions)。
> Resources in different zones within the same region can connect, however provisioning resources in the same zone improves network performance.

## Memorystoreを立ち上げてGCEから接続してみる

[公式を参考](https://cloud.google.com/memorystore/docs/redis/quickstart-console)にMemorystoreを立ち上げてGCEから接続してみます。

### Memorystoreを準備

次の通り指定してインスタンスを作成しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/632eeb60-f256-4bb4-6996-0dbaad41a0e0.png)

ウェブUIなのでざっくりですがインスタンス作成に７分程度かかりました。
出来上がったインスタンスは次の通り。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/488fa93c-7246-4347-0500-ee0d7fbe277b.png)

### GCEを準備
同一プロジェクト、同一リージョンで適当に用意してtelnetも入れます。

### 接続テスト
次の通り接続して応答が確認できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/26808/d493c695-261f-ec76-cc0a-9d6116d3d29e.png)

現場からは以上です。