このセクションでは、 バージョン 5 のRedis を使ってクラスタリングを構築する方法を紹介します。ここでは、1台のサーバー上に3つのRedis を起動しクラスタリングを構築することにしています。

まず、Redis のバージョンを確認しておきます。

[root@localhost ~]# redis-server -v
Redis server v=5.0.3 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=5194991bde1f5722
[root@localhost ~]# 
[root@localhost ~]# redis-cli -v
redis-cli 5.0.3
[root@localhost ~]# 
[root@localhost ~]# mkdir /etc/redis/cluster
[root@localhost ~]# 

Redis の設定ファイル( /etc/redis.conf )をコピーし、マスターサーバー用の Redis 設定ファイルを 準備します。ここでは、1台目のマスターサーバー用の設定ファイルを 6390.conf、 2台目の設定ファイルを 6391.conf 、3台目の設定ファイルを 6392.conf とします。

[root@localhost ~]# cp -rp /etc/redis.conf /etc/redis/cluster/6390.conf
[root@localhost ~]# cp -rp /etc/redis.conf /etc/redis/cluster/6391.conf
[root@localhost ~]# cp -rp /etc/redis.conf /etc/redis/cluster/6392.conf
[root@localhost ~]# ls -la /etc/redis/cluster/
合計 288
drwxr-xr-x. 2 root  root   108  1月 26 17:13 .
drwxr-xr-x. 3 redis root    72  1月 26 17:09 ..
-rw-r-----. 1 redis root 46783  1月 19 20:38 6390.conf
-rw-r-----. 1 redis root 46783  1月 19 20:38 6391.conf
-rw-r-----. 1 redis root 46783  1月 19 20:38 6392.conf
[root@localhost ~]# 

Redis の起動スクリプトファイル( /lib/systemd/system/redis.service )をコピーし、マスターサーバー用の Redis 起動スクリプトを準備します。ここでは、1台目のマスターサーバー用の起動スクリプトを redis_6390.service、 2台目の起動スクリプトファイルを redis_6391.service 、3台目の起動スクリプトファイルを redis_6392.service とします。

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

Redis の停止スクリプトファイル( /usr/libexec/redis-shutdown )をコピーし、マスターサーバー用の Redis 停止スクリプトを準備します。ここでは、1台目のマスターサーバー用の停止スクリプトを redis-6390-shutdown、 2台目の停止スクリプトファイルを redis-6391-shutdown 、3台目の停止スクリプトファイルを redis-6392-shutdown とします。

[root@localhost ~]# cp -p /usr/libexec/redis-shutdown /usr/libexec/redis-6390-shutdown
[root@localhost ~]# cp -p /usr/libexec/redis-shutdown /usr/libexec/redis-6391-shutdown
[root@localhost ~]# cp -p /usr/libexec/redis-shutdown /usr/libexec/redis-6392-shutdown
[root@localhost ~]# 

1台目のマスターサーバーの準備

1台目のマスターサーバー用 Redis 設定ファイル( /etc/redis/cluster/6390.conf )を編集し、以下設定します。1台目のマスターサーバーは TCP 6390 ポートを使用することにしています。

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

下記それぞれのパラメーターを変更します。

bind 192.168.24.199
port 6390
pidfile /var/run/redis_6390.pid
logfile /var/log/redis/redis_6390.log
dbfilename 6390.rdb
cluster-enabled yes
cluster-config-file nodes-6390.conf
cluster-node-timeout 15000
appendonly yes

1台目のマスターサーバー用 Redis 起動スクリプトファイル( /lib/systemd/system/redis_6390.service )を編集し、以下設定します。

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

ExecStart、ExecStop に定義する値を変更します。

ExecStart=/usr/bin/redis-server /etc/redis/cluster/6390.conf --supervised systemd
ExecStop=/usr/libexec/redis-6390-shutdown

1台目のマスターサーバー用 Redis 停止スクリプトファイル( /usr/libexec/redis-6390-shutdown )を編集し、以下設定します。

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

SERVICE_NAME、CONFIG FILE、PORT に定義する値を変更します。

if [ -z "$SERVICE_NAME" ]; then
   SERVICE_NAME=6390
fi
CONFIG_FILE="/etc/redis/cluster/$SERVICE_NAME.conf" if [ "$SERVICE_NAME" = 6390 ]; then PORT=${PORT:-6390}

1台目の Redis サービスを起動します。

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

■ 起動状態の確認
[root@localhost ~]# systemctl status redis_6390
● redis_6390.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis_6390.service; disabled; vendor preset: disabled)
   Active: active (running) since 土 2019-01-26 17:39:02 JST; 1s ago
 Main PID: 5294 (redis-server)
   CGroup: /system.slice/redis_6390.service
           └─5294 /usr/bin/redis-server 192.168.24.199:6390 [cluster]

 1月 26 17:39:02 localhost.localdomain systemd[1]: Starting Redis persistent...
 1月 26 17:39:02 localhost.localdomain systemd[1]: Started Redis persistent ...
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# 

1台目の Redis サービスの自動起動を有効化します。

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

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

2、3台目のマスターサーバーの準備

1台目のマスターサーバーの準備と同様手順で、2、3台目のマスタサーバーを準備します。2台目のマスターサーバーは TCP 6391 ポートを、3台目のマスターサーバーは TCP 6392 ポートを使用することにしています。

● 2台目の設定

[root@localhost ~]# vi /etc/redis/cluster/6391.conf 
bind 192.168.24.199
port 6391
pidfile /var/run/redis_6391.pid
logfile /var/log/redis/redis_6391.log
dbfilename 6391.rdb
cluster-enabled yes
cluster-config-file nodes-6391.conf
cluster-node-timeout 15000
appendonly yes
[root@localhost ~]# vi /lib/systemd/system/redis_6391.service 
ExecStart=/usr/bin/redis-server /etc/redis/cluster/6391.conf --supervised systemd
ExecStop=/usr/libexec/redis-6391-shutdown
[root@localhost ~]# vi /usr/libexec/redis-6391-shutdown
if [ -z "$SERVICE_NAME" ]; then
   SERVICE_NAME=6391
fi

CONFIG_FILE="/etc/redis/cluster/$SERVICE_NAME.conf"

if [ "$SERVICE_NAME" = 6391 ]; then
    PORT=${PORT:-6391}

● 3台目の設定

[root@localhost ~]# vi /etc/redis/cluster/6392.conf 
bind 192.168.24.199
port 6392
pidfile /var/run/redis_6392.pid
logfile /var/log/redis/redis_6392.log
dbfilename 6392.rdb
cluster-enabled yes
cluster-config-file nodes-6392.conf
cluster-node-timeout 15000
appendonly yes
[root@localhost ~]# vi /lib/systemd/system/redis_6392.service 
ExecStart=/usr/bin/redis-server /etc/redis/cluster/6392.conf --supervised systemd
ExecStop=/usr/libexec/redis-6392-shutdown
[root@localhost ~]# vi /usr/libexec/redis-6392-shutdown
if [ -z "$SERVICE_NAME" ]; then
   SERVICE_NAME=6392
fi

CONFIG_FILE="/etc/redis/cluster/$SERVICE_NAME.conf"

if [ "$SERVICE_NAME" = 6392 ]; then
    PORT=${PORT:-6392}

2、3台目の Redis サービスの起動と、自動起動を有効化します。

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

■ 起動状態の確認
[root@localhost ~]# systemctl status redis_6391 redis_6392
● redis_6391.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis_6391.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2019-01-26 22:50:58 JST; 4s ago
  Process: 4264 ExecStop=/usr/libexec/redis-6391-shutdown (code=exited, status=0/SUCCESS)
 Main PID: 4300 (redis-server)
   CGroup: /system.slice/redis_6391.service
           └─4300 /usr/bin/redis-server 192.168.24.199:6391 [cluster]

 1月 26 22:50:58 localhost.localdomain systemd[1]: Starting Redis persistent...
 1月 26 22:50:58 localhost.localdomain systemd[1]: Started Redis persistent ...

● redis_6392.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis_6392.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2019-01-26 22:50:58 JST; 4s ago
  Process: 4265 ExecStop=/usr/libexec/redis-6392-shutdown (code=exited, status=0/SUCCESS)
 Main PID: 4301 (redis-server)
   CGroup: /system.slice/redis_6392.service
           └─4301 /usr/bin/redis-server 192.168.24.199:6392 [cluster]

 1月 26 22:50:58 localhost.localdomain systemd[1]: Starting Redis persistent...
 1月 26 22:50:58 localhost.localdomain systemd[1]: Started Redis persistent ...
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# 
■ 自動起動の有効化
[root@localhost ~]# systemctl enable redis_6391 redis_6392
Created symlink from /etc/systemd/system/multi-user.target.wants/redis_6391.service to /usr/lib/systemd/system/redis_6391.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/redis_6392.service to /usr/lib/systemd/system/redis_6392.service.
[root@localhost ~]# 

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

クラスタリングの構成

1台目の Redis サーバーの接続し、1〜3台でクラスタリングを構成します。途中で、実行したクラスタリングの構成を設定するか確認されるので、yes と入力します。 

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6390 --cluster create 192.168.24.199:6390 192.168.24.199:6391 192.168.24.199:6392
>>> Performing hash slots allocation on 3 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
M: 6858d87d3c23a46a90b993af4ad276b24a99763e 192.168.24.199:6390
   slots:[0-5460] (5461 slots) master
M: bda32983d9ed3392350c49f90193d4ac9a88d5a7 192.168.24.199:6391
   slots:[5461-10922] (5462 slots) master
M: eddd7e2fdbe3840c3cbd0d17e5b25a2bf8f34c0f 192.168.24.199:6392
   slots:[10923-16383] (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.24.199:6390)
M: 6858d87d3c23a46a90b993af4ad276b24a99763e 192.168.24.199:6390
   slots:[0-5460] (5461 slots) master
M: bda32983d9ed3392350c49f90193d4ac9a88d5a7 192.168.24.199:6391
   slots:[5461-10922] (5462 slots) master
M: eddd7e2fdbe3840c3cbd0d17e5b25a2bf8f34c0f 192.168.24.199:6392
   slots:[10923-16383] (5461 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost ~]# 

クラスタリングを構成した各 Redis のログを確認します。Cluster state changed: ok というログが出力されていることが確認できます。

■ 1台目の出力ログ
[root@localhost ~]# tail -F /var/log/redis/redis_6390.log 
3711:M 26 Jan 2019 20:59:33.117 # Server initialized
3711:M 26 Jan 2019 20:59:33.117 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
3711:M 26 Jan 2019 20:59:33.119 * DB saved on disk
3711:M 26 Jan 2019 20:59:33.121 * DB saved on disk
3711:M 26 Jan 2019 20:59:33.122 * DB saved on disk
3711:M 26 Jan 2019 20:59:33.122 * DB loaded from append only file: 0.005 seconds
3711:M 26 Jan 2019 20:59:33.122 * Ready to accept connections
3711:M 26 Jan 2019 21:01:34.165 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
3711:M 26 Jan 2019 21:01:34.169 # IP address for this node updated to 192.168.24.199
3711:M 26 Jan 2019 21:01:39.105 # Cluster state changed: ok

■ 2台目の出力ログ
[root@localhost ~]# tail -F /var/log/redis/redis_6391.log 
3721:M 26 Jan 2019 20:59:35.281 # Server initialized
3721:M 26 Jan 2019 20:59:35.281 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
3721:M 26 Jan 2019 20:59:35.282 * DB saved on disk
3721:M 26 Jan 2019 20:59:35.284 * DB saved on disk
3721:M 26 Jan 2019 20:59:35.286 * DB saved on disk
3721:M 26 Jan 2019 20:59:35.286 * DB loaded from append only file: 0.005 seconds
3721:M 26 Jan 2019 20:59:35.286 * Ready to accept connections
3721:M 26 Jan 2019 21:01:34.165 # configEpoch set to 2 via CLUSTER SET-CONFIG-EPOCH
3721:M 26 Jan 2019 21:01:34.196 # IP address for this node updated to 192.168.24.199
3721:M 26 Jan 2019 21:01:39.079 # Cluster state changed: ok

■ 3台目の出力ログ
[root@localhost ~]# tail -F /var/log/redis/redis_6392.log 
3731:M 26 Jan 2019 20:59:37.315 # Server initialized
3731:M 26 Jan 2019 20:59:37.315 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
3731:M 26 Jan 2019 20:59:37.317 * DB saved on disk
3731:M 26 Jan 2019 20:59:37.318 * DB saved on disk
3731:M 26 Jan 2019 20:59:37.320 * DB saved on disk
3731:M 26 Jan 2019 20:59:37.320 * DB loaded from append only file: 0.005 seconds
3731:M 26 Jan 2019 20:59:37.320 * Ready to accept connections
3731:M 26 Jan 2019 21:01:34.165 # configEpoch set to 3 via CLUSTER SET-CONFIG-EPOCH
3731:M 26 Jan 2019 21:01:34.297 # IP address for this node updated to 192.168.24.199
3731:M 26 Jan 2019 21:01:39.105 # Cluster state changed: ok

クラスタリングを構成した各 Redis のクラスタの情報を確認します。クラスタリングのノード( cluster_known_nodes )が 3台、クラスタリングの状態( cluster_state )が ok であることが確認できます。

■ 1台目のクラスタ情報
[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6390 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:3
cluster_size:3
cluster_current_epoch:3
cluster_my_epoch:1
cluster_stats_messages_ping_sent:540
cluster_stats_messages_pong_sent:545
cluster_stats_messages_sent:1085
cluster_stats_messages_ping_received:543
cluster_stats_messages_pong_received:540
cluster_stats_messages_meet_received:2
cluster_stats_messages_received:1085
[root@localhost ~]# 

■ 2台目のクラスタ情報
[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6391 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:3
cluster_size:3
cluster_current_epoch:3
cluster_my_epoch:2
cluster_stats_messages_ping_sent:556
cluster_stats_messages_pong_sent:595
cluster_stats_messages_meet_sent:1
cluster_stats_messages_sent:1152
cluster_stats_messages_ping_received:594
cluster_stats_messages_pong_received:557
cluster_stats_messages_meet_received:1
cluster_stats_messages_received:1152
[root@localhost ~]# 

■ 3台目のクラスタ情報
[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6392 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:3
cluster_size:3
cluster_current_epoch:3
cluster_my_epoch:3
cluster_stats_messages_ping_sent:560
cluster_stats_messages_pong_sent:518
cluster_stats_messages_meet_sent:2
cluster_stats_messages_sent:1080
cluster_stats_messages_ping_received:518
cluster_stats_messages_pong_received:562
cluster_stats_messages_received:1080
[root@localhost ~]# 

クラスタリングを構成した各 Redis のノードの情報を確認します。各ノードでそれぞれのノードと接続ができている( connected )ことが確認できます。

■ 1台目のノードの情報
[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6390 cluster nodes
bda32983d9ed3392350c49f90193d4ac9a88d5a7 192.168.24.199:6391@16391 master - 0 1548504679522 2 connected 5461-10922
eddd7e2fdbe3840c3cbd0d17e5b25a2bf8f34c0f 192.168.24.199:6392@16392 master - 0 1548504678520 3 connected 10923-16383
6858d87d3c23a46a90b993af4ad276b24a99763e 192.168.24.199:6390@16390 myself,master - 0 1548504676000 1 connected 0-5460
[root@localhost ~]# 

■ 2台目のノードの情報
[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6391 cluster nodes
eddd7e2fdbe3840c3cbd0d17e5b25a2bf8f34c0f 192.168.24.199:6392@16392 master - 0 1548504695754 3 connected 10923-16383
bda32983d9ed3392350c49f90193d4ac9a88d5a7 192.168.24.199:6391@16391 myself,master - 0 1548504694000 2 connected 5461-10922
6858d87d3c23a46a90b993af4ad276b24a99763e 192.168.24.199:6390@16390 master - 0 1548504694752 1 connected 0-5460
[root@localhost ~]# 

■ 3台目のノードの情報
[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6392 cluster nodes
eddd7e2fdbe3840c3cbd0d17e5b25a2bf8f34c0f 192.168.24.199:6392@16392 myself,master - 0 1548504697000 3 connected 10923-16383
bda32983d9ed3392350c49f90193d4ac9a88d5a7 192.168.24.199:6391@16391 master - 0 1548504700000 2 connected 5461-10922
6858d87d3c23a46a90b993af4ad276b24a99763e 192.168.24.199:6390@16390 master - 0 1548504700764 1 connected 0-5460
[root@localhost ~]# 

クラスタリングノードへのデータ登録

1台目の Redis に接続し、key データを登録してみます。key データの登録が各マスターノードに分散されていることが確認できます。

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6390 -c
192.168.24.199:6390> set key3 value3
OK
192.168.24.199:6390> set key4 value4
-> Redirected to slot [13120] located at 192.168.24.199:6392
OK
192.168.24.199:6392> set key5 value5
-> Redirected to slot [9057] located at 192.168.24.199:6391
OK
192.168.24.199:6391> 
192.168.24.199:6391> set key6 value6
-> Redirected to slot [4866] located at 192.168.24.199:6390
OK
192.168.24.199:6390> 
192.168.24.199:6390> set key7 value7
OK
192.168.24.199:6390> set key8 value8
-> Redirected to slot [13004] located at 192.168.24.199:6392
OK
192.168.24.199:6392> 
192.168.24.199:6392> exit
[root@localhost ~]#

1台目の Redis に接続し、登録したkey データを取得してみます。各ノードに分散して登録したデータが取得できることが確認できます。

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6390 -c
192.168.24.199:6390> get key3
"value3"
192.168.24.199:6390> get key4
-> Redirected to slot [13120] located at 192.168.24.199:6392
"value4"
192.168.24.199:6392> get key5
-> Redirected to slot [9057] located at 192.168.24.199:6391
"value5"
192.168.24.199:6391> get key6
-> Redirected to slot [4866] located at 192.168.24.199:6390
"value6"
192.168.24.199:6390> get key7
"value7"
192.168.24.199:6390> get key8
-> Redirected to slot [13004] located at 192.168.24.199:6392
"value8"
192.168.24.199:6392> 

クラスタリングを構成した各 Redis のノードに登録されたキー配置状況を確認します。各ノードでキー配置が分散されていることが確認できます。

[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6390 --cluster info 192.168.24.199:6390
192.168.24.199:6390 (6858d87d...) -> 6 keys | 5461 slots | 0 slaves.
192.168.24.199:6391 (bda32983...) -> 11 keys | 5462 slots | 0 slaves.
192.168.24.199:6392 (eddd7e2f...) -> 11 keys | 5461 slots | 0 slaves.
[OK] 28 keys in 3 masters.
0.00 keys per slot on average.
[root@localhost ~]# 
[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6390 --cluster info 192.168.24.199:6391
192.168.24.199:6391 (bda32983...) -> 11 keys | 5462 slots | 0 slaves.
192.168.24.199:6390 (6858d87d...) -> 6 keys | 5461 slots | 0 slaves.
192.168.24.199:6392 (eddd7e2f...) -> 11 keys | 5461 slots | 0 slaves.
[OK] 28 keys in 3 masters.
0.00 keys per slot on average.
[root@localhost ~]# 
[root@localhost ~]# redis-cli -h 192.168.24.199 -p 6390 --cluster info 192.168.24.199:6392
192.168.24.199:6392 (eddd7e2f...) -> 11 keys | 5461 slots | 0 slaves.
192.168.24.199:6391 (bda32983...) -> 11 keys | 5462 slots | 0 slaves.
192.168.24.199:6390 (6858d87d...) -> 6 keys | 5461 slots | 0 slaves.
[OK] 28 keys in 3 masters.
0.00 keys per slot on average.
[root@localhost ~]#