Redis の高可用性
高可用性とは
Web サーバーにおける高可用性とは、サーバーに正常にアクセスできる時間を指し、通常のサービスをどれだけ長く提供できるか (99.9%、99.99%、99.999% など) を測定します。
ただし、Redis の文脈での高可用性の意味はもっと広いと思われ、通常のサービス (マスター/スレーブ分離、迅速な災害復旧技術など) の提供の確保に加えて、高可用性の拡張も考慮する必要があります。データ容量と損失のないデータセキュリティなど。
Redis の高可用性テクノロジー
Redisにおいて高可用性を実現する技術としては、主に永続化、マスタースレーブレプリケーション、セントリー、クラスタークラスターがあり、それぞれの機能とどのような問題を解決できるかについて説明します。
-
永続性:永続性は最も単純な高可用性方法です (高可用性方法として分類されていない場合もあります)。その主な機能はデータのバックアップ、つまり、プロセスによってデータが失われないようにデータをハードディスクに保存することです。出口。
-
マスター/スレーブ レプリケーション:マスター/スレーブ レプリケーションは高可用性 Redis の基礎であり、Sentinel とクラスターは高可用性を実現するためにマスター/スレーブ レプリケーションに基づいています。マスター/スレーブ レプリケーションは主に、データの複数マシンのバックアップ (および同期) を実現するだけでなく、読み取り操作の負荷分散と単純な障害回復も実現します。
- 欠点: 障害回復は自動化できません。書き込み操作の負荷分散はできません。ストレージ容量は 1 台のマシンによって制限されます。
-
Sentinel: Sentinel は、マスター/スレーブ レプリケーションに基づいて、自動障害回復を実装します。(マスターがダウンしているため、新しいマスターとなるスレーブを見つけます。センチネル ノードがそれを監視します)
- 欠点: 書き込み操作は負荷分散できず、ストレージ容量は 1 台のマシンによって制限されます。
-
クラスター クラスター: Redis はクラスタリングを通じて、書き込み操作の負荷分散ができず、ストレージ容量が単一マシンによって制限されるという問題を解決し、比較的完全な高可用性ソリューションを実現します。(マスター 3 台、スレーブ 3 台のペアで 6 セット開始)
Redis のマスター/スレーブ レプリケーション
マスター/スレーブ レプリケーションとは、1 つの Redis サーバーのデータを他の Redis サーバーにコピーすることを指します。前者をマスターノード(Master)、後者をスレーブノード(slave)と呼び、データの複製はマスターノードからスレーブノードへの一方向のみとなります。
デフォルトでは、各 Redis サーバーはマスター ノードであり、マスター ノードは複数のスレーブ ノードを持つことができます (またはスレーブ ノードを持たないこともできます)。ただし、スレーブ ノードはマスター ノードを 1 つだけ持つことができます。
マスター/スレーブ レプリケーションの役割
- データ冗長性:マスター/スレーブ レプリケーションは、永続化以外のデータ冗長化方法であるデータのホット バックアップを実装します。
- 障害回復:マスター ノードに問題が発生した場合、スレーブ ノードは迅速な障害回復を実現するためのサービスを提供できます。これは実際には一種のサービス冗長性です。
- 負荷分散:読み取り/書き込み分離と組み合わせたマスター/スレーブ レプリケーションに基づいて、マスター ノードは書き込みサービスを提供し、スレーブ ノードは読み取りサービスを提供できます(つまり、アプリケーションは Redis データの書き込み時にマスター ノードに接続します) 、アプリケーションは Redis データの読み取り時にスレーブ ノードに接続します)、サーバーの負荷を共有するため、特に書き込みを減らし読み取りを増やすシナリオでは、複数のスレーブ ノードで読み取り負荷を共有すると、Redis サーバーの同時実行性が大幅に向上します。
- 高可用性の基礎:上記の機能に加えて、マスター/スレーブ レプリケーションもセンチネルとクラスターの実装の基礎となるため、マスター/スレーブ レプリケーションは Redis の高可用性の基礎となります。
マスター/スレーブ レプリケーション プロセス
(1) スレーブ マシンのプロセスが開始されると、マスター マシンに同期コマンドを送信して同期接続を要求します。
(2) 最初の接続であっても再接続であっても、マスター マシンはバックグラウンド プロセスを開始してデータ ファイルにデータ スナップショットを保存し (rdb 操作を実行)、マスターはデータとキャッシュを変更するためのすべてのコマンドも記録します。データファイルの途中にあります。
(3) バックグラウンド プロセスがキャッシュ操作を完了した後、マスター マシンはデータ ファイルをスレーブ マシンに送信し、スレーブ マシンはデータ ファイルをハードディスクに保存してメモリにロードし、次にマスター マシンがデータ ファイルをスレーブ マシンに送信します。マシンはすべてのデータ ファイルを変更します。操作はスレーブ マシンにも送信されます。スレーブに障害が発生してダウンタイムが発生した場合、通常に戻った後、自動的に再接続されます。
(4) マスター マシンがスレーブ マシンからの接続を受信した後、完全なデータ ファイルをスレーブ マシンに送信します。マスターが複数のスレーブから同時に同期要求を受信した場合、マスター マシンはバックグラウンドでプロセスを開始し、同期要求をスレーブ マシンに送信します。データ ファイルを保存し、それをすべてのスレーブ マシンに送信して、すべてのスレーブ マシンが正常であることを確認します。
Redis マスター/スレーブ レプリケーションを構築する
ラボ環境:
マスタースレーブ | 仮想マシン | IPアドレス |
---|---|---|
マスター | セントス7-1 | 192.168.137.10 |
スレーブ1 | セントス7-2 | 192.168.137.20 |
実験手順
すべてのノードに Redis をインストールする
#关闭防火墙
systemctl stop firewalld
setenforce 0
#安装环境依赖包,下载编译工具
yum install -y gcc gcc-c++ make
#上传软件包并解压
cd /opt/
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
#开2核编译安装,指定安装路径为/usr/local/redis
make -j2 && make PREFIX=/usr/local/redis install
#由于Redis源码包中直接提供了Makefile 文件,所以在解压完软件包后,不用先执行./configure 进行配置,可直接执行make与make install命令进行安装。
#执行软件包提供的install_server.sh 脚本文件,设置Redis服务所需要的相关配置文件
cd /opt/redis-5.0.7/utils
./install_server.sh
.......#一直回车
Please select the redis executable path [] /usr/local/redis/bin/redis-server
#这里默认为/usr/local/bin/redis-server,需要手动修改为/usr/local/redis/bin/redis-server,注意要一次性正确输入
---------------------- 虚线内是注释 ----------------------------------------------------
Selected config:
Port: 6379 #默认侦听端口为6379
Config file: /etc/redis/6379.conf #配置文件路径
Log file: /var/log/redis_6379.log #日志文件路径
Data dir : /var/lib/redis/6379 #数据文件路径
Executable: /usr/local/redis/bin/redis-server #可执行文件路径
Cli Executable : /usr/local/bin/redis-cli #客户端命令工具
-----------------------------------------------------------------------------------
#当install_server.sh 脚本运行完毕,Redis 服务就已经启动,默认监听端口为6379
netstat -natp | grep redis
#把redis的可执行程序文件放入路径环境变量的目录中,便于系统识别
ln -s /usr/local/redis/bin/* /usr/local/bin/
#Redis服务控制
/etc/init.d/redis_6379 stop #停止
/etc/init.d/redis_6379 start #启动
/etc/init.d/redis_6379 restart #重启
/etc/init.d/redis_6379 status #查看状态
マスターノードの設定ファイルを変更する
vim /etc/redis/6379.conf
bind 0.0.0.0 #70行,修改监听地址为0.0.0.0(生产环境中需要填写物理网卡的IP)
daemonize yes #137行,开启守护进程,后台启动
logfile /var/log/redis_6379.log #172行,指定日志文件存放目录
dir /var/lib/redis/6379 #264行,指定工作目录
appendonly yes #700行,开启AOF持久化功能
/etc/init.d/redis_6379 restart #重启redis服务
スレーブノードの設定ファイルを変更する
#修改slave1的配置文件
vim /etc/redis/6379.conf
bind 0.0.0.0 #70行,修改监听地址为0.0.0.0(生产环境中需要填写物理网卡的IP)
daemonize yes #137行,开启守护进程,后台启动
logfile /var/log/redis_6379.log #172行,指定日志文件目录
dir /var/lib/redis/6379 #264行,指定工作目录
replicaof 192.168.137.10 6379 #288行,指定要同步的Master节点的IP和端口
appendonly yes #700行,修改为yes,开启AOF持久化功能
/etc/init.d/redis_6379 restart #重启redis
netstat -natp | grep redis #查看主从服务器是否已建立连接
マスタースレーブ効果を検証する
マスターノードはログを確認し、データを挿入します。
[root@192 utils]# tail /var/log/redis_6379.log
8339:M 28 May 2023 16:50:13.198 * Reading RDB base file on AOF loading...
8339:M 28 May 2023 16:50:13.198 * Loading RDB produced by version 7.0.9
8339:M 28 May 2023 16:50:13.198 * RDB age 32 seconds
8339:M 28 May 2023 16:50:13.198 * RDB memory usage when created 0.82 Mb
8339:M 28 May 2023 16:50:13.198 * RDB is base AOF
8339:M 28 May 2023 16:50:13.198 * Done loading RDB, keys loaded: 0, keys expired: 0.
8339:M 28 May 2023 16:50:13.198 * DB loaded from base file appendonly.aof.1.base.rdb: 0.000 seconds
8339:M 28 May 2023 16:50:13.198 * DB loaded from append only file: 0.000 seconds
8339:M 28 May 2023 16:50:13.198 * Opening AOF incr file appendonly.aof.1.incr.aof on server start
8339:M 28 May 2023 16:50:13.198 * Ready to accept connections
[root@192 utils]# redis-cli
127.0.0.1:6379> set name cxk
OK
127.0.0.1:6379> kes *
(error) ERR unknown command 'kes', with args beginning with: '*'
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"cxk"
ノードからの眺め
Redis センチネル モード
マスター/スレーブ切り替え技術の方式は、サーバーがダウンした場合、手動でスレーブ マシンをマスター マシンに切り替える必要があり、手動による介入が必要であり、時間と労力がかかるだけでなく、サービスの停止にもつながります。一定期間利用できなくなること。マスター/スレーブ レプリケーションの欠点を解決するために、センチネル メカニズムがあります。
Sentinel のコア機能: Sentinel は、マスター/スレーブ レプリケーションに基づいて、マスター ノードの自動フェイルオーバーを導入します。
センチネルモードの役割
-
監視: Sentry は、マスター ノードとスレーブ ノードが適切に機能していることを常にチェックします。
-
自動フェイルオーバー:マスター ノードが正常に動作しない場合、Sentinel は自動フェイルオーバー操作を開始します。障害が発生したマスター ノードのスレーブ ノードの 1 つを新しいマスター ノードにアップグレードし、代わりに他のスレーブ ノードに新しいマスター ノードをコピーさせます。 。
-
通知 (リマインダー): Sentinel はフェイルオーバー結果をクライアントに送信できます
センチネル構造
Sentinel ノード: Sentinel システムは、データを保存しない 特別な Redis ノードである 1 つ以上の Sentinel ノードで構成されます。
データ ノード: マスター ノードとスレーブ ノードの両方がデータ ノードです
フェイルオーバーメカニズム 1. センチネルノードによる定期的な監視により、マスターノードに障害が発生していないかどうかを確認します
各センチネル ノードは、マスター ノード、スレーブ ノード、および他のセンチネル ノードに、ハート チェックのために 1 秒ごとに ping コマンドを送信するように要求します。マスター ノードが特定の時間枠内に応答しない場合、またはエラー メッセージで応答した場合、センチネルはマスター ノードが主観的に (一方的に) オフラインであるとみなします。センチネル ノードの半数以上が主観的にマスター ノードがオフラインであると考える場合、客観的にはオフラインです。
2. マスター ノードに障害が発生すると、センチネル ノードは Raft アルゴリズム (選挙アルゴリズム) を通じて選挙メカニズムを実装し、マスター ノードのフェイルオーバーと通知の処理を担当するリーダーとしてセンチネル ノードを共同で選出します。したがって、Sentinel を実行するクラスターの数は 3 ノード以上である必要があります。
3. リーダーセンチネルノードはフェイルオーバーを実行します。プロセスは次のとおりです。
- スレーブ ノードを新しいマスター ノードにアップグレードし、他のスレーブ ノードが新しいマスター ノードを指すようにします。
- 元のマスター ノードが回復すると、そのノードはスレーブ ノードになり、新しいマスター ノードを指します。
- プライマリ ノードが交換されたことをクライアントに通知します。
客観的オフラインはマスター ノードに固有の概念であることに注意することが重要です。スレーブ ノードとセンチネル ノードに障害が発生した場合、センチネルによって主観的にオフラインになった後は、その後の客観的オフラインおよびフェイルオーバー操作は行われません。
マスターノードの選出
1. センチネルの ping 応答に応答していない、異常な (オフラインの) スレーブ ノードを除外します。
2. 設定ファイル内で最も優先度の高い設定を持つスレーブ ノードを選択します。(レプリカの優先順位、デフォルト値は 100)
3. 最大のレプリケーション オフセットを持つスレーブ ノード、つまり最も完全なレプリケーションを選択します。
セントリーの開始はマスター/スレーブ モードに依存するため、センチネル モードを実行する前にマスター/スレーブ モードをインストールする必要があります。
Redis センチネル モードを構築する
ラボ環境:
ノード | 仮想マシン | IPアドレス |
---|---|---|
マスター | セントス7-1 | 192.168.137.10 |
スレーブ1 | セントス7-2 | 192.168.137.15 |
スレーブ2 | セントス7-3 | 192.168.137.20 |
センチネル-1 | セントス7-4 | 192.168.137.30 |
センチネル-2 | セントス7-5 | 192.168.137.40 |
センチネル-3 | セントス7-6 | 192.168.137.50 |
実稼働環境では、対応するノード数のサーバーが監視ノードとして使用されますが、実験環境では、コンピュータのパフォーマンスが十分でない場合は、元の仮想マシン上に監視ノードを構築できます。
実験手順
すべてのノードに Redis をインストールする
マスターとスレーブのデプロイ Redis マスター/スレーブ レプリケーション
Sentinel-1 の構成ファイルを変更し、それを他の 2 つの Sentinel ノードに scp します。
vim /opt/redis-5.0.7/sentinel.conf
......
protected-mode no #17行,取消注释,关闭保护模式
port 26379 #21行,Redis哨兵默认的监听端口
daemonize yes #26行,指定sentinel为后台启动
logfile "/var/log/sentinel.log" #36行,指定日志文件存放路径
dir "/var/lib/redis/6379" #65行,指定数据库存放路径
sentinel monitor mymaster 192.168.137.10 6379 2 #84行,修改
#指定该哨兵节点监控192.168.121.10:6379这个主节点,该主节点的名称是mymaster。
#最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 3000 #113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000 #146行,同一个sentinel对同一个master两次failover之间的间隔时间(180秒)
#传给两外2个哨兵节点
scp /opt/redis-5.0.7/sentinel.conf 192.168.137.40:/opt/redis-5.0.7/
scp /opt/redis-5.0.7/sentinel.conf 192.168.137.50:/opt/redis-5.0.7/
センチネル モードの開始 (すべてのセンチネル ノードの操作)
#启动三台哨兵
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &
センチネル情報を見る
#在哨兵节点查看
[root@localhost ~]# redis-cli -p 26379 info Sentinel
# Sentinel
sentinel_masters:1 #一台主节点
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.137.10:6379,slaves=2,sentinels=3
#可以看到主节点地址,2台从节点,3台哨兵
失敗をシミュレートする
#在Master 上查看redis-server进程号:
[root@localhost ~]# ps -ef | grep redis
root 71245 1 0 6月19 ? 00:00:05 /usr/local/redis/bin/redis-server 0.0.0.0:6379
root 71983 66681 0 00:59 pts/1 00:00:00 grep --color=auto redis
#杀死 Master 节点上redis-server的进程号
[root@localhost ~]# kill -9 71245 #Master节点上redis-server的进程号
[root@localhost ~]# netstat -natp | grep redis
#在哨兵上查看日志,验证master是否切换至从服务器
[root@localhost redis-5.0.7]# tail -f /var/log/sentinel.log
7084:X 20 Jun 2022 00:46:58.869 * +sentinel sentinel ce975c271f86d8f6e0b80162529752b754ecfc69 192.168.137.40 26379 @ mymaster 192.168.137.10 6379
7084:X 20 Jun 2022 00:47:56.595 * +sentinel sentinel d59ba9daf957b704715feeee3c53bd1bf8b3a5d8 192.168.137.50 26379 @ mymaster 192.168.137.10 6379
7084:X 20 Jun 2022 01:01:33.484 # +sdown master mymaster 192.168.137.10 6379
7084:X 20 Jun 2022 01:01:33.561 # +new-epoch 1
7084:X 20 Jun 2022 01:01:33.561 # +vote-for-leader ce975c271f86d8f6e0b80162529752b754ecfc69 1
7084:X 20 Jun 2022 01:01:34.476 # +config-update-from sentinel ce975c271f86d8f6e0b80162529752b754ecfc69 192.168.137.40 26379 @ mymaster 192.168.137.10 6379
7084:X 20 Jun 2022 01:01:34.476 # +switch-master mymaster 192.168.137.10 6379 192.168.121.30 6379
7084:X 20 Jun 2022 01:01:34.477 * +slave slave 192.168.137.15:6379 192.168.137.15 6379 @ mymaster 192.168.121.30 6379
7084:X 20 Jun 2022 01:01:34.477 * +slave slave 192.168.137.10:6379 192.168.137.10 6379 @ mymaster 192.168.121.30 6379
7084:X 20 Jun 2022 01:02:04.493 # +sdown slave 192.168.137.10:6379 192.168.137.10 6379 @ mymaster 192.168.137.20 6379
#在哨兵上查看主节点是否切换成功
[root@localhost ~]# redis-cli -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.137.20:6379,slaves=2,sentinels=3
Redisクラスターモード
クラスター、すなわち Redis Cluster は、Redis3.0 によって導入された分散ストレージ ソリューションです。
クラスターは複数のノード (Node) で構成され、Redis データはこれらのノード間に分散されます。クラスター内のノードはマスター ノードとスレーブ ノードに分割されます。マスター ノードのみが読み取りおよび書き込みリクエストとクラスター情報のメンテナンスを担当します。スレーブ ノードはマスター ノードのデータとステータス情報のみを複製します。
クラスターの役割
(1) データ パーティショニング:データ パーティショニング (またはデータ シャーディング) は、クラスターの中核機能です。
- クラスターはデータを複数のノードに分散します。一方で、Redis 単一マシンのメモリー サイズの制限を突破し、ストレージ容量が大幅に増加します。他方、各マスター ノードは外部の読み取りおよび書き込みサービスを提供でき、これにより、クラスターの応答性が大幅に向上します。
- Redis スタンドアロンのメモリ サイズは制限されており、これは永続性とマスター/スレーブ レプリケーションの紹介で説明したとおりです。その結果、スレーブ ノードは長時間サービスを提供できなくなり、マスター ノードのレプリケーション バッファーがオーバーフローする可能性があります。完全なレプリケーションフェーズ。
(2) 高可用性:クラスターはマスター/スレーブ レプリケーションとマスター ノードの自動フェイルオーバー (Sentinel と同様) をサポートしており、いずれかのノードに障害が発生しても、クラスターは引き続き外部サービスを提供できます。
Redis はクラスターを通じて、書き込み操作の負荷分散ができず、ストレージ容量が単一マシンによって制限されるという問題を解決し、比較的完全な高可用性ソリューションを実現します。
Redis クラスターのデータ断片化
Redis Cluster では、ハッシュ スロットの概念が導入されています。
Redis クラスターには 16384 個のハッシュ スロット (0 ~ 16383 の番号が付けられます) があります。
クラスターの各ノードは、ハッシュ スロットの一部を担当します。
各キーが CRC16 チェックに合格した後、16384 の残りを取得して、どのハッシュ スロットに配置するかを決定します。この値を通じて、対応するスロットに対応するノードを見つけ、アクセス操作のために対応するノードに直接かつ自動的にジャンプします。
クラスターモードのマスター/スレーブレプリケーションモデル
- クラスターには 3 つのノード A、B、C があります。ノード B に障害が発生すると、5461 ~ 10922 の範囲のスロットが不足するため、クラスター全体が使用できなくなります。
- 各ノードにスレーブ ノード A1、B1、および C1 を追加すると、クラスター全体は 3 つのマスター ノードと 3 つのスレーブ ノードで構成されます。ノード B に障害が発生した後、クラスターはサービスを継続するマスター ノードとして B1 を選択します。B と B1 の両方に障害が発生すると、クラスターは使用できなくなります
Redis クラスターを構築する
実験手順:
すべてのノードに Redis をインストールする
クラスター機能を有効にする
cd /opt/redis-5.0.7/
vim redis.conf
......
bind 192.168.137.10 #69行,修改为监听自己的物理网卡IP
protected-mode no #88行,修改为no,关闭保护模式
port 6379 #92行,redis默认监听端口
daemonize yes #136行,开启守护进程,以独立进程启动
appendonly yes #700行,修改为yes,开启AOF持久化
cluster-enabled yes #832行,取消注释,开启群集功能
cluster-config-file nodes-6379.conf #840行,取消注释,群集名称文件设置
cluster-node-timeout 15000 #846行,取消注释,群集超时时间设置
#将文件传给另外5个节点,之后每个节点要修改监听地址为自己的IP
[root@localhost redis-5.0.7]# scp redis.conf 192.168.137.15:`pwd`
[root@localhost redis-5.0.7]# scp redis.conf 192.168.137.20:`pwd`
[root@localhost redis-5.0.7]# scp redis.conf 192.168.137.30:`pwd`
[root@localhost redis-5.0.7]# scp redis.conf 192.168.137.40:`pwd`
[root@localhost redis-5.0.7]# scp redis.conf 192.168.137.50:`pwd`
すべてのノードが Redis サービスを開始します
cd /opt/redis-5.0.7/
redis-server redis.conf #启动redis节点
クラスターを開始する
任意のノードでクラスターを起動するだけです。
redis-cli --cluster create 192.168.137.10:6379 192.168.137.15:6379 192.168.137.20:6379 192.168.137.30:6379 192.168.137.40:6379 192.168.137.50:6379 --cluster-replicas 1
#六个主机分为三组,三主三从,前面的做主节点后面的做从节点下免交互的时候需要输入yes才可以创建 "-replicas 1"表示每个主节点有一个从节点
#前三台为Master,后三台为Slave
テストクラスター
#加-c参数,节点之间就可以互相跳转
redis-cli -h 192.168.137.10 -p 6379 -c
#查看节点的哈希槽编号范围
cluster slots
#赋值
set name yuji
#查看键的哈希槽编号
cluster keyslot 键名
[root@mas ~]# redis-cli -h 192.168.137.10 -p 6379 -c
192.168.121.10:6379> cluster slots #查看节点的哈希槽编号范围
1) 1) (integer) 10923 #第一对主从的哈希槽编号范围
2) (integer) 16383
3) 1) "192.168.137.15" #主节点
2) (integer) 6379
3) "5f117a3e204d1d6f6dc924ad8b39034a8e9f3261"
4) 1) "192.168.137.30" #从节点
2) (integer) 6379
3) "4a05a086eec06fa4da58b15512d1c81184bc5ee5"
2) 1) (integer) 5461 #第二对主从的哈希槽编号范围
2) (integer) 10922
3) 1) "192.168.121.20" #主节点
2) (integer) 6379
3) "3008bba29dfbf342bc448ba3062b0a331c8d009e"
4) 1) "192.168.137.50" #从节点
2) (integer) 6379
3) "ee61a4709d6420bb540b2c28218fdd2dfe358b7a"
3) 1) (integer) 0 #第三对主从的哈希槽编号范围
2) (integer) 5460
3) 1) "192.168.137.10" #主节点
2) (integer) 6379
3) "d1ddb554b3edaebefa6672b2f1f8171393e1f7f3"
4) 1) "192.168.137.40" #从节点
2) (integer) 6379
3) "71e1f705ce01ca31ab16fa3cf07d7e6cbfab5978"
192.168.121.10:6379>
#在10节点新建name键,会自动跳转到20节点进行存放
192.168.121.10:6379> set name yuji
-> Redirected to slot [5798] located at 192.168.137.15:6379
OK
192.168.121.20:6379> cluster keyslot name #查看name键的哈希槽编号
(integer) 5798
192.168.121.20:6379> quit #退出数据库
[root@mas ~]# redis-cli -h 192.168.137.10 -p 6379 -c #重新登录10节点
192.168.121.10:6379> keys * #10节点中没有name键
(empty list or set)
192.168.121.10:6379> get name #查看name键的值,会根据键的哈希槽编号自动跳转到20节点进行获取
-> Redirected to slot [5798] located at 192.168.137.15:6379
"yuji"
192.168.121.20:6379> #已跳转到20节点