单个redis的安装与启动:项目学习记录-Redis的安装与启动
以及redis的数据类型与存储指令:项目学习记录-缓存数据类型与持久化

Redis集群

有多个redis节点构成的缓存结构。每个节点通过ping-pong机制通信,客户端只需要连上集群中的任意一个节点即可。

且每个redis节点的缓存数据都不相同,也不同担心其中一个节点蹦掉的问题。redis允许设置备份节点,来防止节点崩塌的问题。而且,redis集群存在通票容错机制确保redis节点不被误认为挂了,即当redis集群中,超过半数的节点ping某个节点不通时,才会认为该节点崩塌。

slot : 槽
redis集群一共有16384个哈希槽,redis cluster会根据节点的数量和服务器的性能分配这些槽,使得相应的槽负责相关的节点。即当客户端需要缓存数据时,cluster会拿缓存数据的key根据CRC16算法生成一个数值,再将这个数值对16384取余,得到的一个槽值,这个值就决定这个缓存数据会被缓存到哪个redis节点。

例如:

server1的槽为:0-5000 
 server2的槽为:5001-1000 
 server3的槽为:10001-16383 
 hello的key根据crc16算法的到数值对16384取余得500,所以存放到server1. 
 同理,hello2存放到server3

.

集群的搭建

为了实现投票容错机制,且每个节点至少有一个备份节点。所以我们总共需要6个redis节点。
根据项目学习记录-Redis的安装与启动,我们已经存在一个单机版的redis节点。

  1. 将bin目录拷贝,并修改名字

    cp -rf bin redis01
  2. 修改其中热redis.conf配置
1.  – cluster-enabled为yes; 
 – port为7001; 
 – bind: [redis所在服务器IP] 127.0.0.1 
eg bind:192.168.25.133 127.0.0.1
  1. 创建redis-cluster目录,并将redis01复制六份,分别改名为redis01-06
cp -rf redis01 redis06

并修改每个文件中的redis.conf的port分别为7001-7006

  1. 再在redis-cluster目录下创建批处理启动多个redis
vim  
 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
  1. 然后 esc : wq 保存退出。
  2. 添加start-all的当前用户可执行权限
chmod  u+x  
  1. 启动并检查
    – 启动 ./
    – 检查 ps -ef|grep reids
  2. redis连不上服务器 redis连不上可能的原因_服务器

yum install ruby 
 yum install rubygems
  1. 接着使用ruby脚本搭建集群
    i. 先进入redis的源代码目录,将后缀为rb的文件复制到redis-clustser中。
    这就是一个ruby的脚本,需要ruby的环境才能执行。
    ii. 先安装ruby环境
  2. 在安装第三方包,redis-3.0.0.gem
gem install redis-3.0.0.gem
  1. 【该命令会把gem安装到redis中】iii. 执行该脚本。
进入redis-cluster目录,执行命令 
 ./redis-trib.rb create –replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006 
 relicas参数会根据后面的1计算:每个节点一个备份机的方式去分槽

  1. PS:其中ip按照你redis.conf配置的bind来。
    中间输入yes.

    redis连不上服务器 redis连不上可能的原因_redis连不上服务器_02

  2. 三个M为主机,三个S为备份机。slot为所分他们的槽。
    【关闭防火墙:因为redis除了用到了你看到的这些7001-7006的端口还有用到了17001-17006的端口】

遇到的问题

  • 问题1:
在执行rb时: ./redis-trib.rb…… 
 报错:/usr/local/rvm/gems/ruby-2.4.2/gems/redis-4.0.1/lib/redis/client.rb:119:in 
 `call’: ERR Slot 0 is already busy (Redis::CommandError)

slot插槽被占用了(这是搭建集群前时,以前redis的旧数据和配置信息没有清理干净。)
解决方案是:
用redis-cli 登录到每个节点执行 flushall 和 cluster reset 就可以了。
./ -h ip -p port (更换IP)

  • 问题2:

bind 参数
开始看了很多博文之类的,有说直接配置0.0.0.0(这个可以连接,但是会接受所以的连接请求,不安全)。
有说是需要绑定请求端的IP地址, 这个完全就连不上了。

自己试了才知道,正确的是配置redis所在服务器的IP地址。 如果服务器有客户端需要连此redis的话,要加配上127.0.0.1

bind redis服务端所在IP 127.0.0.1

其实还碰到了一些琐碎的问题,有的解决了,有的还没有解决。。很奇怪

  • 有一个属于网络问题,有一个虚拟机,能ping同其他虚拟机,也能ping通网关,但是其他虚拟机ping不通他,网络连接方式是使用NAT,也确定关了防火墙。
  • 在执行./redis-trib.rb……时,一直停在waiting for the cluster to join………..
    我查了,说是没有关防火墙的原因,可是确实都关了,用的ubuntu服务器,现在换成centos就可以了。
  • 还有开始在安装redis时,执行以下指令时,
    make install PREFIX=/usr/redis/
    报错:
[root@bogon redis-3.2.11]# make install PREFIX =/usr/redis 
 make: * empty variable name. Stop. 
 原来是指令中间多了个空格 - -!
  • make install PREFIX=/usr/redis

基本上就是这样了,其中bind这个配置着实是被误导的很久,试了很多都连不上!

总体上,觉得还是需要再细心些。