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