一、Redis Cluster(Redis集群) 简介

redis3.0版本之前只支持单例,在3.0版本及以后才支持集群

redis集群采用p2p模式,是完全去中心化的,不存在中心节点或者代理节点。

redis集群是没有统一的入口的,客户端(Client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制)

每个节点都是一个redis实例。

为了实现集群高可用,即判断节点是否健康(能否正常使用),redis-cluster 有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,

那么这个节点就挂了(fail)。这是判断节点是否挂了的方法。

那么如何判断集群是否挂了呢? 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。

这是判断集群是否挂了的方法。

那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢?  因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了16384[0-16383]

个slot上,或者说把这些slot均等的分发给了各个节点。当需要在Redis集群存放一个数据(key - value)时,redis会先对这个key进行crc16算法,然后得到一个结果。

再把这个结果对16384进行求余,这个余数会对应[0-16383]的其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,

那么就会导致集群无法正常工作。

综上所述,每个redis集群理论上最多可以有16384个节点。

二、集群搭建需要的环境

2.1 Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。

2.2 要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。

现在模拟的是为分布式集群(一台服务器上运行6个redis实例,修改端口号为(7001-7006))

2.3 安装ruby

三、集群搭建具体步骤(注意要关闭防火墙)

3.1 在 /usr/local目录下新建 redis-cluster目录,用于存放集群节点

Redis集群环境搭建

3.2 把redis目录下的bin目录下的所有文件复制到/usr/local/redis-cluster/redis01 目录下,不用担心这里没有redis01 目录,会自动创建的。

Redis集群环境搭建

3.3 删除redis01 目录下的快照文件dump.rdb,并且修改该目录下的redis.cnf文件,具体修改两处地方:一是端口号修改为7001,二是开启集群创建模式,打开注释即可。

Redis集群环境搭建

修改端口号为7001,默认是6379

Redis集群环境搭建

将 cluster-enabled yes 的注释打开

 Redis集群环境搭建

3.4 将 redis-cluster/redis01文件复制5份到redis-cluster目录下(redis02-redis06),创建redis实例,模拟Redis集群的6个节点。

然后将其余5个文件夹下的redis.conf里面的端口号分别修改为7002-7006.

Redis集群环境搭建

分别修改redis.conf 文件端口号为 7002-7006

 Redis集群环境搭建

3.5 接着启动所有的redis节点,由于一个一个启动太麻烦了,所以在这里创建一个批量启动redis节点的脚本文件。命令为start-all.sh。

cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..

3.6 创建好启动脚本之后,需要修改该脚本的权限,使之能够执行,

chmod 755 start-all.sh

3.7 执行start-all.sh 脚本,启动6个节点

3.8 OK.至此6个redis节点启动成功,接下来正式开启搭建集群,以上都是准备条件

其实,以上步骤也就一句话的事情:创建6个redis实例(6个节点)并启动。

要搭建集群的话,需要使用一个工具(脚本文件),这个工具在redis解压文件的源代码里。因为这个工具是一个ruby脚本文件,所以这个工具

的运行需要ruby的运行环境,就相当于java语言的运行需要在jvm上。所以需要安装ruby。

yum install ruby

然后需要把ruby相关的包安装到服务器,我这里用的是redis-3.2.0.gem。redis版本和ruby的版本最好保持一致。

将ruby包安装到服务器:需要先下载再安装。

下载:

wget https://rubygems.org/downloads/redis-3.2.0.gem

Redis集群环境搭建

安装:

gem install redis-3.2.0.gem

3.9 上一步已经把ruby工具所需要的运行环境和ruby包安装好了,接下来需要把这个ruby脚本工具复制到/usr/local/redis-cluster 目录下。

那么这个ruby脚本工具在哪里呢?之前提到过,在redis解压文件的源代码里,即redis/src 目录下的redis-trib.rb文件。

3.10 将该ruby工具(redis-trib.sh)复制到redis-cluster目录下

cp redis-trib.rb /usr/local/redis-cluster

 然后使用该脚本文件搭建集群

./redis-trib.rb create --replicas 1 192.168.218.132:7001 192.168.218.132:7002 192.168.218.132:7003 192.168.218.132:7004 192.168.218.132:7005 192.168.218.132:7006

 注意:此处大家应该根据自己的服务器ip输入对应的ip地址。

中途有个地方需要手动输入yes即可。

至此,Redis集群搭建成功!搭建注意最后一段文字,显示了每个节点所分配的slots(哈希槽),这里总共有6个节点,其中3个是从节点,

所以3个主节点分别映射了0-5460,5461-10922,10933-16383 slots

3.11 最后连接集群节点,连接任意一个即可

redis01/redis-cli -p 7001 -c

注意:一定要加上 -c,不然节点之间是无法自动跳转的。这样,存储的数据(key-value)是均匀分配到不同的节点的。

 3.12 最后加上两条redis集群基本命令

1、查看当前集群信息

cluster info

2、查看集群里有多少个节点

cluster nodes