このセクションでは、Redis を冗長化するための設定について紹介します。ここでは、1台のホストマシン上に3つの Redis サーバーを立ち上げ、Master 1台、Slave 2台の構成で冗長化します。

Redis 設定ファイルの作成

1台のホストマシン上に 3つの Redis サーバーを起動するために、Redis 設定ファイルを3つ複製します。ここでは、設定ファイルを識別し易いように通信ポート番号名で複製しています。

[root@localhost ~]# cp -p /etc/redis.conf /etc/redis/6381.conf

[root@localhost ~]# cp -p /etc/redis.conf /etc/redis/6382.conf

[root@localhost ~]# cp -p /etc/redis.conf /etc/redis/6383.conf

6381.conf ファイルを編集し、以下設定を変更します。ここでは、6381.conf を Master の設定ファイルとしています。

[root@localhost ~]# vi /etc/redis/6381.conf 

Master 用に以下設定を変更します。

■ 使用するポート番号の変更
port 6379
↓
port 6381

■ プロセスファイルの変更
pidfile /var/run/redis_6379.pid
↓
pidfile /var/run/redis_6381.pid

■ ログファイルの変更
logfile /var/log/redis/redis.log
↓
logfile /var/log/redis/redis_6381.log

■ データ永続化のための dump.rdb の変更
dbfilename dump.rdb
↓
dbfilename 6381.rdb

■ Master のパスワード設定
# requirepass foobared
↓
requirepass foobared

6382.conf と 6383.confファイルを編集し、以下それぞれ設定します。ここでは、6382.conf と 6383.conf を Slave の設定ファイルとしています。

[root@localhost ~]# vi /etc/redis/6382.conf
■ 使用するポート番号の変更
port 6379
↓
port 6382

■ プロセスファイルの変更
pidfile /var/run/redis_6379.pid
↓
pidfile /var/run/redis_6382.pid

■ ログファイルの変更
logfile /var/log/redis/redis.log
↓
logfile /var/log/redis/6382.log

■ データ永続化のための dump.rdb の変更
dbfilename dump.rdb
↓
dbfilename 6382.rdb

■ Master のパスワードを指定
# masterauth <master-password>
↓
masterauth foobared

■ Slave に関わる設定
# slaveof <masterip> <masterport>
↓
slaveof 192.168.24.199 6381
[root@localhost ~]# vi /etc/redis/6383.conf 
■ 使用するポート番号の変更
port 6379
↓
port 6383

■ プロセスファイルの変更
pidfile /var/run/redis_6379.pid
↓
pidfile /var/run/redis_6383.pid

■ ログファイルの変更
logfile /var/log/redis/redis.log
↓
logfile /var/log/redis/6383.log

■ データ永続化のための dump.rdb の変更
dbfilename dump.rdb
↓
dbfilename 6383.rdb

■ Master のパスワードを指定
# masterauth <master-password>
↓
masterauth foobared

■ Slave に関わる設定
# slaveof <masterip> <masterport>
↓
slaveof 192.168.24.199 6381

Redis 起動スクリプトの作成

Master、Slave それぞれの Redis 起動スクリプトを複製します。ここでは、redis_1.service を Master、redis_2.service と redis_3.service を Slave の移動スクリプトとします。

[root@localhost ~]# cp -p /lib/systemd/system/redis.service /lib/systemd/system/redis_1.service 

[root@localhost ~]# cp -p /lib/systemd/system/redis.service /lib/systemd/system/redis_2.service 

[root@localhost ~]# cp -p /lib/systemd/system/redis.service /lib/systemd/system/redis_3.service 

Master 用の起動スクリプトを編集し、以下設定を変更します。

[root@localhost ~]# vi /lib/systemd/system/redis_1.service 

[ Service ] セクションの ExecStart、ExecStop パラメーターを変更します。

[Service]
ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
↓
ExecStart=/usr/bin/redis-server /etc/redis/6381.conf --supervised systemd

ExecStop=/usr/libexec/redis-shutdown
↓
ExecStop=/usr/libexec/redis-shutdown-1

Slave 用の起動スクリプトを編集し、以下設定を変更します。

[root@localhost ~]# vi /lib/systemd/system/redis_2.service 
[Service]
ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
↓
ExecStart=/usr/bin/redis-server /etc/redis/6382.conf --supervised systemd

ExecStop=/usr/libexec/redis-shutdown
↓
ExecStop=/usr/libexec/redis-shutdown-2
[root@localhost ~]# vi /lib/systemd/system/redis_3.service 
[Service]
ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
↓
ExecStart=/usr/bin/redis-server /etc/redis/6383.conf --supervised systemd

ExecStop=/usr/libexec/redis-shutdown
↓
ExecStop=/usr/libexec/redis-shutdown-3

Redis 停止スクリプトの作成

Master、Slave それぞれの Redis 停止スクリプトを複製します。ここでは、redis-shutdown-1 を Master、redis-shutdown-2 と redis-shutdown-3 を Slave の停止スクリプトとします。

[root@localhost ~]# cp -p /usr/libexec/redis-shutdown /usr/libexec/redis-shutdown-1

[root@localhost ~]# cp -p /usr/libexec/redis-shutdown /usr/libexec/redis-shutdown-2

[root@localhost ~]# cp -p /usr/libexec/redis-shutdown /usr/libexec/redis-shutdown-3

Master 用の停止スクリプトを編集し、以下設定を変更します。

[root@localhost ~]# vi /usr/libexec/redis-shutdown-1

下記それぞれ設定を変更します。

■ サービス名の変更
SERVICE_NAME=redis
↓
SERVICE_NAME=6381

■ 参照するコンフィグファイルの変更
CONFIG_FILE="/etc/$SERVICE_NAME.conf"
↓
CONFIG_FILE="/etc/redis/$SERVICE_NAME.conf"

■ 停止するプロセスポート番号の変更
if [ "$SERVICE_NAME" = redis ]; then
    PORT=${PORT:-6379}
↓
if [ "$SERVICE_NAME" = 6381 ]; then
    PORT=${PORT:-6381}

Slave 用の停止スクリプトを編集し、以下設定を変更します。

[root@localhost ~]# vi /usr/libexec/redis-shutdown-2
■ サービス名の変更
SERVICE_NAME=redis
↓
SERVICE_NAME=6382

■ 参照するコンフィグファイルの変更
CONFIG_FILE="/etc/$SERVICE_NAME.conf"
↓
CONFIG_FILE="/etc/redis/$SERVICE_NAME.conf"

■ 停止するプロセスポート番号の変更
if [ "$SERVICE_NAME" = redis ]; then
    PORT=${PORT:-6379}
↓
if [ "$SERVICE_NAME" = 6382 ]; then
    PORT=${PORT:-6382}
[root@localhost ~]# vi /usr/libexec/redis-shutdown-3
■ サービス名の変更
SERVICE_NAME=redis
↓
SERVICE_NAME=6383

■ 参照するコンフィグファイルの変更
CONFIG_FILE="/etc/$SERVICE_NAME.conf"
↓
CONFIG_FILE="/etc/redis/$SERVICE_NAME.conf"

■ 停止するプロセスポート番号の変更
if [ "$SERVICE_NAME" = redis ]; then
    PORT=${PORT:-6379}
↓
if [ "$SERVICE_NAME" = 6383 ]; then
    PORT=${PORT:-6383}

Redis の起動

Master の起動します。

■ 起動
[root@localhost ~]# systemctl start redis_1
[root@localhost ~]# 

■ 起動状態の確認 
[root@localhost ~]# systemctl status redis_1
● redis_1.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis_1.service; disabled; vendor preset: disabled)
   Active: active (running) since 日 2019-01-20 03:31:50 JST; 1s ago
 Main PID: 4594 (redis-server)
   CGroup: /system.slice/redis_1.service
           └─4594 /usr/bin/redis-server 192.168.24.199:6381

 1月 20 03:31:50 localhost.localdomain systemd[1]: Starting Redis persistent...
 1月 20 03:31:50 localhost.localdomain systemd[1]: Started Redis persistent ...
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# 

Slave を起動します。

■ 起動
[root@localhost ~]# systemctl start redis_2
[root@localhost ~]# 

■ 起動状態の確認
[root@localhost ~]# systemctl status redis_2
● redis_2.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis_2.service; disabled; vendor preset: disabled)
   Active: active (running) since 日 2019-01-20 03:38:58 JST; 4s ago
 Main PID: 4636 (redis-server)
   CGroup: /system.slice/redis_2.service
           └─4636 /usr/bin/redis-server 192.168.24.199:6382

 1月 20 03:38:58 localhost.localdomain systemd[1]: Starting Redis persistent...
 1月 20 03:38:58 localhost.localdomain systemd[1]: Started Redis persistent ...
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# 
■ 起動
[root@localhost ~]# systemctl start redis_3
[root@localhost ~]#

 ■ 起動状態の確認
[root@localhost ~]# systemctl status redis_3
● redis_3.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis_3.service; disabled; vendor preset: disabled)
   Active: active (running) since 日 2019-01-20 03:41:48 JST; 3s ago
 Main PID: 4652 (redis-server)
   CGroup: /system.slice/redis_3.service
           └─4652 /usr/bin/redis-server 192.168.24.199:6383

 1月 20 03:41:48 localhost.localdomain systemd[1]: Starting Redis persistent...
 1月 20 03:41:48 localhost.localdomain systemd[1]: Started Redis persistent ...
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# 

Redis の自動起動設定

Master、Slave の自動起動設定をします。

■ 自動起動の有効化
[root@localhost ~]# systemctl enable redis_1 redis_2 redis_3
Created symlink from /etc/systemd/system/multi-user.target.wants/redis_1.service to /usr/lib/systemd/system/redis_1.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/redis_2.service to /usr/lib/systemd/system/redis_2.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/redis_3.service to /usr/lib/systemd/system/redis_3.service.
[root@localhost ~]# 

■ 自動起動の状態確認 
[root@localhost ~]# systemctl is-enabled redis_1 redis_2 redis_3
enabled
enabled
enabled
[root@localhost ~]# 

Redis 冗長化の動作確認

Master の役割を確認します。role が master であることが確認できます。

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6381 -a foobared info | egrep 'role'
role:master
[root@localhost ~]# 

Slave の役割を確認します。role が slave であることが確認できます。

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6382 -a foobared info | egrep 'role'
role:slave
[root@localhost ~]# 

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6383 -a foobared info | egrep 'role'
role:slave
[root@localhost ~]# 

Master で key(キー)をセットします。ここでは、signal というキーに 値 “on” をセットしています。

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6381 -a foobared set signal on
OK
[root@localhost ~]# 

Master で signal キーの値を取得します。 ここでは、セットした “on” の値が取得できていることが確認できます。

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6381 -a foobared get signal
"on"
[root@localhost ~]# 

Slave で signal キーの値を取得します。 ここでは、Master でセットした “on” の値が取得でき、Master から Slave へ signal キーと値が同期されていることが確認できます。

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6382 -a foobared get signal
"on"
[root@localhost ~]# 

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6383 -a foobared get signal
"on"
[root@localhost ~]# 

Master で key(キー)を削除します。ここでは、signal というキーを削除しています。

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6381 -a foobared del signal
(integer) 1
[root@localhost ~]# 

Master で signal キーの値を取得します。 ここでは、signal キーが取得できず削除されていることが確認できます。

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6381 -a foobared get signal
(nil)
[root@localhost ~]# 

Slave で signal キーの値を取得します。 ここでは、signal キーが取得できず、Master での削除が同期されていることが確認できます。

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6382 -a foobared get signal
(nil)
[root@localhost ~]# 
[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6383 -a foobared get signal
(nil)
[root@localhost ~]#