Redis Cluster原理介绍不在赘述,可以查看官方文档。

这里简单记录一下命令安装步骤。

本次安装在一台机器上,根据端口区分不同进程;配置文件为最简配置。生产上不可以这样安装部署。

主节点

从节点

10.238.162.34:7000

10.238.162.34:7003

10.238.162.34:7001

10.238.162.34:7004

10.238.162.34:7002

10.238.162.34:7005

1 准备节点

配置文件模板,配置从简,其余配置文件只有端口不同,可以通过以下命令快速修改生成其他节点的配置文件。

sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf

#redis-7000.conf 
daemonize yes #后台进程启动
port 7000 #端口号
logfile "7000.log" #日志文件
dir "/server/redis_data" #工作目录
dbfilename "dump-7000.rdb" #RDB文件名称
cluster-enabled yes  #开启集群模式
cluster-config-file nodes-7000.conf #集群配置文件
cluster-require-full-coverage no #部分节点下线的情况下也可以对外提供服务

Cluster参数详解

  • cluster-enabled <yes/no>: 是否启用集群模式,默认是注释掉的,相当于no使用单机模式
  • cluster-config-file <filename>: 集群配置文件名,集群会自动生成和更新这个文件,不建议手动修改,用于记录集群的基本信息,例如状态,持久化变量等等。注意不要和其它配置文件同名,一般使用nodes-6379.conf,6379是使用的端口
  • cluster-node-timeout <milliseconds>: 集群节点的不可用时间(超时时间),超过这个时间就会被认为下线,单位是毫秒,一般是15000毫秒
  • cluster-slave-validity-factor <factor>: 集群主从切换的控制因素之一,需要联合上述cluster-node-timeout参数一起使用。如果设为0,当主节点下线的时候,不管从节点与主节点断开连接的时间有多久,集群都会尝试主从切换。如果该值设为大于0,主从间的最大断线时间会通过node timeout x cluster-node-timeout计算。例如,如果cluster-node-timeout=5000,cluster-slave-validity-factor=10,那么如果一个从节点与主节点断线超过5000x10=50000ms=50s的话,当主节点下线的时候,该从节点都不会被切换为主节点。需要注意的是,如果该值设为非0的话,在一个主节点下线的时候,集群有可能会因为从节点不能进行切换导致不能正常运作。在这种情况下,集群只能在原主节点重新上线连接到集群的时候才能恢复正常运作
  • cluster-migration-barrier <count>: 与同一主节点连接的从节点最少个数,如果实际连接到同一个主节点的从节点个数超过该值,多余的从节点可以被迁移到其它没有从节点连接的主节点
  • cluster-require-full-coverage <yes/no>: 默认值为yes,意思是需要集群内的全部hash slots都正常工作才能接收写命令,如果设为0,那么可以允许部分hash slots下线的情况下继续执行读操作
     

启动节点

redis-server redis-7000.conf 
redis-server redis-7001.conf 
redis-server redis-7002.conf 
redis-server redis-7003.conf 
redis-server redis-7004.conf 
redis-server redis-7005.conf 
redis-server redis-7006.conf

2 节点握手 meet

redis-cli -p 7000 cluster meet 10.238.162.34 7001
redis-cli -p 7000 cluster meet 10.238.162.34 7002
redis-cli -p 7000 cluster meet 10.238.162.34 7003
redis-cli -p 7000 cluster meet 10.238.162.34 7004
redis-cli -p 7000 cluster meet 10.238.162.34 7005

3 分配槽

编写以下脚本分配槽

start=$1
end=$2
port=$3
for slot in `seq  ${start} ${end}`
do
echo "slot:${slot}"
redis-cli -p ${port} cluster addslots ${slot}
done

执行脚本完成槽分配

sh addslots.sh 0 5461 7000
sh addslots.sh 5462 10922 7001
sh addslots.sh 10923 16383 7002

4 主从关系分配

首先查看通过以下命令查看node_id

# redis-cli -p 7000 cluster nodes
bdd0eac7817bfe3f1f3b6870e52fa906375dcd7f 10.238.162.34:7005 master - 0 1547122613598 0 connected
bb8d545d8b49817faa52247d5bf5dd3a4fb22f3b 10.238.162.34:7003 master - 0 1547122611093 5 connected
056d388dc86262914e8243071619255afea72532 10.238.162.34:7004 master - 0 1547122610592 4 connected
563453a9a672a7671fdd28f37416d74f57ae917b 10.238.162.34:7002 master - 0 1547122614600 2 connected 10923-16383
9e1476481ece3c9de7c2aa32f1b87a45ea2e20a4 10.238.162.34:7000 myself,master - 0 0 3 connected 0-5461
7b0ca479d46c59d8056d16b84de3b6136043ccdd 10.238.162.34:7001 master - 0 1547122612596 1 connected 5462-10922

然后分配主从关系

redis-cli -p 7003 cluster replicate 9e1476481ece3c9de7c2aa32f1b87a45ea2e20a4
redis-cli -p 7004 cluster replicate 7b0ca479d46c59d8056d16b84de3b6136043ccdd
redis-cli -p 7005 cluster replicate 563453a9a672a7671fdd28f37416d74f57ae917b

英文文档:https://redis.io/topics/cluster-tutorial

中文文档:http://www.redis.cn/topics/cluster-tutorial.html

Cluster 命令详解:http://www.redis.cn/commands.html#cluster