この記事では、Redis クラスターの構成と管理について詳しく説明します (コード付き)。一定の参考価値があります。必要な友人は参照できます。お役に立てれば幸いです。
Redis はバージョン 3.0 からクラスターのサポートを開始し、中間バージョンでの継続的な更新と最適化を経て、最新バージョンのクラスター機能は非常に完成しました。この記事では、Redis のバージョンは 5.0.4、オペレーティング システムは Kirin (基本的に Centos カーネルと同じ) で、Redis クラスターを構築するプロセスと構成方法を簡単に紹介します。
1. Redis クラスターの原理
Redis クラスターは、複数の Redis ノード間でデータ共有 を提供するアセンブリです。クラスター ノードは同じものを共有します。分散型ネットワークが構築され、クラスター内の各ノードは同一の ID を持ち、各ノードは独自のデータとクラスターのステータスを保存します。 ノードは、Gossip プロトコルを使用して と通信し、ノードのステータス情報の同期を確保します。
Redis クラスター データはパーティションを通じて管理され、各ノードはクラスター データのサブセットを保存します。データは、従来のコンシステント ハッシュとは異なる ハッシュ スロット
と呼ばれる方法を使用して割り当てられます。 Redis クラスターには 16384 のハッシュ スロットがあり、各キーは CRC16 チェックとモジュロ 16384 を通過して、どのスロットを配置するかを決定します。
一部のノードに障害が発生した場合、またはほとんどのノードが通信できなくなった場合でもクラスターを引き続き使用できるようにするために、クラスターはマスター/スレーブ レプリケーション モデルを使用します。データの読み取り時には、コンシステント ハッシュ アルゴリズムに従って、対応するマスター ノードからデータが取得され、マスターがハングアップすると、対応するスレーブ ノードがマスターとして動作するように起動されます。
2. 環境準備
ここでは、PC 上にマスター 3 台、スレーブ 3 台の Redis クラスターを構築します。
/opt/ ディレクトリに新しいフォルダー rediscluster を作成し、クラスター ノード ディレクトリを保存します。
次に、server10、server11、server20、server21、server30、およびserver31の6つのフォルダーをそれぞれ作成して、6つのredisノードを準備します。これらのノードは、server10でそれぞれ6379、6380、6381、6382、6383、および6384ポートを使用します。
port 6379 daemonize yes pidfile /var/run/redis_6379.pid cluster-enabled yes cluster-node-timeout 15000 cluster-config-file nodes-6379.conf
他のノードは、ポートとファイル名を変更し、順番に構成するだけで済みます。構成が完了したら、これらのノードを起動します。
[root@localhost rediscluster]# ./server10/redis-server ./server10/redis.conf & [root@localhost rediscluster]# ./server11/redis-server ./server11/redis.conf & [root@localhost rediscluster]# ./server20/redis-server ./server20/redis.conf & [root@localhost rediscluster]# ./server21/redis-server ./server21/redis.conf & [root@localhost rediscluster]# ./server30/redis-server ./server30/redis.conf & [root@localhost rediscluster]# ./server31/redis-server ./server31/redis.conf &
起動ステータスを確認します:
[root@localhost rediscluster]# ps -ef|grep redis root 11842 1 0 15:03 ? 00:00:12 ./server10/redis-server 127.0.0.1:6379 [cluster] root 11950 1 0 15:03 ? 00:00:13 ./server11/redis-server 127.0.0.1:6380 [cluster] root 12074 1 0 15:04 ? 00:00:13 ./server20/redis-server 127.0.0.1:6381 [cluster] root 12181 1 0 15:04 ? 00:00:12 ./server21/redis-server 127.0.0.1:6382 [cluster] root 12297 1 0 15:04 ? 00:00:12 ./server30/redis-server 127.0.0.1:6383 [cluster] root 12404 1 0 15:04 ? 00:00:12 ./server31/redis-server 127.0.0.1:6384 [cluster]
3. クラスター構成
は非常に簡単です: redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1 :6382 127.0.0.1:6383 127.0.0.1:6384 --cluster -replicas 1
##ここで、-replicas 1 はマスター ノードごとに 1 つのスレーブ ノードを意味します [root@localhost rediscluster]# ./server10/redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --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 127.0.0.1:6383 to 127.0.0.1:6379
Adding replica 127.0.0.1:6384 to 127.0.0.1:6380
Adding replica 127.0.0.1:6382 to 127.0.0.1:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: efa84a74525749b8ea20585074dda81b852e9c29 127.0.0.1:6379
slots:[0-5460] (5461 slots) master
M: 63e20c75984e493892265ddd2a441c81bcdc575c 127.0.0.1:6380
slots:[5461-10922] (5462 slots) master
M: d9a79ed6204e558b2fcee78ea05218b4de006acd 127.0.0.1:6381
slots:[10923-16383] (5461 slots) master
S: 0469ec03b43e27dc2b7b4eb24de34e10969e3adf 127.0.0.1:6382
replicates 63e20c75984e493892265ddd2a441c81bcdc575c
S: fd8ea61503e7c9b6e950894c0da41aed3ee19e7e 127.0.0.1:6383
replicates d9a79ed6204e558b2fcee78ea05218b4de006acd
S: ddebc3ca467d15c7d25125e4e16bcc5576a13699 127.0.0.1:6384
replicates efa84a74525749b8ea20585074dda81b852e9c29
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 127.0.0.1:6379)
M: efa84a74525749b8ea20585074dda81b852e9c29 127.0.0.1:6379
slots:[0-5460] (5461 slots) master
additional replica(s)
M: d9a79ed6204e558b2fcee78ea05218b4de006acd 127.0.0.1:6381
slots:[10923-16383] (5461 slots) master
additional replica(s)
S: 0469ec03b43e27dc2b7b4eb24de34e10969e3adf 127.0.0.1:6382
slots: (0 slots) slave
replicates 63e20c75984e493892265ddd2a441c81bcdc575c
S: ddebc3ca467d15c7d25125e4e16bcc5576a13699 127.0.0.1:6384
slots: (0 slots) slave
replicates efa84a74525749b8ea20585074dda81b852e9c29
M: 63e20c75984e493892265ddd2a441c81bcdc575c 127.0.0.1:6380
slots:[5461-10922] (5462 slots) master
additional replica(s)
S: fd8ea61503e7c9b6e950894c0da41aed3ee19e7e 127.0.0.1:6383
slots: (0 slots) slave
replicates d9a79ed6204e558b2fcee78ea05218b4de006acd
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
作成が完了し、マスター ノードとスレーブ ノードが次のように割り当てられました: Adding replica 127.0.0.1:6383 to 127.0.0.1:6379
Adding replica 127.0.0.1:6384 to 127.0.0.1:6380
Adding replica 127.0.0.1:6382 to 127.0.0.1:6381
4. 6379 クライアント経由で接続した後にクラスター テスト
がテストされましたが、6381:
[root@localhost rediscluster]# ./server10/redis-cli -h 127.0.0.1 -c -p 6379 127.0.0.1:6379> set foo bar -> Redirected to slot [12182] located at 127.0.0.1:6381 OK 127.0.0.1:6381> get foo "bar"
にリダイレクトされたことが判明しました。 6381 テスト: [root@localhost rediscluster]# ./server10/redis-cli -h 127.0.0.1 -c -p 6381
127.0.0.1:6381> get foo
"bar"
結果は同じで、クラスター構成が正常であることを示しています。
5. クラスター ノードの拡張
rediscluster ディレクトリに、2 つの新しいディレクトリ server40 と server41 を追加します。 、2 つの新しい Redis ノードを追加し、2 つのポート 6385 と 6386 を構成します。新しいマスター ノードとして 6385 を使用し、スレーブ ノードとして 6386 を使用して、ノードを開始します:
[root@localhost server41]# ps -ef|grep redis root 11842 1 0 15:03 ? 00:00:18 ./server10/redis-server 127.0.0.1:6379 [cluster] root 11950 1 0 15:03 ? 00:00:19 ./server11/redis-server 127.0.0.1:6380 [cluster] root 12074 1 0 15:04 ? 00:00:18 ./server20/redis-server 127.0.0.1:6381 [cluster] root 12181 1 0 15:04 ? 00:00:18 ./server21/redis-server 127.0.0.1:6382 [cluster] root 12297 1 0 15:04 ? 00:00:17 ./server30/redis-server 127.0.0.1:6383 [cluster] root 12404 1 0 15:04 ? 00:00:18 ./server31/redis-server 127.0.0.1:6384 [cluster] root 30563 1 0 18:01 ? 00:00:00 ./redis-server 127.0.0.1:6385 [cluster] root 30582 1 0 18:02 ? 00:00:00 ./redis-server 127.0.0.1:6386 [cluster]
マスター ノードを追加します: [root@localhost server41]# ./redis-cli --cluster add-node 127.0.0.1:6385 127.0.0.1:6379
>>> Adding node 127.0.0.1:6385 to cluster 127.0.0.1:6379
>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: efa84a74525749b8ea20585074dda81b852e9c29 127.0.0.1:6379
slots:[0-5460] (5461 slots) master
additional replica(s)
M: d9a79ed6204e558b2fcee78ea05218b4de006acd 127.0.0.1:6381
slots:[10923-16383] (5461 slots) master
additional replica(s)
S: 0469ec03b43e27dc2b7b4eb24de34e10969e3adf 127.0.0.1:6382
slots: (0 slots) slave
replicates 63e20c75984e493892265ddd2a441c81bcdc575c
S: ddebc3ca467d15c7d25125e4e16bcc5576a13699 127.0.0.1:6384
slots: (0 slots) slave
replicates efa84a74525749b8ea20585074dda81b852e9c29
M: 63e20c75984e493892265ddd2a441c81bcdc575c 127.0.0.1:6380
slots:[5461-10922] (5462 slots) master
additional replica(s)
S: fd8ea61503e7c9b6e950894c0da41aed3ee19e7e 127.0.0.1:6383
slots: (0 slots) slave
replicates d9a79ed6204e558b2fcee78ea05218b4de006acd
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:6385 to make it join the cluster.
[OK] New node added correctly.
ノード リストを表示します: [root@localhost server41]# ./redis-cli
127.0.0.1:6379> cluster nodes
22e8a8e97d6f7cc7d627e577a986384d4d181a4f 127.0.0.1:6385@16385 master - 0 1555064037664 0 connected
efa84a74525749b8ea20585074dda81b852e9c29 127.0.0.1:6379@16379 myself,master - 0 1555064036000 1 connected 0-5460
d9a79ed6204e558b2fcee78ea05218b4de006acd 127.0.0.1:6381@16381 master - 0 1555064038666 3 connected 10923-16383
0469ec03b43e27dc2b7b4eb24de34e10969e3adf 127.0.0.1:6382@16382 slave 63e20c75984e493892265ddd2a441c81bcdc575c 0 1555064035000 4 connected
ddebc3ca467d15c7d25125e4e16bcc5576a13699 127.0.0.1:6384@16384 slave efa84a74525749b8ea20585074dda81b852e9c29 0 1555064037000 6 connected
63e20c75984e493892265ddd2a441c81bcdc575c 127.0.0.1:6380@16380 master - 0 1555064037000 2 connected 5461-10922
fd8ea61503e7c9b6e950894c0da41aed3ee19e7e 127.0.0.1:6383@16383 slave d9a79ed6204e558b2fcee78ea05218b4de006acd 0 1555064037000 5 connected
スレーブ ノードの追加 :
[root@localhost server41]# ./redis-cli --cluster add-node 127.0.0.1:6386 127.0.0.1:6379 --cluster-slave --cluster-master-id 22e8a8e97d6f7cc7d627e577a986384d4d181a4f >>> Adding node 127.0.0.1:6386 to cluster 127.0.0.1:6379 >>> Performing Cluster Check (using node 127.0.0.1:6379) M: efa84a74525749b8ea20585074dda81b852e9c29 127.0.0.1:6379 slots:[0-5460] (5461 slots) master additional replica(s) M: 22e8a8e97d6f7cc7d627e577a986384d4d181a4f 127.0.0.1:6385 slots: (0 slots) master M: d9a79ed6204e558b2fcee78ea05218b4de006acd 127.0.0.1:6381 slots:[10923-16383] (5461 slots) master additional replica(s) S: 0469ec03b43e27dc2b7b4eb24de34e10969e3adf 127.0.0.1:6382 slots: (0 slots) slave replicates 63e20c75984e493892265ddd2a441c81bcdc575c S: ddebc3ca467d15c7d25125e4e16bcc5576a13699 127.0.0.1:6384 slots: (0 slots) slave replicates efa84a74525749b8ea20585074dda81b852e9c29 M: 63e20c75984e493892265ddd2a441c81bcdc575c 127.0.0.1:6380 slots:[5461-10922] (5462 slots) master additional replica(s) S: fd8ea61503e7c9b6e950894c0da41aed3ee19e7e 127.0.0.1:6383 slots: (0 slots) slave replicates d9a79ed6204e558b2fcee78ea05218b4de006acd [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 127.0.0.1:6386 to make it join the cluster. Waiting for the cluster to join >>> Configure node as replica of 127.0.0.1:6385. [OK] New node added correctly.
追加が成功したら、新しいノードにデータを割り当てます:
[root@localhost server41]# ./redis-cli --cluster reshard 127.0.0.1:6385 How many slots do you want to move (from 1 to 16384)? 1000 What is the receiving node ID? 22e8a8e97d6f7cc7d627e577a986384d4d181a4f Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs. Source node #1: all
追加が完了しました。クラスター ノードを通じて新しく追加されたスロットの分布を確認できます。コマンド
127.0.0.1:6379> cluster nodes 22e8a8e97d6f7cc7d627e577a986384d4d181a4f 127.0.0.1:6385@16385 master - 0 1555064706000 7 connected 0-332 5461-5794 10923-11255 efa84a74525749b8ea20585074dda81b852e9c29 127.0.0.1:6379@16379 myself,master - 0 1555064707000 1 connected 333-5460 d9a79ed6204e558b2fcee78ea05218b4de006acd 127.0.0.1:6381@16381 master - 0 1555064705000 3 connected 11256-16383 7c24e205301b38caa1ff3cd8b270a1ceb7249a2e 127.0.0.1:6386@16386 slave 22e8a8e97d6f7cc7d627e577a986384d4d181a4f 0 1555064705000 7 connected 0469ec03b43e27dc2b7b4eb24de34e10969e3adf 127.0.0.1:6382@16382 slave 63e20c75984e493892265ddd2a441c81bcdc575c 0 1555064707000 4 connected ddebc3ca467d15c7d25125e4e16bcc5576a13699 127.0.0.1:6384@16384 slave efa84a74525749b8ea20585074dda81b852e9c29 0 1555064707236 6 connected 63e20c75984e493892265ddd2a441c81bcdc575c 127.0.0.1:6380@16380 master - 0 1555064706000 2 connected 5795-10922 fd8ea61503e7c9b6e950894c0da41aed3ee19e7e 127.0.0.1:6383@16383 slave d9a79ed6204e558b2fcee78ea05218b4de006acd 0 1555064708238 5 connected6. クラスターノードの削減
缩减节点时先缩减从节点:
[root@localhost server41]# ./redis-cli --cluster del-node 127.0.0.1:6386 7c24e205301b38caa1ff3cd8b270a1ceb7249a2e >>> Removing node 7c24e205301b38caa1ff3cd8b270a1ceb7249a2e from cluster 127.0.0.1:6386 >>> Sending CLUSTER FORGET messages to the cluster... >>> SHUTDOWN the node.
然后进行主节点slot转移:
[root@localhost server41]# ./redis-cli --cluster reshard 127.0.0.1:6385How many slots do you want to move (from 1 to 16384)? 1000What is the receiving node ID? efa84a74525749b8ea20585074dda81b852e9c29 //要移到的节点Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs. Source node #1: 22e8a8e97d6f7cc7d627e577a986384d4d181a4f //要删除的主节点Source node #2: done
最后在缩减主节点
[root@localhost server41]# ./redis-cli --cluster reshard 127.0.0.1:6385 How many slots do you want to move (from 1 to 16384)? 1000 What is the receiving node ID? efa84a74525749b8ea20585074dda81b852e9c29 //要移到的节点 Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs. Source node #1: 22e8a8e97d6f7cc7d627e577a986384d4d181a4f //要删除的主节点 Source node #2: done
缩减完成!【相关推荐:Redis教程】
以上がRedis クラスターの構成と管理の詳細な紹介 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。