什么是RedisCluster

Redis3.0之后,Redis官方提供了完整的集群解决方案。 方案采用去中心化的方式,包括:sharding(分区)、replication(复制)、failover(故障转移)。称为RedisCluster。 Redis5.0前采用redis-trib进行集群的创建和管理,需要ruby支持; Redis5.0可以直接使用Redis-cli进行集群的创建和管理。

RedisCluster架构

RedisCluster的特点是去中心化。RedisCluster由多个Redis节点组构成,是一个P2P无中心节点的集群架构,依靠Gossip协议传播的集群。

架构示意图如下:

说明:

redis-cluster把所有的物理节点映射到[0-16383]个slot上,基本上采用平均分配和连续分配的方式。

比如上图中有5个主节点,这样在RedisCluster创建时,slot槽可按下表分配:

节点名称slot范围
Redis10-3270
Redis23271-6542
Redis36543-9814
Redis49815-13087
Redis513088-16383

cluster 负责维护节点和slot槽的对应关系 value------>slot-------->节点。 当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

比如: set name zhaoyun hash("name")采用crc16算法,得到值:1324203551%16384=15903 根据上表15903在13088-16383之间,所以name被存储在Redis5节点。 slot槽必须在节点上连续分配,如果出现不连续的情况,则RedisCluster不能工作。

RedisCluster的优势

高性能

Redis Cluster 的性能与单节点部署是同级别的。 多主节点、负载均衡、读写分离。

高可用

Redis Cluster 支持标准的主从复制配置来保障高可用和高可靠。 failover Redis Cluster 也实现了一个类似 Raft 的共识方式,来保障整个集群的可用性。

易扩展

向 Redis Cluster 中添加新节点,或者移除节点,都是透明的,不需要停机。 水平、垂直方向都非常容易扩展。 数据分区,海量数据,数据存储。

原生

部署 Redis Cluster 不需要其他的代理或者工具,而且 Redis Cluster 和单机 Redis 几乎完全兼 容。

RedisCluster搭建实战

准备工作

RedisCluster最少需要三台主服务器,三台从服务器。端口号分别为:7001~7006。

注意,我们是在一台机器上做伪分布式的集群。本虚拟机的ip地址是:192.168.73.123。

具体步骤

第一步,我们首先进行端口号为7001的redis的安装:

1
2
3
4
5
6
7
8
9
10
cd ~  #到我的用户目录文件夹下面

mkdir redis-cluster/7001 #创建7001文件夹

cd redis-5.0.3/src #切换到redis的源文件的src目录下,要进行编译安装

make install PREFIX=/root/redis-cluster/7001 #安装7001端口对应的redis,到redis-cluster目录下

#复制redis.conf到7001的bin目录下
cp /root/redis-5.0.3/redis.conf /root/redis-cluster/7001/bin

第二步,配置。接下来我们需要编辑7001对应的redis.conf文件,主要修改的内容如下:

1
2
3
port 7001  #端口改为7001
daemonize yes #允许后台运行
cluster-enabled yes #打开这个注释

核心是cluster-enabled yes 这个配置,打开cluster。

第三步,复制7001到7002——7006。

进行复制操作,复制7001到7002——7006,然后分别修改为对应的端口号。

第四步,编写启动脚本。

接下来我们编写一个shell脚本,来执行具体的启动逻辑:

在redis-cluster目录下创建一个名为start.sh的文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cd 7003/bin
./redis-server redis.conf
cd ..
cd ..
cd 7004/bin
./redis-server redis.conf
cd ..
cd ..
cd 7005/bin
./redis-server redis.conf
cd ..
cd ..
cd 7006/bin
./redis-server redis.conf
cd ..
cd ..

然后赋予它写和执行的权限:

1
chmod u+x start.sh 

第五步,启动所有redis实例。

执行start.sh,然后查看redis进程:

可以看到7001——7006这六个实例都在以cluster的方式运行。

创建Redis集群(创建时Redis里不要有数据):

执行下面这条命令:

1
./redis-cli --cluster create 192.168.73.123:7001 192.168.73.123:7002 192.168.73.123:7003 192.168.73.123:7004 192.168.73.123:7005 192.168.73.123:7006 --cluster-replicas 1

说明:

--cluster-replicas 1说明一个master只有一个从机;

create后面的前三个ip表示的是三台主机,后面的三个ip表示的是三台从机。如果--cluster-replicas 1中的1变成2的话,那么表示每台主机有两台从机,那么create后面应该有9个ip,前3个表示主机,后面6个表示从机。

执行效果如下:

执行成功。

我们查看bin目录下的nodes.conf文件:

可以看到slave与master的对应关系:

测试

我们进行测试,如下所示:

注意:

./redis-cli -h 127.0.0.1 -p 7001 -c -c表示以redis集群的方式进行连接。

查看集群状态命令:

cluster info查看集群信息:

cluster nodes查看集群状态:

我们还可以查看nodes.conf文件,nodes.conf文件在每个节点中都有,我们可以查看nodes.conf来看到节点的信息。

总结

我们认识了RedisCluster架构,从头到尾实战搭建了RedisCluster,并进行了简单的测试,对Redis的高可用架构又有了新的认识。