Redis Cluster搭建方法简介

(2013-05-29 17:08:57)

 
    Redis Cluster即Redis的分布式版本,将是Redis继支持Lua脚本之后的又一重磅功能,官方声明将会在今年第三季度发布Redis Cluster的beta版并在年底发布第一个稳定版本。当前,虽然Redis的稳定版本里还没有集成分布式功能,但实际上在开发版中Redis Cluster的开发已经取得了长足的进展,我们已经可以搭建Redis集群并使用其部分功能了。今天,本博主基于最新的开发版代码尝试着搭建了一个三节点的Redis集群,这里不妨把过程简单总结一下,希望能对各位看客们有所帮助!(注:本篇博文中的搭建方法是彻彻底底的野路子,Redis官方已正式发布Redis Cluster搭建方法,链接如下:http://redis.io/topics/cluster-tutorial。)
    首先,下载最新的Redis开发版源码包。这个再简单不过了,大家既可以去Redis在github上的主页下载,也可以直接运行“git clone git://github.com/antirez/redis.git”克隆整个Redis代码库,当然前提是你已经安装了git。
    其次,安装Redis。因为本博主要搭建一个三节点的Redis集群,所以在这三个节点上都要安装好Redis,我们这里姑且将这三个节点命名为Redis Cluster Node1/Node2/Node3吧,安装目录为/usr/local/redis/。
    再次,修改Redis配置文件。因为即使是在支持分布式功能的开发版中,Redis配置文件也是默认不打开Redis Cluster的,所以在启动Redis服务器之前,我们需要修改Redis配置文件,打开Redis Cluster。为了简单起见,我们这里只修改与Redis Cluster相关的配置,其他无关的配置均采用默认值,具体修改内容如下:
################################ REDIS CLUSTER  ###############################
#
# 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 Redis instance as a
# cluster node enable the cluster support uncommenting the following:
#
cluster-enabled yes
# Every cluster node has a cluster configuration file. This file is not
# intended to be edited by hand. It is created and updated by Redis nodes.
# Every Redis Cluster node requires a different cluster configuration file.
# Make sure that instances running in the same system does not have
# overlapping cluster configuration file names.
#
cluster-config-file nodes-6379.conf
# Cluster node timeout is the amount of seconds a node must be unreachable
# for it to be considered in failure state.
# Most other internal time limits are multiplicators of the node timeout.
#
cluster-node-timeout 15
# In order to setup your cluster make sure to read the documentation
# available at http://redis.io web site.  
    再次,启动三个节点上的Redis服务器。此时,三个Redis服务器节点均会以Redis Cluster的方式开始运行,但并没有自动构建集群,因为三者还处于“我不认识你,你不属于我”的状态,它们每个都是孤零零的Redis节点,或者是只包含了一个节点的集群。我们可以通过Redis客户端连接到服务器查看它们的状态,图一给出了状态查询方法和查询结果,其中cluster nodes命令用于查看当前Redis节点所属的Redis集群中的所有节点,而cluster info则用于查看当前Redis节点所属的Redis集群的整体状态。由图中我们可以看到,Redis集群中仅包含一个Redis节点,也就是当前节点,整个集群的状态是fail。

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

图二 搭建Redis集群
    再次,为集群中的Redis节点分配hash slot。通过上面的操作,我们已经将三个各自为政的Redis节点规划到一个相同的集群中,那么我们现在是否就已经完成了集群搭建的所有工作了呢?非也!通过图二中对集群状态的查看我们可以知道,当前集群的状态还是fail,此时的Redis集群是不工作的,无法处理任何Redis命令。那么集群的状态为什么还是fail呢?本博主通过查看官方文档说明找到了原因所在,现摘录原文如下:
The FAIL state for the cluster happens in two cases.
1) If at least one hash slot is not served as the node serving it currently is in FAIL state.
2) If we are not able to reach the majority of masters (that is, if the majorify of masters are simply in PFAIL state, it is enough for the node to enter FAIL mode).
    很明显,导致我们的集群处于fail状态的原因不是第二个条,也就是说至少有一个hash slot没有被服务!稍微考虑一下,可不是!何止有一个hash slot没有被服务,压根儿就没有Redis节点为任何hash slot服务!众所周知,Redis Cluster通过hash slot将数据根据主键来分区,所以一条key-value数据会根据算法自动映射到一个hash slot,但是一个hash slot存储在哪个Redis节点上并不是自动映射的,是需要集群管理者自行分配的。那么我们需要为多少个hash slot分配Redis节点呢?根据源码可知是16384个,即我们要将16384个hash slot分配到集群内的三个节点上。Redis中用于分配hash slot的命令有很多,其中包括cluster addslots、cluster delslots和cluster setslot。鉴于我们现在是集群的初始化阶段,所以我们可以选择cluster addslots来分配hash slot,该命令的语法为cluster addslots slot1 [slot2] ... [slotN]。

图三 Redis Cluster Node1上nodes-6379.conf的内容
    但是另一个问题又出现了,对于16384个hash slot来说,我们总不能用cluster addslots一个个去分配吧?幸运的是,我们还有另外一种方法来分配hash slot,那就是通过集群配置文件,也就是我们在第三步中配置的cluster-config-file参数,来完成hash slot的分段配置。此时,我们在执行Redis服务器启动的目录下找到名字为nodes-6379.conf的配置文件。图三给出了Redis Cluster Node1上nodes-6379.conf的内容,由图可知该文件中的内容与我们执行cluster nodes命令得到的结果一样,就是对集群中所有Redis节点的描述,而我们需要修改的就是为每个节点添加上hash slot的分配信息。针对Redis Cluster Node1上nodes-6379.conf的内容,修改内容如下:cda76a0a094d2ce624e33bed7f3c75689a4128fd :0 myself,master - 0 0 connected 0-5000(注意是在自身节点的描述,也就是包含了myself那一行的后面追加hash slot的范围)。类似的,Redis Cluster Node2上nodes-6379.conf文件中追加5001-10000,Redis Cluster Node3上nodes-6379.conf文件中追加10001-16383。经过这样的配置后,Redis Cluster Node1负责存储0至5000之间的所有hash slots,Redis Cluster Node2负责存储5001至10000之间的所有hash slots,Redis Cluster Node3负责存储10001至16383的所有hash slots。
    保存以上修改,通过Redis客户端将三个Redis服务器重启,再次执行命令cluster nodes和cluster info,我们就可以看到集群的状态已经为ok了(如图四所示),这说明之前对于集群配置文件的修改确实起到了作用。如果经过以上步骤之后集群状态依然是fail的话,可以重新修改一下三个节点的nodes-6379.conf,将其中所有除myself那一行以外的所有配置行都删除,然后再保存重启服务器即可。当然,这里需要说明的一点是,本博主并没有看到任何关于Redis Cluster集群配置文件的官方文档,以上配置方法尽管有效但并不一定是官方推荐的做法!

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

图五 执行Redis命令
 

Redis Cluster搭建方法简介22211111的更多相关文章

  1. Redis Cluster搭建高可用Redis服务器集群

    一.Redis Cluster集群简介 Redis Cluster是Redis官方提供的分布式解决方案,在3.0版本后推出的,有效地解决了Redis分布式的需求,当一个节点挂了可以快速的切换到另一个节 ...

  2. 最适合新手的Redis Cluster搭建过程

    好记性不如烂笔头,记录分片高可用Redis Cluster的搭建过程 Redis集群演进过程 Redis单节点 主从复制: 复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复. 故 ...

  3. rabbitmq集群搭建方法简介(测试机linux centos)【转】

    本文将介绍四台机器搭建rabbitmq集群: rabbitmq IP和主机名(每台机器已安装RabbitMQ 3.5.6, Erlang 18.1) 192.168.87.73 localhost73 ...

  4. Ubuntu 16.04在搭建Redis Cluster搭建时,使用gem install redis时出现:ERROR: While executing gem ... (Gem::FilePermissionError) You don't have write permissions for the /var/lib/gems/2.3.0 directory.

    注意:千万不要使用sudo来执行gem install redis. 解决方法: sudo apt-get update sudo apt-get install git-core curl zlib ...

  5. Redis(1.12)Redis cluster搭建常见错误

    [1]gem install redis 报错 redis-cluster安装需要通过gem install redis来安装相关依赖.否则报错.通过gem install redis执行后会出现两个 ...

  6. redis cluster搭建

    一 .准备文件: Ruby :http://www.ruby-lang.org/en/downloads/    redis-3.0.5.tar.gz Redis:http://www.redis.c ...

  7. Redis Cluster 3.0搭建与使用

    Redis Cluster终于出了Stable,这让人很是激动,等Stable很久了,所以还是先玩玩. 一. 集群简单概念. Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施( ...

  8. redis cluster简介和配置(3)

    前面我介绍了 redis sentinel,既然有了sentinel,为什么还要一个cluster呢?因为随着业务量的增加,不可避免要对redis进行扩容,扩容方式一般由2种:1. 垂直扩容 2. 水 ...

  9. redis cluster以及master-slave在windows下环境搭建

    一.redis cluster环境搭建: 1.了解Redis Cluster原理: 详细了解可参考:http://doc.redisfans.com/topic/cluster-tutorial.ht ...

随机推荐

  1. 2748: [HAOI2012]音量调节 bzoj

    Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...

  2. ionic angularJS input 相关指令 以及定时器 的使用

      <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" conte ...

  3. 数据存储单位的换算关系(TB、PB、EB、ZB、YB)

  4. Git和Github简单教程

    原文链接:Git和Github简单教程 网络上关于Git和GitHub的教程不少,但是这些教程有的命令太少不够用,有的命令太多,使得初期学习的时候需要额外花不少时间在一些当前用不到的命令上. 这篇文章 ...

  5. Android 手机怎么录屏制成gif图片

    参考:http://www.cnblogs.com/dasusu/p/4903511.html 上面的博主说的很详细了,但作为学习记录我就重新写一遍帮助自己加深记忆 一.准备条件 1.你搭建了Andr ...

  6. C#-WebForm-ASP开发练习:从数据库中动态添加信息

    传统的ASP开发方式,是C#代码和HTML代码混合在一起,ASP与ASP.NET不是一个东西. <%  %>  -  可以扩起来一段范围,这一段范围之内只能允许编写C#代码 <%= ...

  7. SHOI2016游记&滚粗记&酱油记

    Day0 学校刚期中考完,全科血崩,感觉这次真要考不到一本线了tat 晚上写了个可持久化trie的题,也懒得敲板子(上个礼拜都敲过了),就碎叫了 Day1 上午起床吃饭水群看球,吃完中饭就去考场了. ...

  8. 【Beta】Scrum03

    Info 时间:2016.12.01 21:30 时长:15min 地点:大运村1号公寓5楼楼道 类型:日常Scrum会议 NXT:2016.12.04 21:30 Task Report Name ...

  9. XmlSerializer 对象的Xml序列化和反序列化

    http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...

  10. jquery ripples水波纹效果( 涟漪效果)

    这个效果是我从bootstrap-material-design上面分离下来的,bootstrap-material-design的一些组件样式我不太不喜欢,但是非常喜欢这个水波纹效果,所以就有了这篇 ...