1. シャードクラスターを使用する理由
マスター/スレーブとセントリーは、高可用性と高同時読み取りの問題を解決できます。しかし、まだ未解決の問題が 2 つあります。
- 大容量データストレージの問題
- 高同時書き込みの問題は、センチネル モードの本質が依然としてマスター/スレーブ モードであることです。マスター/スレーブ モードでは、ノードを追加して読み取り同時実行機能を拡張できますが、書き込みを拡張する方法はありません
slave
。そしてストレージ機能。
上記の問題は、シャード クラスターを使用することで解決できます。シャード クラスターの特徴は次のとおりです。
- クラスターには複数のクラスターがあり
master
、それぞれにmaster
異なるデータが保存されます。 - それぞれに
master
複数のslave
ノードを含めることができます。 master
ping
お互いの健康状態をモニタリングすることで。- クライアント要求はクラスター内の任意のノードにアクセスでき、最終的には正しいノードに転送されます。
2. シャードクラスターの概要
シャード クラスターはRedis
複数のマスター/スレーブ構造の組み合わせであり、各マスター/スレーブ構造にはマスター インスタンスと複数のスレーブ インスタンスがあります。Redis
データ量が増加した場合、シャード クラスターを水平に拡張でき、キー値が指定されたインスタンスに配置されるため、システムの単一マスター ノードへの依存が軽減され、それによってサービスの読み取りおよび書き込みパフォーマンスが向上しますRedis
。
3. ハッシュスロット
Redis
各ノードは合計スロット ( )master
にマッピングされます。ハッシュ スロットはデータ パーティションに似ています。各キーと値のペアは、その値に従ってハッシュ スロットにマップされます。特定の実行プロセスは 2 つのステップに分かれています。0~16383
16384
hash slot
key
- キーと値のペアに従って
key
、アルゴリズムに従って値をCRC16
計算します16bit
- 次に、
16bit
値のペアを使用して16384
係数を取得し0~16383
、範囲内の係数を取得します。各係数は、対応する番号を持つハッシュ スロットを表します。各ノードは、スロットの一部を処理する責任があります。Redis
クラスター内にmaster
ノードがある場合はABC
、範囲各ノードが担当するスロットは次のとおりです。
master ノード |
処理スロット |
---|---|
A |
0-5460 |
B |
5461-10922 |
C |
10923-16383 |
クラスター情報を表示すると、次のことがわかります。
注: **データはkey
ノードではなくスロットにバインドされます。**このバインディングの利点は、クラスターが拡張してノードが増加するか、ダウンタイムによってmaster
ノードが減少する場合、Redis
スロットを生き残ったノードに転送する方が便利であり、データはスロット転送に続くため、元のデータを見つけることができることです。場所の位置。
Redis
key
スロット値は、次の 2 つの場合に、 の有効な部分に従って計算されます。
key
「{}」が含まれており、「{}」に少なくとも 1 文字が含まれており、「{}」の部分が有効な部分ですkey
「{}」は含まれていません。全体がkey
有効な部分です
4. シャードクラスターを構築する
4.1. クラスター構造
シャード クラスターには多数のノードが必要です。ここでは、master
それぞれmaster
1 つのノードを含む3 つのノードで最小限のシャード クラスターを構築しますslave
。構造は次のとおりです。
ここでは、同じ仮想マシン内で 6 つのインスタンスを起動してredis
、断片化されたクラスターをシミュレートします。
IP |
ポート | 役割 |
---|---|---|
10.0.4.10 | 7001 | master |
10.0.4.10 | 7002 | master |
10.0.4.10 | 7003 | master |
10.0.4.10 | 8001 | slave |
10.0.4.10 | 8002 | slave |
10.0.4.10 | 8003 | slave |
4.2. インスタンスと設定の準備
以前のディレクトリ 7001、7002、および 7003 を削除し、ディレクトリ 7001、7002、7003、8001、8002、および 8003 を再作成します。
# 进入/home/redis目录
cd /home/redis
# 删除旧的,避免配置干扰
rm -rf 7001 7002 7003
# 创建目录
mkdir 7001 7002 7003 8001 8002 8003
次の内容を含む新しい/home/redis
ファイルを以下に準備します。redis.conf
port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /home/redis/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /home/redis/6379
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 10.0.4.10
# 保护模式
protected-mode no
# 数据库数量
databases 16
# 日志
logfile /home/redis/6379/run.log
このファイルを各ディレクトリにコピーします。
# 进入/home/redis
cd /home/redis
# 执行拷贝
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf
各ディレクトリの下を変更しredis.conf
、ディレクトリと一致するように 6379 を変更します。
# 进入/home/redis目录
cd /home/redis
# 修改配置文件
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf
4.3. 起動
バックグラウンド起動モードが構成されているため、サービスを直接起動できます。
# 进入/home/redis目录
cd /home/redis
# 一键启动所有服务
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf
PS 経由でステータスを表示します。
ps -ef | grep redis
検出サービスは正常に開始されました:
すべてのプロセスを閉じたい場合は、次のコマンドを実行できます。
ps -ef | grep redis | awk '{print $2}' | xargs kill
または (この方法をお勧めします):
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown
4.4. クラスターの作成
サービスは開始されていますが、現在は各サービスが連携せずに独立しています。
クラスタを作成するにはコマンドを実行する必要があります。Redis5.0
以前はクラスタを作成するのが面倒でしたが、5.0 以降はクラスタ管理コマンドが に統合されましたredis-cli
。
1)Redis5.0
以前
Redis5.0
以前のクラスター コマンドは、redis
インストール パッケージを使用してsrc/redis-trib.rb
実装されました。言語で書かれているredis-trib.rb
ためインストール環境が必要です。ruby
ruby
# 安装依赖
yum -y install zlib ruby rubygems
gem install redis
次に、次のコマンドを使用してクラスターを管理します。
# 进入redis的src目录
cd /home/redis/redis-6.2.4/src
# 创建集群
./redis-trib.rb create --replicas 1 10.0.4.10:7001 10.0.4.10:7002 10.0.4.10:7003 10.0.4.10:8001 10.0.4.10:8002 10.0.4.10:8003
2)Redis5.0
後で
Redis6.2.4
バージョン、クラスター管理を使用し、それに統合されていますredis-cli
。形式は次のとおりです。
redis-cli --cluster create --cluster-replicas 1 10.0.4.10:7001 10.0.4.10:7002 10.0.4.10:7003 10.0.4.10:8001 10.0.4.10:8002 10.0.4.10:8003
コマンドの説明:
redis-cli --cluster
または./redis-trib.rb
: クラスタ操作コマンドを表しますcreate
: クラスターの作成を表します--replicas 1
または--cluster-replicas 1
:master
クラスタ内のそれぞれのコピー数が 1 であることを指定し、节点总数 ÷ (replicas + 1)
このとき取得した数がmaster
その数になります。したがって、ノード リストの最初のノードは、他のノードはすべて、異なるノードにランダムに割り当てられたノードにn
なります。master
slave
master
実行後の様子:
ここでの問題は、上記の方法でクラスターを作成することです。問題がない場合は、次を入力するyes
と、クラスターの作成が開始されます。
次のコマンドを使用してクラスターのステータスを表示できます。
redis-cli -p 7001 cluster nodes
4.5. テスト
ノード 7001 に接続してデータを保存してみます。
# 连接
redis-cli -p 7001
# 存储数据
set num 123
# 读取数据
get num
# 再次存储
set a 1
結果は悲劇的です:
redis-cli
クラスターの操作中に、パラメーターを追加する必要があります-c
。
redis-cli -c -p 7001
今回はうまくいきます: