redis3.x cluster

6062 ワード

《redis3.x cluster》
 
前言
redisクラスタの後、データルーティングアルゴリズムが異なるkeyを異なるredisノードに分散して格納する必要がある.通常、あるkeyのhashcodeを取得し、modするが、この方法では動的伸縮性の需要をうまくサポートすることができず、ノードの増加または削除操作によってkeyがredisでヒットできないため、redis 3では.x以前は,redisのクラスタを記述整合性hashアルゴリズムを用いて実現していたが,redis 3.xはclusterを正式にサポートしたが,hash slot(hash溝)を採用した.
 
redisクラスタには16384個のハッシュスロットが内蔵されており、setが動作すると、redisはまずkeyに対してcrc 16を用いて結果を検証し、mod 16384に対して結果を検証し、これにより各keyは0-16383の番号のハッシュスロットに対応し、redisはノード数に応じてほぼ均等にハッシュスロットを異なるノードにマッピングする.このような利点は明らかであり、ノードを追加する必要がある場合、他のノードのいくつかのハッシュスロットを新しいノードに移動するだけでよい.ノードを削除する必要がある場合は、削除ノード上のハッシュスロットを他のノードに移動するだけでよい.
 
目次
一、redisのダウンロードとコンパイル;
二、クラスタインストールに必要な周辺プラグイン;
三、redisクラスタの配置;
四、redisクラスター及びHAを検証する;
五、redisクラスタのスライス規則を再指定する.
六、クラスタノードの伸縮調整;
七、jediscluster APIの使用;
八、注意項目;
九、読書を推薦する.
 
一、redisのダウンロードとコンパイル
redisの公式サイトのダウンロードアドレスhttp://redis.io/,筆者の本章の博文で用いたバージョンはredis 3である.0.7公式版では、予想できないミスや不一致を避けるために、筆者と同じバージョンを使用することをお勧めします.または、以下に示すようにredisのダウンロードとコンパイルを直接次のコマンドで実行します.
$ wget http://download.redis.io/releases/redis-3.0.7.tar.gz
$ tar -zvxf redis-3.0.7.tar.gz
$ cd redis-3.0.7
$ make

 
コンパイルコマンドが正常に実行されると、redisのバイナリコードは/srcディレクトリに含まれます.
 
二、クラスタ設置に必要な周辺環境
redisクラスタにはrubyの一連の環境サポートが必要です.そのため、以下に示すようにruby環境をインストールする必要があります.
$ yum install ruby
$ yum install rubygems
$ gem install redis

 
まずruby環境をダウンロードしてインストールし、次にrubygemsコンポーネント、最後にredisインタフェースです.ここでは、redisをダウンロードしてインストールする場合に注意してください.gem、gemサーバーが接続できない可能性があります.手動でダウンロードしてインストールすればいいです.推奨アドレスhttp://download.csdn.net/download/menggucaoyuan/8487967.
以下のように手動でインストールします.
gem install -l ./redis-3.0.0.gem

 
三、redisクラスタ配置
筆者のredisは、インストールアドレスが/usr/local/redis/redis-3.0.7である場合、/usr/local/redis/ディレクトリの下に、以下の9つのディレクトリを新規作成しました.
$ mkdir redis7000 redis7001 redis7002 redis7003 redis7004 redis7005 redis7006 redis7007 redis7008

 
次に/usr/local/redis/redis-3.0.7/redis.confは、上記の9つの新規ディレクトリにコピーし、以下に示すように、各redisノードのredis構成項目を1つずつ変更します.
port    redis    
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

  
上記のファイルのcluster-enabledオプションはインスタンスのクラスタモードを開くために使用するが、cluster-conf-fileオプションはノードプロファイルを保存するパスを設定し、デフォルト値はnodesである.conf.ノードプロファイルは、Redisクラスタによって起動時に作成され、必要に応じて自動的に更新されます.
ここでは、クラスタを正常に動作させるには少なくとも3つのプライマリノードが必要であることに注意してください.しかし、クラスタ機能の試用を開始したばかりの頃、6つのノードを強くお勧めします.そのうち3つはプライマリノードで、残りの3つは各プライマリノードのセカンダリノードです.筆者の本章では,9つのノードを用い,そのうち3つのプライマリノード,各プライマリノードに2つのスレーブノードがある.
 
構成が完了したら、次のコマンドを使用して各redisノードを起動します.
redis-server redis.conf

 
各ノードが正常に起動した後、コマンドを使用してredisクラスタを作成します.次のようにします.
./redis-trib.rb  create --replicas 2 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 127.0.0.1:7006 127.0.0.1:7007 127.0.0.1:7008

 
上記のコマンドは、新しいクラスタを作成するために使用されます.オプション-replicas 2は、クラスタ内の各プライマリノードに2つのスレーブノードを作成したいことを示します.その後続く他のパラメータは,このクラスタインスタンスのアドレスリスト,3 master,6 slaveである.redis-tribは予想通りの構成を印刷して見せます.問題がなければyesを入力することができます.redis-tribはこの構成をクラスタに適用し、各ノードが互いに通信を開始させ、最後に次の情報を得ることができます.
[OK] All 16384 slots covered

 
これは、クラスタ内の16384スロットのうち少なくとも1つのプライマリノードが処理され、クラスタが正常に動作していることを示している.
 
四、redisクラスタ及びHAの検証
redisクラスタを正常に起動したら、次のコマンドを使用してredisクライアントにログインしてredisクラスタを検証してみます.
$ ./redis-cli -c -p 7000
$ cluster nodes

 
上記のコマンドが正常に実行されると、次のように出力されます.
 
上記クラスタ情報は3つのmaster,6つのslaveと表示され,1主2従,合計9ノードを採用した.ここで、redisクラスタの半数以上のmasterノードが使用できない場合は、クラスタノード全体が使用できないことを意味することに注意してください.
 
あるmasterにデータをセットし、killがこのプロセスを削除すると、slaveノードが引き継ぎ、新しいmasterになります.クラスタに3つのノードが掛けられた後、redisはクラスタを調整し、1メイン1から3つのmasterノードに変更し、前のdownマシンのデータを新しいmasterに引き継ぐことで、haslotの再割り当てを回避できます.以下のようにします.
 
五、redisクラスタのスライス規則を再指定する
再スライス操作は、基本的には、あるノード上のハッシュスロットを他のノードの上に移動することであり、クラスタの作成と同様に、再スライスはredis-tribプログラムを使用して再スライス操作を実行することもできる.ここで、再スライスは、実行中のクラスタプログラムに影響を与えないことに注意してください.スライスコマンドを実行します.次のようにします.
./redis-trib.rb reshard 127.0.0.1:7000

クラスタの1つのノードのアドレスを指定するだけで、redis-tribはクラスタ内の他のノードを自動的に見つけます.再スライスコマンドを実行すると、どのくらいのhashスロットを移動するかが示されます.ここでは、1000個のhashスロットを移動する必要があると仮定して、1000を入力します.次に、これらのhashスロットをどのmasterに移動するかのidを入力し、最後にどのノード上のhashスロットを前に指定したターゲットmasterに移動するかを指定し、allを入力すると他のすべてのmasterからハッシュスロットを取ってターゲットmasterに移動します.
最後に確認すると、redis-tribが移動するスロットごとの情報が表示され、keyごとの移動の情報も印刷されます.再分割の過程で、サンプルプログラムは影響を受けず、何度も停止したり再起動したりすることができます.再スライスが終了したら、次のコマンドでクラスタの状態を確認できます.
./redis-trib.rb check 127.0.0.1:7000 

 
六、クラスタノードの伸縮調整
redisクラスタノードの伸縮性調整は、主にクラスタにmasterノードまたはslaveノードを動的に追加したり、masterノードまたはslaveノードを除去したりすることを指す.既存のクラスタノードにmasterノードを追加するとします.次のコマンドを使用します.
./redis-trib.rb add-node 127.0.0.1:7009 127.0.0.1:7000
 
新しく追加されたmasterノードにはhashスロットが割り当てられていないため、このmasterにhashスロットを割り当てる操作も必要です.もちろんmasterノード万を追加することもできますが、クラスタ環境にslaveノードを追加することもできます.以下に示すように、次のコマンドを使用してクラスタノードにslaveノードを追加します.
./redis-trib.rb add-node --slave 127.0.0.1:7010 127.0.0.1:7000
 
ここでのコマンドは、プライマリノードを追加するコマンドと似ています.ここでは、このスレーブノードを追加するプライマリノードは指定されていません.この場合、システムは、他のレプリケーションセットのプライマリノードから、このスレーブノードとしてプライマリノードをランダムに選択します.もちろん、次のコマンドでプライマリノードを指定できます.
./redis-trib.rb add-node --slave --master-id be50d14dca84586054196c867f52bc05a5261561 127.0.0.1:7010 127.0.0.1:7000
 
クラスタ環境からmasterノードまたはslaveノードを除去するには、次のコマンドを使用します.
./redis-trib.rb del-node 127.0.0.1:7000 `<node-id>`
 
最初のパラメータは任意のノードのアドレスで、2番目のノードは削除したいノードのアドレスです.同様の方法でマスターノードを除去するが、マスターノードを除去する前に、このマスターノードが空であることを確認する必要がある.空でない場合は、このノードのデータを他のプライマリノードに再分割する必要があります.