Redis 在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障,但是现在互联网企业动辄大几百G的数据,可完全是没法满足业务的需求,所以,Redis 在 3.0 版本以后就推出了集群模式。
Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 个slot(槽),每个 Redis 实例负责其中一部分 slot 。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。
由于集群至少需要6个节点(3主3从模式),所以,没有这么多机器,现在计划是在一台机器上模拟一个集群,当然,这和生产环境的集群搭建没本质区别。
1、启动Redis多个实例
在Redis安装目录下创建目录clusterconf,并编写redis6380.conf、redis6381.conf、redis6382.conf、redis6390.conf、redis6391.conf、redis6392.conf 6个配置文件,这6个配置文件用来启动6个实例,后面将使用这6个实例组成集群。
以redis6380.conf为例,配置文件需要修改如下几项(其他的conf文件,除了端口,其他的一致)
port 6380(每个节点的端口号) bind 192.168.230.129(绑定当前机器 IP,需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群)
pidfile /var/run/redis_6380.pid (pidfile文件对应6380)
cluster-enabled yes (启动集群模式,把注释#去掉)
cluster-config-file /usr/local/redis/clusterconf/data/nodes-6380.conf (集群的配置文件,6380和port要对应)
cluster-node-timeout 15000 (请求超时,默认15秒,可自行设置)
appendonly yes
集群搭建配置重点就是取消下图中的这三个配置的注释:
分别启动6个实例:
2.创建集群
Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,将它复制到 /usr/local/redis/bin 目录中,可以直接在命令行中使用了
但是这个工具是用 ruby 实现的,所以需要安装 ruby。安装命令如下:
在/usr/local下新建文件夹ruby(mkdir ruby),执行以下命令 ① wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz ② tar -zxvf ruby-2.3.1.tar.gz ③ cd ruby-2.3.1 ④ ./configure -prefix=/usr/local/ruby ⑤ make && make install //过程会有点慢 ⑥ gem install redis --version 3.3.0 //若没有gem需要安装yum install gem -y #由于源的原因,可能下载失败,就手动下载下来安装 ,download地址:http://rubygems.org/gems/redis #gem install -l /data/soft/redis-3.3.0.gem
执行创建集群命令:
../redis-trib.rb create --replicas 1 192.168.230.129:6380 192.168.230.129:6381 192.168.230.129:6382 192.168.230.129:6390 192.168.230.129:6391 192.168.230.129:6392
--replicas 1 表示主从复制比例为 1:1,即一个主节点对应一个从节点,前面的三个为主,后面的三个为从,形式就是ip:port
上图则代表集群搭建成功啦!!!
3.验证一下
登录集群客户端,通过集群命令看一下状态和节点信息等
../redis-cli -c -h 192.168.230.129 -p 6380 加参数 -C 表示已集群的方式连接,因为上面 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略
执行命令 -> set name zhangsan ->执行结果如下:
然后在另外一个master 6382端口,查看 key 为 name 的内容 -> get name ->执行结果如下:
Redis 集群是采用哈希槽 (hash slot)的方式来分配数据的的。
Redis cluster 默认分配了16384个slot,当我们set一个key时,会用CRC16算法来取模得到所属的slot,然后将这个key分到哈希槽区间的节点上,
具体算法就是:CRC16(key)%16384。所以我们在测试的时候看到set和get的时候,直接跳转到了6381端口的节点。
需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。