本文主要介绍搭建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的配置文件中关于集群的设置如下
#开启集群
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安装路径)
(4)source /usr/local/rvm/scripts/rvm
(5)rvm list known(查看有哪些ruby版本)
这里我选择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分配的信息
输入“yes”进入下一步。这里要注意的是如果一直等待下去,那么查看下redis各个节点的端口是否开放,同时对于每个节点都会有个集群总线节点(redis端口+10000),该端口也要开放。另外,在redis的配置文件中,bind 的配置,主机ip放到回环ip前面(我就是因为这个原因搞了很久)。
集群创建成功会打印下面信息
第四步:测试
经过上面步骤,我们已经成功搭建redis集群,下面我们测试下
(1)当我们向6379master写数据的时候,惊奇的发现
这个原因是因为,set的数据key并不属于6379的slot范围,所以会打印该数据应该set到6380节点,同时也给出了slot=12706
(2)首先我们通过cluster nodes查看当前节点信息
当我们关掉master6379节点后,再次查看节点信息
如果此时我们再次把6384挂机,那么整个redis集群就不能提供服务了,再次尝试set数据就会提示集群下线
(3)除了上面的一个节点的master和slave全部挂机,整个集群不能服务。还有另外一种就是超过半数的master节点同时挂机,此时集群也不能提供服务
(4)每个从节点是不能读写数据的,因为从节点不会分配slot,任意的数据操作都会提示下面信息