このセクションでは、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 ~]#