RedisCluster即Redis的分布式版本,将是Redis继支持Lua脚本之后的又一重磅功能,官方声明将会在今年第三季度发布RedisCluster的beta版并在年底发布第一个稳定版本。当前,虽然Redis的稳定版本里还没有集成分布式功能,但实际上在开发版中RedisCluster的开发已经取得了长足的进展,我们已经可以搭建Redis集群并使用其部分功能了。今天,本博主基于最新的开发版代码尝试着搭建了一个三节点的Redis集群,这里不妨把过程简单总结一下,希望能对各位看客们有所帮助!(注:本篇博文中的搭建方法是彻彻底底的野路子,Redis官方已正式发布RedisCluster搭建方法,链接如下:http://redis.io/topics/cluster-tutorial。)


  首先,下载最新的Redis开发版源码包。这个再简单不过了,大家既可以去Redis在github上的主页下载,也可以直接运行“gitclonegit://github.com/antirez/redis.git”克隆整个Redis代码库,当然前提是你已经安装了git。


  其次,安装Redis。因为本博主要搭建一个三节点的Redis集群,所以在这三个节点上都要安装好Redis,我们这里姑且将这三个节点命名为RedisCluster Node1/Node2/Node3吧,安装目录为/usr/local/redis/。


  再次,修改Redis配置文件。因为即使是在支持分布式功能的开发版中,Redis配置文件也是默认不打开RedisCluster的,所以在启动Redis服务器之前,我们需要修改Redis配置文件,打开RedisCluster。为了简单起见,我们这里只修改与RedisCluster相关的配置,其他无关的配置均采用默认值,具体修改内容如下:


###############################


# 
 
 
 

   # Normal Redis instances can't be part of a Redis Cluster;only nodes that are 
 
 
 

   # started as cluster nodes can. In order to start a Redisinstance as a 
 
 
 

   # cluster node enable the cluster support uncommenting thefollowing:


#



cluster-enabled yes


# Every cluster node has a cluster configuration file. Thisfile is not 
 
 
 

   # intended to be edited by hand. It is created and updated byRedis nodes. 
 
 
 

   # Every Redis Cluster node requires a different clusterconfiguration file. 
 
 
 

   # Make sure that instances running in the same system does nothave 
 
 
 

   # overlapping cluster configuration file names.


#



cluster-config-filenodes-6379.conf


# Cluster node timeout is the amount of seconds a node must beunreachable


# for it to be considered in failure state.


# Most other internal time limits are multiplicators of thenode timeout.

#



cluster-node-timeout15


# In order to setup your cluster make sure to read thedocumentation




  再次,启动三个节点上的Redis服务器。此时,三个Redis服务器节点均会以RedisCluster的方式开始运行,但并没有自动构建集群,因为三者还处于“我不认识你,你不属于我”的状态,它们每个都是孤零零的Redis节点,或者是只包含了一个节点的集群。我们可以通过Redis客户端连接到服务器查看它们的状态,图一给出了状态查询方法和查询结果,其中clusternodes命令用于查看当前Redis节点所属的Redis集群中的所有节点,而clusterinfo则用于查看当前Redis节点所属的Redis集群的整体状态。由图中我们可以看到,Redis集群中仅包含一个Redis节点,也就是当前节点,整个集群的状态是fail。


Redis <wbr>Cluster搭建方法简介

图一 未形成集群时Redis节点状态


  再次,搭建Redis集群。这里所谓的搭建集群,说白了就是让之前启动的三个Redis节点彼此连通,意识到彼此的存在,那么如何做到这一点呢?答案就是clustermeet命令。该命令的作用就是将当前节点主动介绍给另外一个节点认识,图二给出了clustermeet命令的执行方法和执行效果,由图中可知我们使用cluster meet命令分别将Redis ClusterNode1介绍给了Redis Cluster Node2(节点IP地址为192.168.32.3,运行端口为6379)和RedisClusterNode3(节点IP地址为192.168.32.4,运行端口为6379),之后我们再次查看集群节点和集群状态就可以知道,三个节点已经成功合并到了同一个集群中。


Redis <wbr>Cluster搭建方法简介

图二 搭建Redis集群


 


The FAIL state for the cluster happens in two cases.



1) If at least one hash slot is not served as the node servingit currently is in FAIL state.



2) If we are not able to reach the majority of masters (thatis, if the majorify of masters are simply in PFAIL state, it isenough for the node to enter FAIL mode).


  很明显,导致我们的集群处于fail状态的原因不是第二个条,也就是说至少有一个hashslot没有被服务!稍微考虑一下,可不是!何止有一个hash slot没有被服务,压根儿就没有Redis节点为任何hashslot服务!众所周知,Redis Cluster通过hashslot将数据根据主键来分区,所以一条key-value数据会根据算法自动映射到一个hash slot,但是一个hashslot存储在哪个Redis节点上并不是自动映射的,是需要集群管理者自行分配的。那么我们需要为多少个hashslot分配Redis节点呢?根据源码可知是16384个,即我们要将16384个hashslot分配到集群内的三个节点上。Redis中用于分配hash slot的命令有很多,其中包括clusteraddslots、cluster delslots和clustersetslot。鉴于我们现在是集群的初始化阶段,所以我们可以选择cluster addslots来分配hashslot,该命令的语法为 cluster  addslots slot1 [slot2]... [slotN]。


Redis <wbr>Cluster搭建方法简介

图三 Redis ClusterNode1上nodes-6379.conf的内容


  但是另一个问题又出现了,对于16384个hash slot来说,我们总不能用clusteraddslots一个个去分配吧?幸运的是,我们还有另外一种方法来分配hashslot,那就是通过集群配置文件,也就是我们在第三步中配置的cluster-config-file参数,来完成hashslot的分段配置。此时,我们在执行Redis服务器启动的目录下找到名字为nodes-6379.conf的配置文件。图三给出了RedisCluster Node1上nodes-6379.conf的内容,由图可知该文件中的内容与我们执行clusternodes命令得到的结果一样,就是对集群中所有Redis节点的描述,而我们需要修改的就是为每个节点添加上hashslot的分配信息。针对 Redis ClusterNode1上nodes-6379.conf的内容,修改内容如下: cda76a0a094d2ce624e33bed7f3c75689a4128fd :0myself,master - 0 0 connected 0-5000 (注意是在自身节点的描述,也就是包含了myself那一行的后面追加hashslot的范围)。 类似的, Redis ClusterNode2上nodes-6379.conf文件中追加5001-10000 , Redis ClusterNode3上nodes-6379.conf文件中追加10001-16383 。经过这样的配置后,Redis ClusterNode1负责存储0至5000之间的所有hash slots,Redis ClusterNode2负责存储5001至10000之间的所有hash slots,Redis ClusterNode3负责存储10001至16383的所有hash slots。


 


Redis <wbr>Cluster搭建方法简介

图四 修改集群配置文件后重启的集群状态


  最后,执行Redis命令。在集群状态显示为ok之后,我们就可以像在Redis单机版上一样执行Redis命令了。图五显示了Redis客户端连接到RedisCluster Node1上执行“set foo bar”命令的执行结果,由图可知主键foo所属的hash slot存储在RedisCluster Node3上。我们再连接到Redis Cluster Node3,执行相同的命令,正确执行!


Redis <wbr>Cluster搭建方法简介