redisクラスタ実戦


一、説明
redis 3.0クラスタの機能が出てきてからもうしばらく経ちましたが、現在の最新安定版は3.0.5で、私はすでに多くのインターネット会社が生産環境で使用していることを知っています.例えば、唯品会、美団などです.ちょうど会社に新しいプロジェクトがあります.見積もった量の単機redisは満足できません.開発はコードの面で分割したくないので、redisクラスタを試してみることをお勧めします.
二、環境
1.redisノード
10.10.2.70:6300  10.10.2.70:6301   
10.10.2.71:6300  10.10.2.71:6301   
10.10.2.85:6300  10.10.2.85:6301    

2、redisバージョン
Redis version 3.0.5

三、設置配置
1.redisのインストール
wget http://download.redis.io/releases/redis-3.0.5.tar.gz
tar -zxvf redis-3.0.5.tar.gz
cd redis-3.0.5
make

cp redis-3.0.5/src/redis-trib.rb /bin/
cp redis-3.0.5/src/redis-server /bin/
cp redis-3.0.5/src/redis-cli    /bin/

2、ruby及びrubyのredisモジュールをインストールする
yum -y install ruby rubygems
gem install redis --version 3.0.5

3、カーネルチューニング
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf  
sysctl -p

4、ディレクトリの作成
mkdir /data/redis/6300 -p
mkdir /data/redis/6301

5、redisプロファイルの作成(cpプロファイルポートの変更に注意)
vim  /etc/redis_6300.conf
daemonize yes
port 6300
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
maxmemory 10gb
databases 16
dir /data/redis/6300
slave-serve-stale-data yes
loglevel notice
logfile "/data/redis/6300/redis_6300.log"
#slave  
slave-read-only yes
#not use default
repl-disable-tcp-nodelay yes
slave-priority 100
#  aof   
appendonly yes
#    aof 
appendfsync everysec
#   aof rewrite           fsync
no-appendfsync-on-rewrite yes
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
#  redis  
cluster-enabled yes
cluster-config-file /data/redis/6300/nodes-6300.conf
#         (    )
cluster-node-timeout 15000
#                                                 
cluster-migration-barrier 1
#     key space            ,        node  ,         
cluster-require-full-coverage no
#        redis  , auto-aof-rewrite  ,    fork  redis   rewrite,      
auto-aof-rewrite-percentage 80-100
slowlog-log-slower-than 10000
slowlog-max-len 128
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
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

6、サービスを開始する
redis-server /etc/redis_6300.conf
redis-server /etc/redis_6301.conf
echo "redis-server /etc/redis_6300.conf" >> /etc/rc.local
echo "redis-server /etc/redis_6301.conf" >> /etc/rc.local

7、クラスタの初期化
#         , master   slave,   6300 master,6301 slave
redis-trib.rb create --replicas 1 10.10.2.70:6300 10.10.2.71:6300  10.10.2.85:6300  10.10.2.70:6301 10.10.2.71:6301  10.10.2.85:6301

8.クラスタ状態の表示
redis-trib.rb check 10.10.2.70:6300

PS:
redis-trib.rbはrubyツールで、redisクラスタのいくつかのコマンドをカプセル化しています.このツールでクラスタを操作するのは便利です.例えば、上でクラスタを初期化したり、クラスタの状態を表示したり、ノードを追加したり、削除したり、slotを移行したりする機能があります.
四、redisクラスタメンテナンス
A、シーン1
オンライン上のクラスタにはボトルネックがあり、クラスタは拡張する必要があります.例えば、プライマリ・セカンダリ(10.10.2.85:6302、10.10.2.85:6303)を準備しています.以下のようにします.
1、マスターノードを追加する
[root@yw_0_0 ~]# redis-trib.rb add-node 10.10.2.85:6302 10.10.2.70:6300
>>> Adding node 10.10.2.85:6302 to cluster 10.10.2.70:6300
Connecting to node 10.10.2.70:6300: OK
Connecting to node 10.10.2.85:6300: OK
Connecting to node 10.10.2.85:6301: OK
Connecting to node 10.10.2.71:6300: OK
Connecting to node 10.10.2.70:6301: OK
Connecting to node 10.10.2.71:6301: OK
>>> Performing Cluster Check (using node 10.10.2.70:6300)
S: cd1f2c1f348bb4359337e7462c1e21dc82f1551b 10.10.2.70:6300
   slots: (0 slots) slave
   replicates 85412cf3d8e69354115fc0991f470b32b9213cd7
M: 6bea6afa2ee8dfb0cc3c96f804eb3fa77ce98013 10.10.2.85:6300
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: a74642c0fbc98f921be477eabcdd22eccd89891f 10.10.2.85:6301
   slots: (0 slots) slave
   replicates 2568dbd91fffa16ff93ea8db19275fd7ec8af41a
M: 2568dbd91fffa16ff93ea8db19275fd7ec8af41a 10.10.2.71:6300
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 85412cf3d8e69354115fc0991f470b32b9213cd7 10.10.2.70:6301
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 22d2dec483824b84571a60e8c037fff957615552 10.10.2.71:6301
   slots: (0 slots) slave
   replicates 6bea6afa2ee8dfb0cc3c96f804eb3fa77ce98013
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Connecting to node 10.10.2.85:6302: OK
>>> Send CLUSTER MEET to node 10.10.2.85:6302 to make it join the cluster.
[OK] New node added correctly.

10.10.2.85:6302は追加する新しいノードで、10.10.2.70:6300はクラスタにすでに存在する任意のノードです.
2、マスターノードにスレーブノードを追加する
[root@yw_0_0 ~]# redis-trib.rb add-node --slave --master-id 5ef18f95f75756891aa948ea1f200044f1d3947c 10.10.2.85:6303 10.10.2.70:6300
>>> Adding node 10.10.2.85:6303 to cluster 10.10.2.70:6300
Connecting to node 10.10.2.70:6300: OK
Connecting to node 10.10.2.85:6300: OK
Connecting to node 10.10.2.85:6302: OK
Connecting to node 10.10.2.85:6301: OK
Connecting to node 10.10.2.71:6300: OK
Connecting to node 10.10.2.70:6301: OK
Connecting to node 10.10.2.71:6301: OK
>>> Performing Cluster Check (using node 10.10.2.70:6300)
S: cd1f2c1f348bb4359337e7462c1e21dc82f1551b 10.10.2.70:6300
   slots: (0 slots) slave
   replicates 85412cf3d8e69354115fc0991f470b32b9213cd7
M: 6bea6afa2ee8dfb0cc3c96f804eb3fa77ce98013 10.10.2.85:6300
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 5ef18f95f75756891aa948ea1f200044f1d3947c 10.10.2.85:6302
   slots: (0 slots) master
   0 additional replica(s)
S: a74642c0fbc98f921be477eabcdd22eccd89891f 10.10.2.85:6301
   slots: (0 slots) slave
   replicates 2568dbd91fffa16ff93ea8db19275fd7ec8af41a
M: 2568dbd91fffa16ff93ea8db19275fd7ec8af41a 10.10.2.71:6300
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 85412cf3d8e69354115fc0991f470b32b9213cd7 10.10.2.70:6301
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 22d2dec483824b84571a60e8c037fff957615552 10.10.2.71:6301
   slots: (0 slots) slave
   replicates 6bea6afa2ee8dfb0cc3c96f804eb3fa77ce98013
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Connecting to node 10.10.2.85:6303: OK
>>> Send CLUSTER MEET to node 10.10.2.85:6303 to make it join the cluster.
Waiting for the cluster to join.
>>> Configure node as replica of 10.10.2.85:6302.
[OK] New node added correctly.

--slaveは追加するノードを指定します.--master-idはこのスレーブノードのプライマリノードIDを指定します.10.10.2.85:6303は追加するスレーブノードで、10.10.10.2.70:6300はクラスタがすでに存在する任意のノードです.
3、slotを新しいノードに移行する
[root@yw_0_0 ~]# redis-trib.rb reshard 10.10.2.70:6300
Connecting to node 10.10.2.70:6300: OK
Connecting to node 10.10.2.85:6300: OK
Connecting to node 10.10.2.85:6303: OK
Connecting to node 10.10.2.85:6302: OK
Connecting to node 10.10.2.85:6301: OK
Connecting to node 10.10.2.71:6300: OK
Connecting to node 10.10.2.70:6301: OK
Connecting to node 10.10.2.71:6301: OK
>>> Performing Cluster Check (using node 10.10.2.70:6300)
S: cd1f2c1f348bb4359337e7462c1e21dc82f1551b 10.10.2.70:6300
   slots: (0 slots) slave
   replicates 85412cf3d8e69354115fc0991f470b32b9213cd7
M: 6bea6afa2ee8dfb0cc3c96f804eb3fa77ce98013 10.10.2.85:6300
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: fc90d090fae909fd4f962752941c039d081d3854 10.10.2.85:6303
   slots: (0 slots) slave
   replicates 5ef18f95f75756891aa948ea1f200044f1d3947c
M: 5ef18f95f75756891aa948ea1f200044f1d3947c 10.10.2.85:6302
   slots: (0 slots) master
   1 additional replica(s)
S: a74642c0fbc98f921be477eabcdd22eccd89891f 10.10.2.85:6301
   slots: (0 slots) slave
   replicates 2568dbd91fffa16ff93ea8db19275fd7ec8af41a
M: 2568dbd91fffa16ff93ea8db19275fd7ec8af41a 10.10.2.71:6300
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 85412cf3d8e69354115fc0991f470b32b9213cd7 10.10.2.70:6301
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 22d2dec483824b84571a60e8c037fff957615552 10.10.2.71:6301
   slots: (0 slots) slave
   replicates 6bea6afa2ee8dfb0cc3c96f804eb3fa77ce98013
[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)? 3000  #     3000 slot   
What is the receiving node ID? 5ef18f95f75756891aa948ea1f200044f1d3947c  #     3000 slot   ID,        10.10.2.85:6302 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:85412cf3d8e69354115fc0991f470b32b9213cd7   #   3000slot   ID,         3          slot
Source node #2:6bea6afa2ee8dfb0cc3c96f804eb3fa77ce98013    #   3000slot   ID,         3          slot
Source node #3:2568dbd91fffa16ff93ea8db19275fd7ec8af41a      #   3000slot   ID,         3          slot
Source node #4:done   #  done          
    
Do you want to proceed with the proposed reshard plan (yes/no)? yes    yes      slot

B、シーン2
上記の例はクラスタ拡張であるのに対し、様々な理由でクラスタも縮小する必要がある可能性があり、以下の例は上記拡張ノードをラインオフし、ステップは以下の通りである.
1、このノードのslotを他のノードに移行する(slotのあるノードは直接ラインオフできない)
[root@yw_0_0 ~]# redis-trib.rb reshard 10.10.2.70:6300
Connecting to node 10.10.2.70:6300: OK
Connecting to node 10.10.2.85:6300: OK
Connecting to node 10.10.2.85:6303: OK
Connecting to node 10.10.2.85:6302: OK
Connecting to node 10.10.2.85:6301: OK
Connecting to node 10.10.2.71:6300: OK
Connecting to node 10.10.2.70:6301: OK
Connecting to node 10.10.2.71:6301: OK
>>> Performing Cluster Check (using node 10.10.2.70:6300)
S: cd1f2c1f348bb4359337e7462c1e21dc82f1551b 10.10.2.70:6300
   slots: (0 slots) slave
   replicates 85412cf3d8e69354115fc0991f470b32b9213cd7
M: 6bea6afa2ee8dfb0cc3c96f804eb3fa77ce98013 10.10.2.85:6300
   slots:999-5460 (4462 slots) master
   1 additional replica(s)
S: fc90d090fae909fd4f962752941c039d081d3854 10.10.2.85:6303
   slots: (0 slots) slave
   replicates 5ef18f95f75756891aa948ea1f200044f1d3947c
M: 5ef18f95f75756891aa948ea1f200044f1d3947c 10.10.2.85:6302
   slots:0-998,5461-6461,10923-11921 (2999 slots) master
   1 additional replica(s)
S: a74642c0fbc98f921be477eabcdd22eccd89891f 10.10.2.85:6301
   slots: (0 slots) slave
   replicates 2568dbd91fffa16ff93ea8db19275fd7ec8af41a
M: 2568dbd91fffa16ff93ea8db19275fd7ec8af41a 10.10.2.71:6300
   slots:6462-10922 (4461 slots) master
   1 additional replica(s)
M: 85412cf3d8e69354115fc0991f470b32b9213cd7 10.10.2.70:6301
   slots:11922-16383 (4462 slots) master
   1 additional replica(s)
S: 22d2dec483824b84571a60e8c037fff957615552 10.10.2.71:6301
   slots: (0 slots) slave
   replicates 6bea6afa2ee8dfb0cc3c96f804eb3fa77ce98013
[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)? 3000 #          3000 slot,         3000 slot
What is the receiving node ID? 85412cf3d8e69354115fc0991f470b32b9213cd7 #   3000slot    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:5ef18f95f75756891aa948ea1f200044f1d3947c  #       ID
Source node #4:done
    
Do you want to proceed with the proposed reshard plan (yes/no)?yes

2、それから10.10.2.85:6302このmaserにはもうslotがありません.
10.10.2.71:6300> cluster nodes
85412cf3d8e69354115fc0991f470b32b9213cd7 10.10.2.70:6301 master - 0 1445853133399 12 connected 0-999 6462-7460 10923-16383
22d2dec483824b84571a60e8c037fff957615552 10.10.2.71:6301 slave 6bea6afa2ee8dfb0cc3c96f804eb3fa77ce98013 0 1445853132898 10 connected
6bea6afa2ee8dfb0cc3c96f804eb3fa77ce98013 10.10.2.85:6300 master - 0 1445853134400 10 connected 1000-5461
2568dbd91fffa16ff93ea8db19275fd7ec8af41a 10.10.2.71:6300 myself,master - 0 0 11 connected 5462-6461 7461-10922
cd1f2c1f348bb4359337e7462c1e21dc82f1551b 10.10.2.70:6300 slave 85412cf3d8e69354115fc0991f470b32b9213cd7 0 1445853131395 12 connected
fc90d090fae909fd4f962752941c039d081d3854 10.10.2.85:6303 slave 5ef18f95f75756891aa948ea1f200044f1d3947c 0 1445853133899 8 connected
a74642c0fbc98f921be477eabcdd22eccd89891f 10.10.2.85:6301 slave 2568dbd91fffa16ff93ea8db19275fd7ec8af41a 0 1445853129394 11 connected
5ef18f95f75756891aa948ea1f200044f1d3947c 10.10.2.85:6302 master - 0 1445853132397 8 connected

3、下線slaveノード
[root@yw_0_0 ~]# redis-trib.rb del-node 10.10.2.85:6303 fc90d090fae909fd4f962752941c039d081d3854
>>> Removing node fc90d090fae909fd4f962752941c039d081d3854 from cluster 10.10.2.85:6303
Connecting to node 10.10.2.85:6303: OK
Connecting to node 10.10.2.85:6301: OK
Connecting to node 10.10.2.85:6302: OK
Connecting to node 10.10.2.85:6300: OK
Connecting to node 10.10.2.70:6300: OK
Connecting to node 10.10.2.71:6301: OK
Connecting to node 10.10.2.70:6301: OK
Connecting to node 10.10.2.71:6300: OK
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

4、下線マスターノード
redis-trib.rb del-node 10.10.2.70:6301 5ef18f95f75756891aa948ea1f200044f1d3947c
>>> Removing node 5ef18f95f75756891aa948ea1f200044f1d3947c from cluster 10.10.2.70:6301
Connecting to node 10.10.2.70:6301: OK
Connecting to node 10.10.2.71:6300: OK
Connecting to node 10.10.2.85:6301: OK
Connecting to node 10.10.2.71:6301: OK
Connecting to node 10.10.2.85:6302: OK
Connecting to node 10.10.2.70:6300: OK
Connecting to node 10.10.2.85:6300: OK
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

C、シーン3
クラスタの中の1つのノードのmasterは掛けて、ノードからメインノードに昇格して、まだ来ていない急いでこの新しいメインノードにノードをプラスして、この新しいメインノードはまた掛けて、それではクラスタの中のこのノードは完全に使うことができなくて、この問題を解決するために、私達は少なくとも各ノードのmaserの下に2つ以上のスレーブノードがあることを保証して、このようにして、必要なメモリ資源あるいはサーバー資源は2倍になって、折衷の方法はありませんか.答えは肯定的です.また、ノードの前のプロファイルのcluster-migration-barrierパラメータはありません.クラスタの1つのノードのmasterに複数の従ライブラリを掛けるだけです.他のノードのmasterの下に使用可能な従ライブラリがない場合、複数の従ライブラリのmasterが1つのslaveをカットしてクラスタ全体の可用性を保証します.
1、10.10.2.70:6300 10.10.2.70:6301このグループのノードの下にライブラリ10.2.85:6302を追加する
[root@yw_0_0 ~]# redis-trib.rb add-node --slave --master-id cd1f2c1f348bb4359337e7462c1e21dc82f1551b 10.10.2.85:6302 10.10.2.70:6300
>>> Adding node 10.10.2.85:6302 to cluster 10.10.2.70:6300
Connecting to node 10.10.2.70:6300: OK
Connecting to node 10.10.2.85:6300: OK
Connecting to node 10.10.2.71:6300: OK
Connecting to node 10.10.2.70:6301: OK
Connecting to node 10.10.2.85:6301: OK
Connecting to node 10.10.2.71:6301: OK
>>> Performing Cluster Check (using node 10.10.2.70:6300)
M: cd1f2c1f348bb4359337e7462c1e21dc82f1551b 10.10.2.70:6300
   slots:3000-5461,6462-7460,10923-16383 (8922 slots) master
   1 additional replica(s)
M: e36cdef7a26ed59e8d9db2cf1dbc1997bfc9dfde 10.10.2.85:6300
   slots:0-2999 (3000 slots) master
   1 additional replica(s)
M: 2568dbd91fffa16ff93ea8db19275fd7ec8af41a 10.10.2.71:6300
   slots:5462-6461,7461-10922 (4462 slots) master
   1 additional replica(s)
S: 85412cf3d8e69354115fc0991f470b32b9213cd7 10.10.2.70:6301
   slots: (0 slots) slave
   replicates cd1f2c1f348bb4359337e7462c1e21dc82f1551b
S: 89fcc4994a99ed2fe9bbb908c58dfda2cf31e7d2 10.10.2.85:6301
   slots: (0 slots) slave
   replicates e36cdef7a26ed59e8d9db2cf1dbc1997bfc9dfde
S: 1f3ea36eacbe005a4b9ac52aeef6d83337dac051 10.10.2.71:6301
   slots: (0 slots) slave
   replicates 2568dbd91fffa16ff93ea8db19275fd7ec8af41a
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Connecting to node 10.10.2.85:6302: OK
>>> Send CLUSTER MEET to node 10.10.2.85:6302 to make it join the cluster.
Waiting for the cluster to join.
>>> Configure node as replica of 10.10.2.70:6300.
[OK] New node added correctly.

2、10.10.2.71:6300 10.10.2.71:6301のグループをノードから止める
redis-cli -h 10.10.2.71 -p 6301 shutdown

3、10.10.2.85:6302このノードが10.10.2.71:6300のスレーブになっているかどうかを確認する
10.10.2.71:6300> CLUSTER nodes
85412cf3d8e69354115fc0991f470b32b9213cd7 10.10.2.70:6301 slave cd1f2c1f348bb4359337e7462c1e21dc82f1551b 0 1445911596844 17 connected
89fcc4994a99ed2fe9bbb908c58dfda2cf31e7d2 10.10.2.85:6301 slave e36cdef7a26ed59e8d9db2cf1dbc1997bfc9dfde 0 1445911594841 20 connected
2568dbd91fffa16ff93ea8db19275fd7ec8af41a 10.10.2.71:6300 myself,master - 0 0 11 connected 5462-6461 7461-10922
cd1f2c1f348bb4359337e7462c1e21dc82f1551b 10.10.2.70:6300 master - 0 1445911593839 17 connected 3000-5461 6462-7460 10923-16383
2b34532cd6937063d1da26cd4652881b73d97a06 10.10.2.85:6302 slave 2568dbd91fffa16ff93ea8db19275fd7ec8af41a 0 1445911592838 17 connected  #      10.10.2.71:6300 
1f3ea36eacbe005a4b9ac52aeef6d83337dac051 10.10.2.71:6301 slave,fail 2568dbd91fffa16ff93ea8db19275fd7ec8af41a 1445911561982 1445911559778 11 disconnected
e36cdef7a26ed59e8d9db2cf1dbc1997bfc9dfde 10.10.2.85:6300 master - 0 1445911595843 20 connected 0-2999

五、cluster関連コマンド
  
CLUSTER INFO        
CLUSTER NODES              (node),           。
  
CLUSTER MEET     ip   port              ,          。
CLUSTER FORGET         node_id      。
CLUSTER REPLICATE           node_id          。
CLUSTER SAVECONFIG                。
 (slot)
CLUSTER ADDSLOTS  [slot ...]        (slot)  (assign)     。
CLUSTER DELSLOTS  [slot ...]                 。
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)。
 
CLUSTER KEYSLOT      key           。
CLUSTER COUNTKEYSINSLOT      slot           。
CLUSTER GETKEYSINSLOT      count   slot     。

参考記事:
http://www.redis.cn/topics/cluster-tutorial.html
http://www.redis.cn/topics/cluster-spec.html
http://redisdoc.com/topic/cluster-tutorial.html