パパエンジニアのポエム

奥さんと娘ちゃんへの愛が止まらない

GCEでRedisのレプリケーション組んでみた

GCE(Container-Optimized OS)を2台使って、Redisのレプリケーションを組んでみる。

Redisにおけるレプリケーションとは

RedisのレプリケーションはMaster・Slave型のレプリケーションモデル。
とある本番Redisサーバー(Master)のデータを、別のRedisサーバー(Slave)に完全にコピーする仕組みのこと。 f:id:yuki-toida:20181114142827p:plain

master/slave 各設定ファイル

master.conf

# ログレベル
loglevel debug

# ログファイル
logfile redis.log

# http://redis-documentasion-japanese.readthedocs.io/ja/latest/topics/persistence.html
save 900 1
save 300 10
save 60 10000

# AOF
appendonly no

# save file name
dbfilename dump.rdb

slave.conf

# スレーブ設定
slaveof redis-master 6379

# ログレベル
loglevel debug

# ログファイル
logfile redis.log

# http://redis-documentasion-japanese.readthedocs.io/ja/latest/topics/persistence.html
save 900 1
save 300 10
save 60 10000

# AOF
appendonly no

# save file name
dbfilename dump.rdb

ドキュメントを見ながら書けばおk。
slave.confに masterサーバーのホストを記述してあげる。

Dockerfile

何はともあれDockerfileを記述する。
ROLE引数でmaster, slaveを指定する形にした。

FROM redis:4-alpine
ARG ROLE
COPY ${ROLE}.conf /usr/local/etc/redis/redis.conf
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]

Cloud Build でビルドし、Container Registryにプッシュする

masterサーバーのコンテナをビルドし、プッシュする。
以下、master.yaml

steps:
- name: 'gcr.io/cloud-builders/docker'
  args:
  - 'build'
  - '--file=Dockerfile'
  - '--tag=asia.gcr.io/$PROJECT_ID/redis-master'
  - '--build-arg=ROLE=master'
  - '.'
images: ['asia.gcr.io/$PROJECT_ID/redis-master']
gcloud container builds submit --config=master.yaml .

slaveサーバーのコンテナをビルドし、プッシュする。
以下、slave.yaml

steps:
- name: 'gcr.io/cloud-builders/docker'
  args:
  - 'build'
  - '--file=Dockerfile'
  - '--tag=asia.gcr.io/$PROJECT_ID/redis-slave'
  - '--build-arg=ROLE=slave'
  - '.'
images: ['asia.gcr.io/$PROJECT_ID/redis-slave']
gcloud container builds submit --config=slave.yaml .

GCEのターミナルからdocker run

わざわざリモートでdocker runを行うことが正しいことかどうかはかなりあやしいけど、楽なのでやっちゃう。

masterサーバー起動

docker run --name redis-master -p 6379:6379 -v /home/redis/data:/data -d asia.gcr.io/${REGISTRY}/redis-master

slaveサーバー起動

docker run --name redis-slave -p 6379:6379 -v /home/redis/data:/data -d asia.gcr.io/${REGISTRY}/redis-slave

動作確認

各サーバーにリモートでログインして、データを確認するだけ。
masterサーバーで値を書き込んで、slaveサーバーにもコピーされてるか確認する。

docker exec -it redis-master /bin/sh
docker exec -it redis-slave /bin/sh