Redis Cluster是一个高性能高可用的分布式系统。由多个Redis实例组成的整体,数据按照一致性哈希算法存储分布在多个Redis实例上,并对使用虚拟槽(Slot)对一致性哈希算法进行改进,通过Gossip协议来进行节点之间通信。

关于一致性哈希,可以看这篇文章 http://www.zsythink.net/archives/1182

Redis集群一般由多个节点组成,节点数量至少为6个(3主3从)才能保证组成完整高可用的集群。

具体操作步骤:

# 准备各节点配置文件
[root@VM_41_201_centos redis.d]# ls -l
总用量 344
-rw-r--r-- 1 root root 46748 5月   7 15:36 redis-6379.conf
-rw-r--r-- 1 root root 46748 5月   7 15:41 redis-6380.conf
-rw-r--r-- 1 root root 46748 5月   7 15:42 redis-6381.conf
-rw-r--r-- 1 root root 46748 5月   7 15:43 redis-6382.conf
-rw-r--r-- 1 root root 46748 5月   7 15:43 redis-6383.conf
-rw-r--r-- 1 root root 46748 5月   7 15:44 redis-6384.conf
-rw-r--r-- 1 root root 46730 5月   7 14:30 redis.conf
-rw-r--r-- 1 root root  7355 5月   7 14:30 redis-sentinel.conf
# 启动各redis节点
[root@VM_41_201_centos redis.d]# redis-server redis-6379.conf
[root@VM_41_201_centos redis.d]# redis-server redis-6380.conf
[root@VM_41_201_centos redis.d]# redis-server redis-6381.conf
[root@VM_41_201_centos redis.d]# redis-server redis-6382.conf
[root@VM_41_201_centos redis.d]# redis-server redis-6383.conf
[root@VM_41_201_centos redis.d]# redis-server redis-6384.conf
[root@VM_41_201_centos redis.d]# ps -ef | grep redis
root       475     1  0 15:44 ?        00:00:00 redis-server 127.0.0.1:6379 [cluster]
root       494     1  0 15:44 ?        00:00:00 redis-server 127.0.0.1:6380 [cluster]
root       498     1  0 15:44 ?        00:00:00 redis-server 127.0.0.1:6381 [cluster]
root       502     1  0 15:44 ?        00:00:00 redis-server 127.0.0.1:6382 [cluster]
root       506     1  0 15:44 ?        00:00:00 redis-server 127.0.0.1:6383 [cluster]
root       565     1  0 15:45 ?        00:00:00 redis-server 127.0.0.1:6384 [cluster]
root       576 31779  0 15:45 pts/1    00:00:00 grep --color=auto redis
root     28350 27811  0 14:35 pts/0    00:00:00 vim redis-6379.conf
# 各节点握手,建立集群(此时未分配slot,处于fail状态,还不能正常工作)
127.0.0.1:6379>cluster meet 127.0.0.1 6380
127.0.0.1:6379>cluster meet 127.0.0.1 6381
127.0.0.1:6379>cluster meet 127.0.0.1 6382
127.0.0.1:6379>cluster meet 127.0.0.1 6383
127.0.0.1:6379>cluster meet 127.0.0.1 6384
# 执行addslots.sh,手动为各节点添加slot
[root@VM_41_201_centos redis.d]# ./addslots.sh 6379 0 5461
...
[root@VM_41_201_centos redis.d]# ./addslots.sh 6380 5462 10922
...
[root@VM_41_201_centos redis.d]# ./addslots.sh 6381 10923 16383
...
# 再次查看cluster info信息
[root@VM_41_201_centos redis.d]# redis-cli -p 6379 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:2
cluster_stats_messages_sent:24495
cluster_stats_messages_received:24495
# 再次查看cluster nodes信息
[root@VM_41_201_centos redis.d]# redis-cli -p 6379 cluster nodes
5a6b4ea16d2064c7298acda98fb2984eb3c784b6 127.0.0.1:6383 master - 0 1494155309857 4 connected
ac9c04d13e3c6fd8dbce0333679345da6583b1ca 127.0.0.1:6381 master - 0 1494155312871 3 connected 10923-16383
54d92a13eca6aeb2bd4a0c0a51a59250133d833a 127.0.0.1:6379 myself,master - 0 0 2 connected 0-5461
0d50552bab86a522937a7943f0843d86945e2894 127.0.0.1:6380 master - 0 1494155311864 1 connected 5462-10922
d0de26e8ec68996f404091e729688b41c5068231 127.0.0.1:6382 master - 0 1494155307847 5 connected
e3b11cd3ec0e4d6f67d010dd9cf2a3dabf6030f9 127.0.0.1:6384 master - 0 1494155313883 0 connected
# 简单测试
[root@VM_41_201_centos redis.d]# redis-cli -p 6379 set hello redis
OK
[root@VM_41_201_centos redis.d]# redis-cli -p 6379 get hello
"redis"
[root@VM_41_201_centos redis.d]#

至此,模拟的3主3从的cluster集群就创建成功了。

redis实例配置文件关于cluster的主要配置项:

#节点端口
port 6379
# 开启集群模式
cluster-enabled yes
# 节点超时时间, 单位毫秒
cluster-node-timeout 15000
# 集群内部配置文件
cluster-config-file "nodes-6379.conf"

addslots.sh:

#!/bin/bash
# cluster addslots(循环添加)
# $1:port
# $2:start
# $3:end
for((i=$2;i<=$3;i++))
do
        redis-cli -h 127.0.0.1 -p $1 cluster addslots $i
done