转自:http://blog.sina.com.cn/s/blog_48c95a190101ig6a.html
去年本博主发表了一篇关于Redis Cluster搭建的博文,因为当时没有找到任何官方的说明文档,所以只能根据Redis主页上的Redis cluster Specification一步步地摸索出了一种搭建方法,可以说是彻彻底底的野路子。后来自己怕误人子弟,还很自觉地在原文中对这一点作了说明。后来某位网友发来一篇博文的链接:http://no-fucking-idea.com/blog/2012/04/16/setting-up-redis-cluster/,其中就是介绍如何使用redis源码包中的redis-trib.rb工具来实现Redis Cluster的搭建,不仅实现方法异常简单而且发表时间也早了一年有余,由此可知自己的那篇博文确实是闭门造车了。最近Redis官网正式推出了支持Redis Cluster的3.0 Beta版,我在官网上也找到了关于Redis Cluster搭建的tutorial,今天按照上面的步骤尝试了一把,果真是极好的!于是乎赶紧发一篇博文,希望已经被俺前一篇博文毒害的弟兄们早日悬崖勒马,回归正道!
首先,下载支持Redis Cluster的源码包,最方便的当然就是直接下载3.0 Beta版,其链接地址为:https://github.com/antirez/redis/archive/3.0.0-beta1.tar.gz。解压安装后,对Redis进行配置,主要就是将cluster功能打开,与Cluster相关的具体配置如下所示。
cluster-enabled yes
cluster-config-file /home/wqd/work/conf/nodes-6379.conf
cluster-node-timeout 5000
此外,这次通过运行在同一台机器上的三个不同Redis实例来搭建Redis Cluster,所以需要准备三个配置文件,每个配置文件中设置不同的端口。这里姑且将这三个配置文件分别命名为redis-6379.conf、redis-6380.conf和redis-6381.conf,其中的配置也是一样,像pid文件、日志文件、rdb文件、aof文件和集群配置文件等都是通过端口号来区分。在完成对配置文件的修改后,分别启动三个Redis实例,结果如图一所示。
图一 启动三个Redis实例
其次,通过redis-trib.rb工具构建Redis Cluster。通过以上操作我们已经有了三个独立运行的Redis实例,彼此之间各自为政,接下来就是redis-trib.rb工具发挥作用的时候了。在执行该工具之前,一些准备工作是必不可少的,其一就是安装ruby和rubygem,为了方便起见这里推荐安装ruby 1.9.2及之后的版本,这些版本已经包含了rubygem,无需单独安装,安装方法这里就不赘述了。
在完成ruby和rubygem的安装之后,我们还需要为ruby安装redis库,安装命令为:gem install redis。在做完了以上这些准备工作后,我们就可以执行redis-trib.rb这个工具了,图二给出了该工具在没有任何参数下的执行结果,其中我们可以了解该工具支持的所有功能,这里就不一一介绍了,官方的tutorial中有详细的介绍。
图二 redis-trib.rb工具使用方法
再次,基于三个实例构建Redis Cluster。上面我们已经看到了redis-trib.rb支持的所有子命令了,而其中用于构建Redis Cluster的子命令就是create。create子命令的参数有两种,host1:port1 ... hostN:portN指定了用于构建Redis Cluster的所有redis实例,而--replicas 则指定了为Redis Cluster中的每个Master节点配备几个Slave节点。关于后一个参数这里需要简单说明一下,那就是Redis Cluster中的节点分为两种:Master节点和Slave节点,一个Master节点可以拥有若干个Slave节点,Master节点上的数据通过异步方式与Slave节点实现数据同步,当Master节点因为某种原因退出集群后,Redis Cluster会自动从该Master节点的Slave节点中选择出一个作为新的Master节点。因此,redis-trib.rb工具的create子命令提供了--args参数来指定集群中的Master节点拥有几个Slave节点,譬如使用6个redis实例构建集群且--args参数值为1,那么整个集群就包含三个Master节点和三个Slave节点,每个Master节点都有一个Slave节点。这里我们只有三个redis实例,所以选择不为Master节点配备Slave节点,创建集群的方法和结果如图三所示,从中可知Redis集群已经构建成功,其中监听6379的实例负责存储0-5460哈希槽,监听6380的实例负责存储5461-10921哈希槽,监听6381的实例负责存储10922-16383哈希槽。
图三 通过redis-trib.rb创建Redis Cluster
如果忘记了Redis Cluster的搭建环境,如集群中有几个节点,这些节点分别负责存储哪些哈希槽,我们可以通过redis-trib.rb工具的check子命令来查看集群信息,该子命令只需要提供集群中任意redis实例的IP地址和端口号即可,图四给出了check子命令的执行方法和结果。
图四 通过redis-trib.rb查看Redis Cluster
最后,通过redis客户端实现对Redis Cluster的读写。当前,redis客户端同样实现了对集群的支持,但使用方法略有不同,
即在启动的时候需要添加一个-c参数
。图五给出了redis客户端的使用方法和执行结果,从中可以看到当读写Key-Value数据所属的哈希槽存储在别的节点上时,redis客户端会将数据自动重定向到目标节点上,而不是像之前那样(即不带-c参数)返回错误并给出目标节点了事。
图五 通过redis客户端实现对Redis Cluster读写
以上我们简单介绍了通过redis-trib.rb工具构建Redis Cluster的方法与步骤,关于redis-trib.rb工具实际上还有很多实用的功能没有介绍,像reshard、add-node、del-node等等,感兴趣地话推荐大家还是去阅读官方的tutorial,其中有详细的说明和示例。
参考链接:http://no-fucking-idea.com/blog/2012/04/16/setting-up-redis-cluster/
http://redis.io/topics/cluster-tutorial