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命令
参考链接:http://redis.io/topics/cluster-spec

Redis Cluster搭建方法简介22211111相关推荐

  1. Redis高可用集群Redis Cluster搭建

    前言: Redis3.0版本之前,可以通过Redis Sentinel(哨兵)来实现高可用 ( HA ),从3.0版本之后,官方推出了Redis Cluster,它的主要用途是实现数据分片(Data ...

  2. 非常适合新手的redis cluster搭建过程

    Redis集群演进过程 Redis单节点 主从复制: 复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复. 故障恢复无法自动化:写操作无法负载均衡:存储能力受到单机的限制. 哨兵( ...

  3. redis cluster搭建

    环境: 搭建环境为centos7,有外网 IP                           实例端口 192.168.8.28      7000.7001.7002 192.168.8.29 ...

  4. 两台服务器安装redis集群_Redis Cluster搭建高可用Redis服务器集群

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

  5. Redis Cluster 介绍与搭建

    1. Redis Cluster介绍 Redis Cluster是Redis的分布式解决方案,在Redis 3.0版本正式推出的,有效解决了Redis分布式方面的需求.当遇到单机内存.并发.流量等瓶颈 ...

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

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

  7. redis cluster中添加删除重分配节点例子

    redis cluster中添加删除重分配节点例子 作者:用户 来源:互联网 时间:2016-05-05 10:22:27 摘要: 本文讲的是redis cluster中添加删除重分配节点例子, re ...

  8. Jedis实现批量删除redis cluster

    在网上找了好几遍也没找到可以批量删除或者清空redis cluster的方法 我就用jedis写了一个 //获取jedis连接 private JedisCluster jedisCluster=Je ...

  9. Redis cluster集群:原理及搭建

    1.为什么使用redis? redis是一种典型的no-sql 即非关系数据库 像python的字典一样 存储key-value键值对 工作在memory中 所以很适合用来充当整个互联网架构中各级之间 ...

最新文章

  1. 2021年大数据Spark(二十三):SparkSQL 概述
  2. encodeURIComponent编码2次
  3. rs232读取智能电表_没想到物联网电表这么智能!插卡预付费电表该升级了!
  4. 面向对象的关系数据库设计
  5. ‘UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 0: invalid start byte‘成功解决
  6. python编程可以做什么菜_Python 编程! 我是菜菜菜鸟 大家帮帮忙
  7. 微信小程序图片流动动画效果(附代码,图)
  8. MySQL卸载不干净-MySQL Connector Net xxx文件怎么也删除不了?一招解决它
  9. JAVA ZIP解压出现不可预料的压缩文件末端
  10. 图鸟小程序+前后端开源项目
  11. 台式计算机中的CPU指的是,电脑硬件认识之什么是电脑的CPU(cpu详细介绍)
  12. ESMTP协议与SMTP协议
  13. 蓝懿ios网络请求bock
  14. 微软外包人才之道:一流外包团队如何打造
  15. 天道酬勤之Java 实例 - 数组获取最大和最小值
  16. Dell 灵越7559笔记本电脑加M.2固态硬盘
  17. elementui 按钮 表单_仿ElementUI实现一个Form表单的实现代码
  18. SDNU1026 田忌赛马续
  19. 全国计算机报名拍照神器,2021年全国计算机等级报名须知及报名电子照教程
  20. 华为OpenEuler体验系列(16)-显卡驱动安装以及CUDA

热门文章

  1. 洛谷2055 [ZJOI2009]假期的宿舍
  2. 常用的xshell用vi命令编辑文本
  3. LINUX 对引导加密
  4. codevs 2185 最长公共上升子序列--nm的一维求法
  5. win7 ghost 纯净版最新系统下载
  6. asp.net自定义控件的使用
  7. 公司的一些SEO面试题
  8. C#跨线程操作控件的线程安全方法
  9. Java连接Mysql数据库增删改查实现
  10. 输出等边三角形php,php打印三角星星方法实列