お金をかけずにサーバーの勉強をしよう

Redisクラスタ 2

2024年1月26日

メニューへ戻る

Ubuntu Serverに Redisのクラスタ環境を作ってみます。

Redisクラスタ 1」では、これから環境構築する上で出てくる用語について説明しました。

ここではよく分からないながらも、まずは環境を作ってしまいます。


1.環境

サーバーには以下のものを使います。
2024年1月26日時点での最新版です。

このセットを以下の通り 6つ作ります。
マスターノードが 3台、レプリカーノードが 3台の構成にします。

図ではこういう構成。
サーバー構成 1

以下のホスト名と IPアドレスで Redisサーバーを作りますが、どれがマスター/レプリカになるかは現時点ではわかりません。

マシン名IPアドレス
1redis1192.168.1.156
2redis2192.168.1.157
3redis3192.168.1.158
4redis4192.168.1.159
5redis5192.168.1.160
6redis6192.168.1.161

6つとも VMware Workstation Playerの仮想マシンとして作りますが、1つあたり 4GBのメモリを割り当てるつもりなので、これだけで 24GBものメモリが必要です。
メモリをもっと積める新しい PCが欲しいところ…。

まず [redis1]サーバーだけ以下の手順で作りました。
Ubuntu Linux Serverをインストール
Ubuntu Serverの初期設定

その後残りの 5つを以下の手順で作りました。
仮想OSをコピーして作る
Ubuntu 22.04の固定IP変更
Ubuntu Serverの初期設定」(のホスト名変更)

そして Redisのインストールは以下の手順で。
Redisインストール

6つのサーバーができた所から以降の作業に入る前提となっています。


2.Redisクラスタを構築する

手順は以下に書いてありますので、これに従ってやっていきます。
Scale with Redis Cluster

この中で「Requirements to create a Redis Cluster」という段落に書いてある作業を行いますが、このドキュメントの例は 1つのサーバー内に 6つの Redisを立ち上げる形になっていますので、以降はちゃんと 6つのサーバーを使う形に合わせて作業内容を変えています。

例として [redis1]サーバーの作業として書きますが、[redis2]サーバー〜 [redis6]サーバーまで同じことをします。

インストール時に Redisにバインドする IPアドレスを [0.0.0.0] にするときに変更した [/etc/redis/redis.conf]ファイルを編集します。

protected-mode yes
               ↓
protected-mode no  ← 認証なしで他のノードからアクセスさせるよう[no]に変えますが、本番では[yes]のままにして、ちゃんとユーザーを設定すべきでしょう。

#cluster-enabled yes
↓
cluster-enabled yes  ← コメントアウト[#]を外して有効化します。

#cluster-node-timeout 15000
↓
cluster-node-timeout 5000  ← コメントアウト[#]を外して有効化し、5000(ms)に変更します。

appendonly no
           ↓
appendonly yes  ← yesに変えます。

変更内容を反映させるため、[redis-server]サービスを再起動します。

subro@redis1:~$ sudo systemctl restart redis-server

6つの Redisサーバーを 1つのクラスタとしてまとめます。
サーバーのどれか 1つで良く、どれでも良いようなので、 [redis1]サーバーでやりました。
コマンド末尾の [--cluster-replicas 1] により、各マスターノードにレプリカノードが 1つずつ作られます。

subro@redis1:~$ redis-cli --cluster create 192.168.1.156:6379 192.168.1.157:6379 192.168.1.158:6379 192.168.1.159:6379 192.168.1.160:6379 192.168.1.161:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.1.160:6379 to 192.168.1.156:6379
Adding replica 192.168.1.161:6379 to 192.168.1.157:6379
Adding replica 192.168.1.159:6379 to 192.168.1.158:6379
M: b6cc0a3aaddea023672e913070ef8f906dc353bc 192.168.1.156:6379
   slots:[0-5460] (5461 slots) master
M: 9260c0c69d53b48b7cd00fa81c05349bf9c9b979 192.168.1.157:6379
   slots:[5461-10922] (5462 slots) master
M: 840b3a45d130e40c02f47bfd2765510aa4db1c92 192.168.1.158:6379
   slots:[10923-16383] (5461 slots) master
S: 9cef886d91c9f4eb6b9ea2437b1187c9838fe91c 192.168.1.159:6379
   replicates 840b3a45d130e40c02f47bfd2765510aa4db1c92
S: 0d22119ac60324251935a01af50514b117053b94 192.168.1.160:6379
   replicates b6cc0a3aaddea023672e913070ef8f906dc353bc
S: 8587523a96c94b0480f56c5b431e818f9a13cff2 192.168.1.161:6379
   replicates 9260c0c69d53b48b7cd00fa81c05349bf9c9b979
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.1.156:6379)
M: b6cc0a3aaddea023672e913070ef8f906dc353bc 192.168.1.156:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 8587523a96c94b0480f56c5b431e818f9a13cff2 192.168.1.161:6379
   slots: (0 slots) slave
   replicates 9260c0c69d53b48b7cd00fa81c05349bf9c9b979
M: 840b3a45d130e40c02f47bfd2765510aa4db1c92 192.168.1.158:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 0d22119ac60324251935a01af50514b117053b94 192.168.1.160:6379
   slots: (0 slots) slave
   replicates b6cc0a3aaddea023672e913070ef8f906dc353bc
M: 9260c0c69d53b48b7cd00fa81c05349bf9c9b979 192.168.1.157:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 9cef886d91c9f4eb6b9ea2437b1187c9838fe91c 192.168.1.159:6379
   slots: (0 slots) slave
   replicates 840b3a45d130e40c02f47bfd2765510aa4db1c92
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

できました。

コマンド出力を見ると、以下のようにマスターとレプリカが割り振られたようです。
必ずしも綺麗に並ぶわけではなさそう。
サーバー構成 2

スロットの割り振りはこのように。
こちらも綺麗に並ぶわけはなさそう。
スロット配置

これで Redisのクラスタ環境ができました。


3.Redisクラスタが利用するポート

ssコマンドで見てみました。
[redis1] 〜 [redis6] まで同じでしたので、[redis1]のを載せます。

subro@redis1:~$ sudo ss -lntp4
State      Recv-Q     Send-Q         Local Address:Port          Peer Address:Port     Process
LISTEN     0          4096           127.0.0.53%lo:53                 0.0.0.0:*         users:(("systemd-resolve",pid=870,fd=14))
LISTEN     0          128                  0.0.0.0:22                 0.0.0.0:*         users:(("sshd",pid=941,fd=3))
LISTEN     0          511                  0.0.0.0:16379              0.0.0.0:*         users:(("redis-server",pid=893,fd=8))
LISTEN     0          511                  0.0.0.0:6379               0.0.0.0:*         users:(("redis-server",pid=893,fd=7))

[6379/tcp] がデータを書いたり読んだりするためのポートで、Redisのインストールで自動的に割り振られたものです。

[16379/tcp] がノード間でノードの情報をやりとりするためのポートで、上のポートに 10000を足したものになるとマニュアルにありました。


==========
6つもサーバーがあるので面倒臭かったのはありますが、そんなに手間をかけずに作ることはできました。

次回「Redisクラスタ 3」では、クライアントから Redisクラスタに対して実際にデータを書いたり読んだりしてみようと思います。