Ubuntu Serverに Redisのクラスタ環境を作ってみます。
「Redisクラスタ 1」では、これから環境構築する上で出てくる用語について説明しました。
ここではよく分からないながらも、まずは環境を作ってしまいます。
1.環境
サーバーには以下のものを使います。
2024年1月26日時点での最新版です。
- Ubuntu Server 22.04.3
- Redis 7.2.4
このセットを以下の通り 6つ作ります。
マスターノードが 3台、レプリカーノードが 3台の構成にします。
図ではこういう構成。
以下のホスト名と IPアドレスで Redisサーバーを作りますが、どれがマスター/レプリカになるかは現時点ではわかりません。
マシン名 | IPアドレス | |
---|---|---|
1 | redis1 | 192.168.1.156 |
2 | redis2 | 192.168.1.157 |
3 | redis3 | 192.168.1.158 |
4 | redis4 | 192.168.1.159 |
5 | redis5 | 192.168.1.160 |
6 | redis6 | 192.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.
できました。
コマンド出力を見ると、以下のようにマスターとレプリカが割り振られたようです。
必ずしも綺麗に並ぶわけではなさそう。
スロットの割り振りはこのように。
こちらも綺麗に並ぶわけはなさそう。
これで 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クラスタに対して実際にデータを書いたり読んだりしてみようと思います。