Redisのインストールと使用の4---Redisクラスタ

17879 ワード

一、Redisクラスタの紹介
Redisクラスタは、複数のRedis間ノード間でデータを共有するプログラムセットである.
Redisクラスタでは、複数のkeysを処理するコマンドはサポートされていません.これは、異なるノード間でデータを移動する必要があるため、Redisのようなパフォーマンスに達しず、高負荷の場合、予想できないエラーを引き起こす可能性があります.
Redisクラスタは、パーティション化によってある程度の可用性を提供し、実際の環境でノードがダウンタイムしたり、到達できない場合にコマンドの処理を継続します.
Redisクラスタのメリット:
データを異なるノードに自動的に分割する.
クラスタ全体の一部のノードが失敗したり、到達できなかったりした場合、コマンドの処理を続行できます.
Redisクラスタのデータスライスはハッシュスロットを用いる、クラスタは16384個のハッシュスロットを有し、各keyはCRC 16の検査後16384に対して型取りを行い、どのスロットを配置するかを決定する.クラスタの各ノードは、現在のクラスタに3つのノードがあるなど、hashスロットの一部を担当します.
ノードAは0から5500番のハッシュスロットを含む.
ノードBは、5501〜11000番のハッシュスロットを含む.
ノードCは11001~16384番のハッシュスロットを含む.
この構造は、あるノードから別のノードにハッシュスロットを移動してもサービスを停止しないため、削除を追加したり、あるノードのハッシュスロットの数を変更したりしてもクラスタが使用できない状態にはならないノードの追加または削除を容易に行うことができる.
一部のノードが失敗したり、ほとんどのノードが通信できない場合でもクラスタを使用できるようにするために、クラスタはプライマリ・スレーブ・レプリケーション・モデルを使用し、各ノードにN-1のレプリケーションがあります.
二、インストール関連プログラムのコンパイル
①関連プログラムのダウンロード
# wget http://download.redis.io/releases/redis-3.0.6.tar.gz
# wget http://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.8/zlib-1.2.8.tar.gz
# wget https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.4.tar.bz2
# wget https://rubygems.global.ssl.fastly.net/rubygems/rubygems-2.5.1.tgz
# wget https://rubygems.global.ssl.fastly.net/gems/redis-3.2.2.gem

②コンパイルzlib
# gunzip zlib-1.2.8.tar.gz
# tar -xvf zlib-1.2.8.tar
# cd zlib-1.2.8
# ./configure
# make
# make install

③rubyのコンパイル
# bunzip2 ruby-2.2.4.tar.bz2
# tar -xvf ruby-2.2.4.tar
# cd ruby-2.2.4
# ./configure -prefix=/usr/local/ruby
# make
Generating RDoc documentation
Parsing sources...
100% [967/967]  vsnprintf.c                                        
Generating RI format into /root/ruby-2.2.4/.ext/rdoc...
  Files:        967
  Classes:     1411 ( 581 undocumented)
  Modules:      280 ( 108 undocumented)
  Constants:   2160 ( 594 undocumented)
  Attributes:  1156 ( 255 undocumented)
  Methods:    10488 (2187 undocumented)
  Total:      15495 (3725 undocumented)
   75.96% documented
  Elapsed: 744.0s
# make install
# cp ruby /bin

④rubygemsのコンパイル
# tar -zxvf rubygems-2.5.1.tgz
# cd rubygems-2.5.1
# ruby setup.rb
# cp bin/gem /bin

注意:コンパイル中にin'require':cannot load such file--json/pure(LoadError)の解決方法が表示されます.
# gem install json_pure
Fetching: json_pure-1.8.3.gem (100%)
Successfully installed json_pure-1.8.3
Parsing documentation for json_pure-1.8.3
Installing ri documentation for json_pure-1.8.3
1 gem installed

⑤gem-redisのインストール
# gem install -l redis-3.2.2.gem 
Successfully installed redis-3.2.2
Parsing documentation for redis-3.2.2
Installing ri documentation for redis-3.2.2
1 gem installed

⑥インストールredis 3をコンパイルする.0
# wget http://download.redis.io/releases/redis-3.0.6.tar.gz
# tar -zxvf redis-3.0.6.tar.gz
# cd redis-3.0.6
# make
# cp src/redis-server /bin      ##Redis    daemon    
# cp src/redis-cli /bin           ##Redis       
# cp src/redis-trib.rb /bin       ##Redis Cluster  
# cp src/redis-benchmark /bin       ##Redis      
# cp src/redis-check-aof /bin       ##      aof  
# cp src/redis-check-dump /bin     ##      
# cp src/redis-sentinel /bin     ##Redis       

三、Redisクラスタの構成
①redisを配置する.conf
# cd redis-3.0.6
# cp redis.conf  /etc/redis-7000.conf
# vi /etc/redis-7000.conf
daemonize yes
port 7000
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
maxmemory 10gb
logfile /data/redis/7000/redis-7000.log
databases 16
#slave  
slave-priority 100
#    aof 
appendfsync everysec
#   aof rewrite           fsync
no-appendfsync-on-rewrite yes
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
#  redis  
cluster-enabled yes
cluster-config-file /data/redis/7000/nodes-7000.conf
#         (    )
cluster-node-timeout 15000
cluster-migration-barrier 1
cluster-require-full-coverage no
auto-aof-rewrite-percentage 80-100
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
# cp /etc/redis-7000.conf /etc/redis-7001.conf
# cp /etc/redis-7000.conf /etc/redis-7002.conf
# cp /etc/redis-7000.conf /etc/redis-7003.conf
# cp /etc/redis-7000.conf /etc/redis-7004.conf
# cp /etc/redis-7000.conf /etc/redis-7005.conf

注意:各インスタンスの構成は類似しており、対応するポート、ファイル名を変更すればよい
②該当ディレクトリの新規作成
# mkdir -pv /data/redis/{7000,7001,7002,7003,7004,7005}
mkdir:       "/data/redis"
mkdir:       "/data/redis/7000"
mkdir:       "/data/redis/7001"
mkdir:       "/data/redis/7002"
mkdir:       "/data/redis/7003"
mkdir:       "/data/redis/7004"
mkdir:       "/data/redis/7005"

③Redis起動
# redis-server /etc/redis-7000.conf
# redis-server /etc/redis-7001.conf
# redis-server /etc/redis-7002.conf
# redis-server /etc/redis-7003.conf
# redis-server /etc/redis-7004.conf
# redis-server /etc/redis-7005.conf
# ss -tlnp

四、Redisクラスタの構築とテスト
a.Redisクラスタの構築
①rubyツール(redis-trib.rb)によるクラスタ構築
# 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
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: 143b8739a5df1428a50e1c6ec23f8659eadde167 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 0310fb813aedd48c5e6c380d68a19402cd98523a 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: c8cfe49e70545d8299ad759474ccfe12d9f43b03 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: bbf442e1732b5e5a9048fe6692b7038b2677d065 127.0.0.1:7003
   replicates 143b8739a5df1428a50e1c6ec23f8659eadde167
S: 28546f490991cbfbc5eb38d29d144c4389aa1093 127.0.0.1:7004
   replicates 0310fb813aedd48c5e6c380d68a19402cd98523a
S: dd90a66c7b737ffeec88f5b97851655a15fec4a0 127.0.0.1:7005
   replicates c8cfe49e70545d8299ad759474ccfe12d9f43b03
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:7000)
M: 143b8739a5df1428a50e1c6ec23f8659eadde167 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 0310fb813aedd48c5e6c380d68a19402cd98523a 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: c8cfe49e70545d8299ad759474ccfe12d9f43b03 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
M: bbf442e1732b5e5a9048fe6692b7038b2677d065 127.0.0.1:7003
   slots: (0 slots) master
   replicates 143b8739a5df1428a50e1c6ec23f8659eadde167
M: 28546f490991cbfbc5eb38d29d144c4389aa1093 127.0.0.1:7004
   slots: (0 slots) master
   replicates 0310fb813aedd48c5e6c380d68a19402cd98523a
M: dd90a66c7b737ffeec88f5b97851655a15fec4a0 127.0.0.1:7005
   slots: (0 slots) master
   replicates c8cfe49e70545d8299ad759474ccfe12d9f43b03
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

注意:yesを入力する必要があります.簡潔に書くことはできません.
    redis-trib.rb create------Redisクラスタの構築
--replicas 1---Redis Clusterとして指定されたMasterノードごとにSlaveノードが配備されています.ノードの役割は順序によって決まります.
 
②クラスタノードの表示
# redis-cli -p 7000 cluster nodes      
bbf442e1732b5e5a9048fe6692b7038b2677d065 127.0.0.1:7003 slave 143b8739a5df1428a50e1c6ec23f8659eadde167 0 1451811402289 4 connected
28546f490991cbfbc5eb38d29d144c4389aa1093 127.0.0.1:7004 slave 0310fb813aedd48c5e6c380d68a19402cd98523a 0 1451811400270 5 connected
143b8739a5df1428a50e1c6ec23f8659eadde167 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
c8cfe49e70545d8299ad759474ccfe12d9f43b03 127.0.0.1:7002 master - 0 1451811401279 3 connected 10923-16383
dd90a66c7b737ffeec88f5b97851655a15fec4a0 127.0.0.1:7005 slave c8cfe49e70545d8299ad759474ccfe12d9f43b03 0 1451811404307 6 connected
0310fb813aedd48c5e6c380d68a19402cd98523a 127.0.0.1:7001 master - 0 1451811403300 2 connected 5461-10922

③クラスタチェック
# redis-trib.rb check 127.0.0.1:7000      
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 143b8739a5df1428a50e1c6ec23f8659eadde167 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: bbf442e1732b5e5a9048fe6692b7038b2677d065 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 143b8739a5df1428a50e1c6ec23f8659eadde167
S: 28546f490991cbfbc5eb38d29d144c4389aa1093 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 0310fb813aedd48c5e6c380d68a19402cd98523a
M: c8cfe49e70545d8299ad759474ccfe12d9f43b03 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: dd90a66c7b737ffeec88f5b97851655a15fec4a0 127.0.0.1:7005
   slots: (0 slots) slave
   replicates c8cfe49e70545d8299ad759474ccfe12d9f43b03
M: 0310fb813aedd48c5e6c380d68a19402cd98523a 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

④クラスタマスターノードの表示
# redis-cli -p 7000 cluster nodes | grep master
143b8739a5df1428a50e1c6ec23f8659eadde167 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
c8cfe49e70545d8299ad759474ccfe12d9f43b03 127.0.0.1:7002 master - 0 1451814862831 3 connected 10923-16383
0310fb813aedd48c5e6c380d68a19402cd98523a 127.0.0.1:7001 master - 0 1451814860815 2 connected 5461-10922

b.Redisクラスタのテスト
①redis-cliコマンドによるテスト
# redis-cli -c -p 7000
127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
127.0.0.1:7002> set hello world
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
127.0.0.1:7002> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
"world"

②ラインオフRedisノード
ポート番号7002のマスターノードにDEBUG SEGFAULTコマンドを送信し、そのマスターノードをクラッシュさせる
# redis-cli -p 7002 debug segfault
Error: Server closed the connection
# redis-cli -p 7000 cluster nodes | grep master

③マスター新規ノードの追加
# cp /etc/redis-7000.conf /etc/redis-7006.conf(      )
# mkdir /data/redis/7006/
# redis-server /etc/redis-7006.conf
# redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
>>> Adding node 127.0.0.1:7006 to cluster 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 143b8739a5df1428a50e1c6ec23f8659eadde167 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: bbf442e1732b5e5a9048fe6692b7038b2677d065 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 143b8739a5df1428a50e1c6ec23f8659eadde167
S: 28546f490991cbfbc5eb38d29d144c4389aa1093 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 0310fb813aedd48c5e6c380d68a19402cd98523a
M: dd90a66c7b737ffeec88f5b97851655a15fec4a0 127.0.0.1:7005
   slots:10923-16383 (5461 slots) master
   0 additional replica(s)
M: 0310fb813aedd48c5e6c380d68a19402cd98523a 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[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:7006 to make it join the cluster.
[OK] New node added correctly.

④クラスター再分割
# redis-trib.rb reshard 127.0.0.1:7006
>>> Performing Cluster Check (using node 127.0.0.1:7006)
M: 8785c3133caac92b022a4852d15d63409497287f 127.0.0.1:7006
   slots:0-165,5461-5627,10923-11088 (499 slots) master
   1 additional replica(s)
S: bbf442e1732b5e5a9048fe6692b7038b2677d065 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 143b8739a5df1428a50e1c6ec23f8659eadde167
S: c8cfe49e70545d8299ad759474ccfe12d9f43b03 127.0.0.1:7002
   slots: (0 slots) slave
   replicates 8785c3133caac92b022a4852d15d63409497287f
M: dd90a66c7b737ffeec88f5b97851655a15fec4a0 127.0.0.1:7005
   slots:11089-16383 (5295 slots) master
   0 additional replica(s)
S: 28546f490991cbfbc5eb38d29d144c4389aa1093 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 0310fb813aedd48c5e6c380d68a19402cd98523a
M: 143b8739a5df1428a50e1c6ec23f8659eadde167 127.0.0.1:7000
   slots:166-5460 (5295 slots) master
   1 additional replica(s)
M: 0310fb813aedd48c5e6c380d68a19402cd98523a 127.0.0.1:7001
   slots:5628-10922 (5295 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 500
##      slot  
What is the receiving node ID? 8785c3133caac92b022a4852d15d63409497287f
##       slot node-id?
Source node #1:all
##  slot  ,all     master    ,         slot master  id,   done  
......
Do you want to proceed with the proposed reshard plan (yes/no)? yes
##      slot ,  yes    slot       

注:上の7006はすでに1回分片したことがあって、複製していないため、再び1回分片しました
⑤マスターノードを1つ削除する
<1>. reshardを使用してmasterのすべてのslotを除去する
# redis-trib.rb reshard 127.0.0.1:7006
>>> Performing Cluster Check (using node 127.0.0.1:7006)
M: 8785c3133caac92b022a4852d15d63409497287f 127.0.0.1:7006
   slots:0-165,5461-5627,10923-11088 (499 slots) master
   1 additional replica(s)
S: bbf442e1732b5e5a9048fe6692b7038b2677d065 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 143b8739a5df1428a50e1c6ec23f8659eadde167
S: c8cfe49e70545d8299ad759474ccfe12d9f43b03 127.0.0.1:7002
   slots: (0 slots) slave
   replicates 8785c3133caac92b022a4852d15d63409497287f
M: dd90a66c7b737ffeec88f5b97851655a15fec4a0 127.0.0.1:7005
   slots:11089-16383 (5295 slots) master
   0 additional replica(s)
S: 28546f490991cbfbc5eb38d29d144c4389aa1093 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 0310fb813aedd48c5e6c380d68a19402cd98523a
M: 143b8739a5df1428a50e1c6ec23f8659eadde167 127.0.0.1:7000
   slots:166-5460 (5295 slots) master
   1 additional replica(s)
M: 0310fb813aedd48c5e6c380d68a19402cd98523a 127.0.0.1:7001
   slots:5628-10922 (5295 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 500
##          slot  
What is the receiving node ID? dd90a66c7b737ffeec88f5b97851655a15fec4a0
##       slot node-id
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:8785c3133caac92b022a4852d15d63409497287f
##   master node-id
Source node #2:done
.....
Do you want to proceed with the proposed reshard plan (yes/no)? yes
##      slot ,  yes    slot       

<2>. 空のMasterノードを削除(Slaveノードを削除するにはこのコマンドのみ)
# redis-trib.rb del-node 127.0.0.1:7006 8785c3133caac92b022a4852d15d63409497287f
>>> Removing node 8785c3133caac92b022a4852d15d63409497287f from cluster 127.0.0.1:7006
>>> Sending CLUSTER FORGET messages to the cluster...
>>> 127.0.0.1:7002 as replica of 127.0.0.1:7005
>>> SHUTDOWN the node.

⑥スレーブノードを追加
<1>.redis-tribを使用rbコマンドの追加:
# redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000

注意:ここのコマンドは、プライマリ・ノードを追加するコマンドと似ています.ここでは、このスレーブ・ノードを追加するプライマリ・ノードは指定されていません.この場合、システムは、他のレプリケーション・セットのプライマリ・ノードから、このスレーブ・ノードとしてプライマリ・ノードをランダムに選択します.
<2>.次のコマンドでプライマリノードを指定できます.
# redis-trib.rb add-node --slave --master-id 143b8739a5df1428a50e1c6ec23f8659eadde167 127.0.0.1:7006 127.0.0.1:7000

<3>.Cluster Replicateコマンドで追加できます.このコマンドは、スレーブノードのプライマリノードを変更することもできます.
redis 127.0.0.1:7006> cluster replicate dd90a66c7b737ffeec88f5b97851655a15fec4a0   ##    7005       

五、Redis Cluster常用管理コマンド
①クラスター(cluster)
cluster info##クラスタ情報の印刷
cluster nodes##クラスタで現在知られているすべてのノード(node)とその関連情報をリストします.
②ノード(node)
cluster meet##IPとPORTで指定したノードをクラスタに追加し、クラスタの一員にする
cluster forget##クラスタからnodeを除去id指定ノード
cluster replicate##現在のノードをnode_に設定id指定ノードのスレーブノード
cluster saveconfig##ノードのプロファイルをハードディスクに保存
③スロット(slot)
cluster addslots [slot ...] ##1つ以上のスロット(slot)を現在のノードに割り当てる(assign)
cluster delslots [slot ...] ##現在のノードへの1つ以上のスロットの割り当てを削除
cluster flushslots###現在のノードに割り当てられているすべてのスロットを削除し、現在のノードをスロットが割り当てられていないノードにします.
cluster setslot node##スロットslotをnode_に割り当てるid指定されたノードスロットが別のノードに割り当てられている場合は、まず別のノードにスロットを削除させてから割り当てる
cluster setslot migrating##本ノードのスロットslotをnode_に移行id指定ノードで
cluster setslot importing##node_からid指定ノードにスロットslotを本ノードにインポート
cluster setslot stable##スロットslotのインポート(import)または移行(migrate)をキャンセル
④キー(key)
cluster keyslot##キーキーがどのスロットに配置されるべきかを計算
cluster countkeysinslot##リターンスロットslot現在含まれているキー値ペア数
cluster getkeysinslot##count個のslotスロットのキーを返す