Redis集群搭建
- 前言
注意:redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群,我这里用的是redis5.0.7版本;
1.1 redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;
1.2 什么时候整个集群不可用?
a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态。
b:如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.
1.3 Redis是内存服务器,使用Redis可以减少IO访问量,提供系统并发访问效率。在高可用方面,Redis提供集群技术,在Redis3.0之前使用哨兵和主从复制技术解决高可用问题,在Redes3.0之后采用数据分区存储到不同的插槽技术,每组插槽由一个Redis主节点托管,主节点与多个从节点数据同步的方式实现高可用。如下图:
1.4 redis cluster slots(群集插槽)数量 为何是16384(2的14次方)
很幸运的是,这个问题,作者是给出了回答的!
地址如下: https://github.com/antirez/redis/issues/2576
- 集群搭建需要的环境
Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群;
要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。因为我没有那么多服务器,也启动不了那么多虚拟机,所在这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(7001-7006),当然实际生产环境的Redis集群搭建和这里是一样的。
- 搭建具体步骤(注意要关闭防火墙)
3.1 在usr/local目录下新建redis-cluster目录,用于存放集群节点
3.2 把redis目录下的bin目录下的所有文件复制到/usr/local/redis-cluster/redis01目录下,不用担心这里没有redis01目录,会自动创建的。操作命令如下:
cp -r /usr/local/redis-5.0.7/bin/ /usr/local/redis-cluster/redis01
3.3 修改该目录下的redis.cnf文件,具体修改两处地方:一是端口号修改为7001,二是开启集群创建模式,打开注释即可。如下图所示:
3.4 将redis-cluster/redis01文件复制5份到redis-cluster目录下(redis02-redis06),创建6个redis实例,模拟Redis集群的6个节点。然后将其余5个文件下的redis.conf里面的端口号分别修改为7002-7006。
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 +x start-all.sh
3.7 执行start-all.sh脚本,启动6个redis节点
命令:./start-all.sh
以上创建6个redis实例(6个节点)并启动成功。
3.8 ruby安装
要搭建集群的话,需要使用一个工具(脚本文件),这个工具在redis解压文件的源代码里。因为这个工具是一个ruby脚本文件,所以这个工具的运行需要ruby的运行环境,就相当于java语言的运行需要在jvm上。所以需要安装ruby,指令如下:yum install ruby
然后需要把ruby相关的包安装到服务器,我这里用的是redis-4.1.4.gem,大家需要注意的是:redis的版本和ruby包的版本最好保持一致(我这里没找到5.0.7的版本)。下载地址:https://rubygems.org/gems/redis/versions
安装命令如下:gem install redis-3.0.0.gem
3.9 这个ruby脚本工具在哪里呢?之前提到过,在redis解压文件的源代码里,即redis/src目录下的redis-trib.rb文件。
3.10 将该ruby工具(redis-trib.rb)复制到redis-cluster目录下,指令如下:
cp redis-trib.rb /usr/local/redis-cluster/
然后使用该脚本文件搭建集群,指令如下:
./redis-trib.rb create --replicas 1 192.168.0.152:7001 192.168.0.152:7002 192.168.0.152:7003 192.168.0.152:7004 192.168.0.152:7005 192.168.0.152:7006
发生警告:redis-trib.rb不再可用!
您应该改用redis cli。
执行提示的语句命令:
注意!注意!:这里要输入 yes 而不是y,
不确认后期使用报错:Can I set the above configuration? (type 'yes' to accept): 就是这个错误引起的分配槽失败
至此,Redi集群搭建成功!大家注意最后一段文字,显示了每个节点所分配的slots(哈希槽),这里总共6个节点,其中3个是从节点:7004 7005 7006 3个主节点:7001 7002 7003
3.11 最后连接集群节点,连接任意一个测试即可:
redis01/redis-cli -p 7001 -c(一定要加上-c,不然节点之间是无法自动跳转的)
- 关于卡槽值如何计算并分配写入数据
CRC16算法
具体算法:CRC16(key) % 16384
redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster负责维护node<->slot<->value。
Redis集群预分好16384个桶,当需要在Redis集群中放置一个key-value 时,【根据CRC16(key) mod 16384的值,决定将一个key放到哪个桶中】。
补充:配置具体每台服务器的主从关系