👬

Docker環境でRedisのレプリケーションを試す

2024/11/16に公開

ローカル(Docker)でRedisのレプリケーションを試す機会があったのでメモ

docker-compose.ymlを作成

Redis用コンテナを2つ、PrimaryとReplicaとして定義する
ポイントは、replica用コンテナのcommandでredis-serverに渡している--replicaof redis-primary 6379

services:
  redis-primary:
    image: redis:latest
    container_name: redis-primary
    ports:
      - "6379:6379"
    networks:
      - redis-network

  redis-read-replica:
    image: redis:latest
    container_name: redis-read-replica
    ports:
      - "6380:6379"
    networks:
      - redis-network
    command: redis-server --replicaof redis-primary 6379

networks:
  redis-network:

以前はreplicaofではなくslaveofというオプションだったらしい

レプリケーション設定されていることを確認

% docker compose up -d

それぞれのコンテナに入り、redis-cliで情報を見る
primary側

% docker exec -it redis-primary redis-cli
127.0.0.1:6379> info
// 中略
# Replication
role:master
connected_slaves:1

replica側

% docker exec -it redis-read-replica redis-cli
127.0.0.1:6379> info
// 中略
# Replication
role:slave
master_host:redis-primary

動作確認

terminalを4窓開き、それぞれ以下の状態にして観察する

  1. Primaryコンテナのredis-cli(Primary操作用)
  2. Replicaコンテナのredis-cli(Replica操作用)
  3. Primaryコンテナのredis-cli → monitor(Primaryログ表示用)
  4. Replicaコンテナのredis-cli → monitor(Replicaログ表示用)

Primaryを更新してみる

SET

# Primary操作用terminal
127.0.0.1:6379> set key1 value1
OK
# Replica操作用terminal
# PrimaryでSETした値が入っている
127.0.0.1:6379> keys *
1) "key1"
# Primaryログ表示用terminal
1731719856.326177 [0 127.0.0.1:32846] "set" "key1" "value1"
# Replicaログ表示用terminal
# レプリケーションされている
1731719856.327605 [0 172.21.0.3:6379] "set" "key1" "value1"

DEL

# Primary操作用terminal
127.0.0.1:6379> del key1 value1
(integer) 1
# Replica操作用terminal
# PrimaryでDELされた結果が反映されている
127.0.0.1:6379> keys *
(empty array)
# Primaryログ表示用terminal
1731720158.653135 [0 127.0.0.1:32846] "del" "key1" "value1"
# Replicaログ表示用terminal
# レプリケーションされている
1731720158.653727 [0 172.21.0.3:6379] "del" "key1" "value1"

Replicaを更新しようとする

更新系のコマンドは拒否される

# Replica操作用terminal
127.0.0.1:6379> set key1 value1
(error) READONLY You can't write against a read only replica.

127.0.0.1:6379> flushdb
(error) READONLY You can't write against a read only replica.

Discussion