👬
Docker環境でRedisのレプリケーションを試す
ローカル(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窓開き、それぞれ以下の状態にして観察する
- Primaryコンテナのredis-cli(Primary操作用)
- Replicaコンテナのredis-cli(Replica操作用)
- Primaryコンテナのredis-cli → monitor(Primaryログ表示用)
- 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