本文基于redis-5.0.3版本,环境为Mac OS,单机器上部署。
Redis Cluster集群搭建
Redis Cluster集群是一个由多个主从节点集群组成的分布式服务集群,它具有复制、高可用和分片特性。Redis Cluster集群需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档可以线性扩展到1000节点。Redis Cluster集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单。
集群的最少节点数是3主3从,新建六个文件夹redis8000 redis8001 redis8002 redis8003 redis8004 redis8005,并将redis.conf文件复制到每个文件夹下,目录结构如下(redis-cluster是我自己建的集群根目录)。
我们先来看下原生命令搭建方式,然后再看下使用Redis提供的--cluster create
命令如何搭建。
一、原生搭建
1、配置开启cluster节点
这里以配置8000端口的实例为例说明,其它实例将文件中的8000替换为对应端口号即可。
bind 10.40.222.186
port 8000
daemonize yes
pidfile /var/run/redis_8000.pid
logfile "redis8000.log"
dbfilename dump8000.rdb
dir /redis-cluster/redis8000
masterauth 123456
requirepass 123456
appendonly yes
appendfilename "appendonly8000.aof"
#集群模式配置
cluster-enabled yes # 启动集群模式
cluster-config-file nodes-8000.conf # 集群配置文件,自动生成 后期勿动
cluster-node-timeout 15000
cluster-replica-validity-factor 10
cluster-require-full-coverage no #部分节点下线的情况下也可以对外提供服务
2、meet
依次启动6个节点,执行cluster nodes
命令,此时会发现每个节点都是孤立的。
使用客户端进入8000节点,执行如下命令,让各节点相互连通:
cluster meet 10.40.222.186 8001
cluster meet 10.40.222.186 8002
cluster meet 10.40.222.186 8003
cluster meet 10.40.222.186 8004
cluster meet 10.40.222.186 8005
再次执行cluster nodes
命令,会发现这些节点联系在了一起。
3、指派槽
Redis 集群中内置了16384个哈希槽,当需要在Redis 集群中放置一个key-value时,redis 会先对key使用crc16算法算出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同的节点。
这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。
1.当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;
2.当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;
这16384个槽位必须要分配完,本次我们搭建的是3主3从结构,所以使用16384/3 求出每个节点需要分配的槽位(这里选8000、8001、8002三个节点作为主节点。)
8000: 0-5461 8001:5462-10922 8002:10923-16383
添加槽位命令cluster addslots solt
,因为命令一次只能添加一个槽位,这里需要借助一个脚本命令来帮助我们分配槽位。
addsolt.sh
start=$1
end=$2
port=$3
for slot in `seq ${start} ${end}`
do
echo "slot:${slot}"
/redis-5.0.3/src/redis-cli -h 10.40.222.186 -p ${port} -a 123456 cluster addslots ${slot}
done
将该文件放在redis-cluster目录下,依次执行命令
sh addslots.sh 0 5461 8000
sh addslots.sh 5462 10922 8001
sh addslots.sh 10923 16383 8002
执行cluster nodes
命令会发现槽位已分配完毕。
4、分配主从
槽位分配完毕后,我们需要把主从关系给建立起来。命令为cluster replicate node-id
,其中node-id代表redis实例的run_id。
至此,Redis Cluster集群搭建完毕。
二、使用Redis提供的--cluster create
命令
1、配置开启cluster节点
初始化文件夹以及配置redis.conf同原生搭建,请参考上文。
2、使用redis-trib.rb命令创建整个redis集群
依次启动6个节点,确认启动成功后,执行如下命令:
../redis-5.0.3/src/redis-cli -a 123456 --cluster create 10.40.222.186:8000 10.40.222.186:8001 10.40.222.186:8002 10.40.222.186:8003 10.40.222.186:8004 10.40.222.186:8005 --cluster-replicas 1
执行cluster nodes
命令,查看集群节点情况,会发现上面一条命令涵盖了原生搭建方式的2、3、4步骤。
至此,Redis Cluster集群搭建完毕。
集群验证
使用集群模式连接到任意redis实例,然后执行设值命令。通过测试结果可以发现如果设置的key通过crc16算法不在当前redis实例的槽位范围,集群会自动重定向,如下图所示: