Redis在3.0以后版本推出的redis cluster 集群方案,redis cluster集群保证了高可用、高性能、高可扩展性。


01

原理

  •  在Redis集群中,所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

  •  节点的fail是通过集群中超过半数的节点检测失效时才生效.

  •  客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

  •  redis-cluster把所有的物理节点映射到[0-16383]slot,cluster 负责维护。

    注意:在Redis集群中内置了16384个槽,当需要在Redis集群上设置一个key-value时候,会通过CRC16算法计算出key的值,然后对16384取余。Redis通过这种方法将数据均匀的存储在每个Redis节点上。(想想Hash一致性)

    Redis集群的容错机制有两种,分别是节点失效判断和集群失效判断。

Redis高级篇(一)Cluster集群_java

  • 节点失效判断:集群中所有master参与投票,如果半数以上master节点与其中一个master节点通信超过(cluster-node-timeout),认为该master节点挂掉。

  •  集群失效判断:如果集群任意master挂掉,且当前master没有slave,则集群进入fail状态。也可以理解成集群的[0-16383]slot映射不完全时进入fail状态。如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态。

02


搭建

      搭建Redis集群其实是比较简单的,我们首先在本地复制几份Redis的启动文件夹,分别为7001,7002......7006。

     每个文件夹就是一个Redis实例,我们分别修改其中的端口为7001,7002......7006。同时,配置启动集群的cluster-enabled参数为yes。

      其次,我们需要按照Ruby环境,这个过程很容易。然后,我们首先启动上面6个Redis进程。接着,我们使用ruby脚本(来源于源码文件夹下)启动集群。

     命令如下:

./redis-trib.rb create --replicas 1 192.168.126.134:7001 192.168.126.134:7002 192.168.126.134:7003 192.168.126.134:7004 192.168.126.134:7005  192.168.126.134:7006

      通过上面的方式,将这6个实例进行3主3从节点分配。上面--replicas后面参数1代表每个主节点配置一个从节点。如果设置为2,那么集群结果就是2主4从(其中每个主节点下面2个从节点)。

Redis高级篇(一)Cluster集群_java_02

     接着,我们使用客户端连接其中一个Redis节点。连接命令使用集群方式,如下:

Redis高级篇(一)Cluster集群_java_03

     连接成功,我们设置一个key1的值为value1。Redis集群计算出来的结果应该在9189槽,然后进行重定向到7002的Redis上。

     

      当然了,如果想要迁移节点(比如节点宕机),通过上面的ruby脚本 即可实现节点的添加、删除、迁移等操作。本文不做过多介绍。