前回の記事では、Windowsでのredisのインストールについて紹介しました
最初にクラスターの概念を紹介します
Redisクラスターの概要
Redisクラスターは、複数のRedisノード間でデータ共有を提供するアセンブリです。
Redisクラスターは、複数のキーを処理するコマンドをサポートしていません。これは、異なるノード間でデータを移動する必要があり、Redisのようなパフォーマンスを達成できず、高負荷状態で予期しないエラーが発生する可能性があるためです。
Redisクラスターは、パーティショニングを通じてある程度の可用性を提供し、ノードがダウンしているか到達できない場合でも、実際の環境でコマンドを処理し続けます。Redisクラスターの利点:
- データを異なるノードに自動的に分割します。
- クラスタ全体の一部のノードに障害または到達不能が発生した場合でも、コマンドは引き続き処理できます。
Redisクラスターデータシャーディング
Redisクラスターはコンシステントハッシュを使用しませんが、ハッシュスロットの概念を導入し ます。
Redisクラスターには16384個のハッシュスロットがあり、各キーはCRC16とモジュロ16384によってチェックされ、配置するスロットが決定されます。クラスター内の各ノードは、ハッシュスロットの一部を担当します。たとえば、現在のクラスターに3つのノードがある場合、次に:
- ノードAには、ハッシュスロット0〜5500が含まれています。
- ノードBには、ハッシュスロット5501〜11000が含まれています。
- ノードCには、ハッシュスロット11001から16384が含まれています。
この構造はノードの追加または削除が簡単です。たとえば、新しいノードDを追加する場合は、ノードA、B、CからDにいくつかのスロットを追加する必要があります。ノードAを削除する場合は、次のようにする必要があります。 addスロットをBノードとCノードに移動してから、スロットのないAノードをクラスターから削除します。ハッシュスロットをあるノードから別のノードに移動しても、追加、削除、変更に関係なく、サービスは停止しません。ノードのハッシュスロットの数によって、クラスターが使用できなくなることはありません。
Redisクラスターのマスタースレーブレプリケーションモデル
一部のノードに障害が発生した場合やほとんどのノードが通信できない場合でもクラスターを引き続き使用できるようにするために、クラスターはマスタースレーブレプリケーションモデルを使用し、各ノードにはN-1個のレプリカがあります。
この例では、レプリケーションモデルのない3つのノードA、B、およびCを持つクラスターで、ノードBに障害が発生した場合、クラスター全体が5501〜11000の範囲のスロットがなく、使用できないと見なします。
ただし、クラスターの作成時に(または一定期間後に)各ノードにスレーブノードA1、B1、C1を追加すると、クラスター全体が3つのマスターノードと3つのスレーブノードで構成されるため、ノードBの後に失敗すると、クラスターはサービスを継続するための新しいマスターノードとしてB1を選択し、スロットが見つからないため、クラスター全体が使用できなくなります。
ただし、BとB1の両方に障害が発生すると、クラスターは使用できなくなります。
Redisの整合性保証
Redisは、強力なデータ整合性を保証しません。これは、実際には、クラスターが特定の条件下で書き込み操作を失う可能性があることを意味します。
最初の理由は、クラスターが非同期レプリケーションを使用しているためです。書き込み操作プロセス:
- クライアントは、マスターノードBにコマンドを書き込みます。
- マスターノードBは、コマンドステータスをクライアントに応答します。
- マスターノードは、書き込み操作をスレーブノードB1、B2、およびB3に複製します。
マスターノードによるコマンドのコピーは、コマンド応答が返された後に行われます。これは、各処理コマンド要求がレプリケーション操作の完了を待機する必要がある場合、マスターノード処理コマンド要求の速度が大幅に低下するためです。パフォーマンスとパフォーマンスに重点を置く必要があります。一貫性の間でトレードオフを行います。注:Redisクラスターは、将来、同期書き込みメソッドを提供する可能性があります。Redisクラスターでコマンドが失われる可能性があるもう1つの状況は、クラスターにネットワークパーティションがあり、クライアントが少なくとも1つのマスターノードを含む少数のインスタンスから分離されていることです。
たとえば、クラスターに6つのノードA、B、C、A1、B1、およびC1が含まれているとします。ここで、A、B、およびCはマスターノード、A1、B1、およびC1はA、B、およびC1のスレーブノードです。 C、および1つのクライアントがありますエンドZ1は、クラスター内にネットワークパーティションがあると想定し、クラスターを2つのパーティに分割できます。ほとんどのパーティにはノードA、C、A1、B1、およびC1が含まれます。小さな部分には、ノードBとクライアントZ1が含まれます。
Z1仍然能够向主节点B中写入, 如果网络分区发生时间较短,那么集群将会继续正常运作,如果分区的时间足够让大部分的一方将B1选举为新的master,那么Z1写入B中得数据便丢失了.
注意, 在网络分裂出现期间, 客户端 Z1 可以向主节点 B 发送写命令的最大时间是有限制的, 这一时间限制称为节点超时时间(node timeout), 是 Redis 集群的一个重要的配置选项:
下面我们来搭建集群
1. 安装Ruby并配置环境
首先我们来配置环境变量 SSL_CERT_FILE首先在这里下载证书 http://curl.haxx.se/ca/cacert.pem, 然后再环境变量里设置 SSL_CERT_FILE 这个环境变量,并指向 cacert.pem 文件。(我这里在D盘建了一个文件夹rubyinstaller,把文件放在了里面)
环境配置好之后安装Ruby,Windows可以安装RubyInstaller,下载地址:
https://rubyinstaller.org/
下载之后解压 解压完之后会有一个Ruby22文件夹,然后进入文件夹中打开命令行依次输入命令进行配置
ruby -v
gem -v
gem sources
gem install redis
2.搭建集群
要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。 这里我们搭建一个伪分布式,使用6个redis实例来模拟
1.)首先我们再D盘redis文件夹下面创建6个文件夹 7000~7005 依次代表使用端口号7000~7005
2.)我们在7000~7005这6个文件夹下面新建 redis.conf 文件
次に、次の内容を書き込みます。書き込み後にコピーして貼り付けることをお勧めしますが、ポート番号を対応するフォルダのポート番号に変更することを忘れないでください
ポート7000(対応するフォルダーのポート番号) cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonlyyes
次に、redisフォルダー内のredis-server.exeがコピーされ、7000〜7005フォルダーに順番に貼り付けられます。
示されているように
3.)6つのredisサービスを順番に開始します
各フォルダの下にあるコマンドラインを開きます
コマンドを入力します(開始後にオフにしないでください)
redis-server.exe redis.conf
4.)スタートアップクラスターを作成する
クラスターの作成と開始にはredis-trib.rbファイルが必要なため、インスタンスに特別なコマンドを送信して、新しいクラスターの作成を完了したり、クラスターをチェックしたり、クラスターを再共有したりするRubyプログラムです。
このファイルはWindowsのredisインストールファイルに含まれていません。公式ウェブサイトからRedisをダウンロードする必要があります。公式ウェブサイトのRedisバージョンはLinuxバージョンです。ソースコードsrcフォルダーで、redis-trib.rbをにコピーします。このマシンのRedisインストールディレクトリ。
こちらからhttp://download.csdn.net/download/a447332241/9930662をダウンロードすることもできます。
最後に、redis-trib.rbファイルが配置されているディレクトリを入力して実行します。
ruby redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
このコマンドは、ここで新しいクラスターを作成するために使用されます。オプション–replicas 1は、クラスター内のマスターノードごとにスレーブノードを作成することを意味します。以下のその他のパラメーターは、このクラスターインスタンス、3つのマスターおよび3つのスレーブのアドレスリストです。
redis-tribは、期待される構成を出力して表示します。問題がないと思われる場合は、yesと入力すると、redis-tribがこの構成をクラスターに適用して、各ノードが相互に通信を開始できるようにします。
このようにして、クラスターがセットアップされます。
5.)テスト
redisフォルダーの下にredis-cli.exe-h 127.0.0.1 -p 7001-cと入力します
私たちに代わって、ポート7001のredisサービスに接続します
Redisクラスターデータ分散戦略:
データの割り当てにはハッシュスロットと呼ばれる方法が使用されます。redisクラスターはデフォルトで16384スロットを割り当てます。キーを設定するときは、CRC16アルゴリズムを使用してスロットを取得するためのモジュロを取得し、キーをノードに分割します。ハッシュスロット間隔では、特定のアルゴリズムは次のとおりです。CRC16(key)%16384
注:その後に3つのマスターノードが必要です。そうでない場合、クラスターの作成時に失敗します。3つのノードが想定するスロット間隔は次のとおりです。
ノードAは0-5460をカバーし、
ノードBは5461-10922をカバーし、
ノードCは10923-16383をカバーします。
したがって、上の図では、redisクラスターのハッシュスロットアルゴリズムに従って、CRC16( 'name')%16384
がポート7002のredisサービスに割り当てられています。
この時点で、WindowsでのRedisクラスターの構成は完了です。
Redis中国語ドキュメントhttp://www.redis.cn/topics/cluster-tutorial.html
次の記事では、jedisを使用してSpringと統合します