本文主要介绍搭建redis的集群架构,其中会记录搭建遇到的坑。在之前的哨兵模式下,我们做到了高可用阶段,哨兵模式同样也存在一些不足之处,比如写数据在固定的master节点,就算有多个master节点,master之间也要有通信来同步数据,这些都给master增加一定的压力。

redis的集群模式思想之给每个master节点分配一定数量的slot(共16384个),set数据的时候,根据CRC16(key) mode 16384计算出分配到哪个slot,在高并发下将数据读写分散到不同的master到达分布式的效果,这一过程很像hashmap的存取方式。

下面我们会从零一步步搭建redis集群模式,此时默认你已经会搭建redis复制和哨兵模式,因为redis集群会用到部分相同的知识点。

redis集群要求必须有6个节点才可以搭建,所以我们使用两台服务器,6个redis,服务器:

(1)192.168.121.139:6379

(2)192.168.121.139:6380

(3)192.168.121.139:6383

(4)192.168.121.140:6381

(5)192.168.121.140:6382

(6)192.168.121.140:6384

首先,整个结构图如下面所示,大脑有个概念图

redis 集群需要配置 redis配置集群模式_集群

第一步:配置并启动redis各个节点
在复制模式基础上,再次添加上redis的配置文件中关于集群的设置如下

#开启集群
cluster-enabled yes
#集群的配置文件,自动生成,不需要手动创建
cluster-config-file nodes-6381.conf
#断定为节点下线的超时时间
cluster-node-timeout 15000

启动6个redis节点,这里需要注意的是,如果节点工作目录下有rdb或aof文件,需要将其删除,否则创建集群会失败。

第二步:创建redis集群

我是用的redis版本是4.0的,内部提供了创建集群的命令,redis-trib.rb,这个命令的执行依赖于ruby,所以我们需要安装ruby(这里是使用rvm下载ruby的)。下面的安装步骤按照顺序执行即可。

(1)gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

(2)curl -sSL https://get.rvm.io | bash -s stable

(3)find / -name rvm -print(打印rvm安装路径)

redis 集群需要配置 redis配置集群模式_redis 集群需要配置_02


(4)source /usr/local/rvm/scripts/rvm

(5)rvm list known(查看有哪些ruby版本)

redis 集群需要配置 redis配置集群模式_rvm_03


这里我选择2.5.1版本的。

(6)rvm install 2.5.1(这一步骤时间有点长)

(7)rvm use 2.5.1(使用该版本的,机器重启会还原)

(8)rvm use 2.5.1 --default(设置默认版本,机器重启不会还原)

(9)ruby --version(查看ruby版本)

(10)gem install redis(安装集群相关依赖)

第三步:创建集群
执行下面的命令

./redis-trib.rb create --replicas 1 192.168.121.139:6379 192.168.121.139:6380 192.168.121.139:6383 192.168.121.140:6381 192.168.121.140:6382 192.168.121.140:6384

–replicas 1:表示每个master有一个从节点,所以形成3主3从

执行完上面的命令,立马会打印主从节点和slot分配的信息

redis 集群需要配置 redis配置集群模式_集群_04


输入“yes”进入下一步。这里要注意的是如果一直等待下去,那么查看下redis各个节点的端口是否开放,同时对于每个节点都会有个集群总线节点(redis端口+10000),该端口也要开放。另外,在redis的配置文件中,bind 的配置,主机ip放到回环ip前面(我就是因为这个原因搞了很久)。

集群创建成功会打印下面信息

redis 集群需要配置 redis配置集群模式_redis 集群需要配置_05

第四步:测试

经过上面步骤,我们已经成功搭建redis集群,下面我们测试下

(1)当我们向6379master写数据的时候,惊奇的发现

redis 集群需要配置 redis配置集群模式_redis集群_06


这个原因是因为,set的数据key并不属于6379的slot范围,所以会打印该数据应该set到6380节点,同时也给出了slot=12706

(2)首先我们通过cluster nodes查看当前节点信息

redis 集群需要配置 redis配置集群模式_rvm_07


当我们关掉master6379节点后,再次查看节点信息

redis 集群需要配置 redis配置集群模式_集群_08


如果此时我们再次把6384挂机,那么整个redis集群就不能提供服务了,再次尝试set数据就会提示集群下线

redis 集群需要配置 redis配置集群模式_redis集群_09


(3)除了上面的一个节点的master和slave全部挂机,整个集群不能服务。还有另外一种就是超过半数的master节点同时挂机,此时集群也不能提供服务

(4)每个从节点是不能读写数据的,因为从节点不会分配slot,任意的数据操作都会提示下面信息

redis 集群需要配置 redis配置集群模式_集群_10