Redis的集群安装以及rehash重新迁移教程指南

原创 2017年07月02日 20:18:38

1. Redis的cluster集群

在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子。最核心的目标有三个:

  • 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式、异步复制、客户端重定向等设计,而牺牲了部分的一致性、使用性。
  • 可用性:在Cluster推出之前,可用性要靠Sentinel保证。有了集群之后也自动具有了Sentinel的监控和自动Failover能力。
  • 水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点。

redis Cluster集群功能推出已经有一段时间了。在单机版的Redis中,每个Master之间是没有任何通信的,所以我们一般在Jedis客户端或者Codis这样的代理中做Pre-sharding。按照CAP理论来说,单机版的Redis属于保证CP(Consistency & Partition-Tolerancy)而牺牲A(Availability),也就说Redis能够保证所有用户看到相同的数据(一致性,因为Redis不自动冗余数据)和网络通信出问题时,暂时隔离开的子系统能继续运行(分区容忍性,因为Master之间没有直接关系,不需要通信),但是不保证某些结点故障时,所有请求都能被响应(可用性,某个Master结点挂了的话,那么它上面分片的数据就无法访问了)。

有了Cluster功能后,Redis从一个单纯的NoSQL内存数据库变成了分布式NoSQL数据库,CAP模型也从CP变成了AP。也就是说,通过自动分片和冗余数据,Redis具有了真正的分布式能力,某个结点挂了的话,因为数据在其他结点上有备份,所以其他结点顶上来就可以继续提供服务,保证了Availability。然而,也正因为这一点,Redis无法保证曾经的强一致性了。这也是CAP理论要求的,三者只能取其二。

2. 配置选项以及启动

设置3个节点,将enable-cluster 设置为yes, 修改cluster-config-file nodes-6379.conf,将其设置为不同的文件即可,无需此nodes文件存在。
修改redis.conf配置文件的内容:

cluster-enabled yes
cluster-config-file nodes-6379.conf

其中node-6739.conf并不要求真实存在,只要不同的redis实例不相同即可。
然后分别启动各个redis的实例,然后查看进程:
这里写图片描述

从图中可以发现,其中的进程后面都带有cluster的字样,标示其为cluster集群状态。
这里启动了3个实例: 6379, 6380, 6381.

3. 设置集群节点

 这里一般需要基于redis-cli进入命令行参数,然后输入cluster meet的命令,进行cluster的注册:
 这里写图片描述

这里我们从6379这个实例登陆,分别注册6380, 6381两个节点。注册完成后,然后查看集群信息,可以发现其整个集群的信息为3个节点。

4. 创建shell脚本,初始化slots

创建初始化slot的脚本:

>
#!/bin/bash
for i in {1..16383}; do ./src/redis-cli cluster addslots $i; done

在脚本里面总共添加16383个slot。 
修改该脚本的执行权限,执行之,即可获取相应的结果信息。

5. 查看slots的内容

cluster slots : 查看slots信息
cluster nodes: 查看节点信息

这里写图片描述

从上面可以整个集群的基本状况。

6. 基于普通模式操作集群/集群模式

基于命令行来查看信息的设置:

redis-cli -p 6739
redis-cli -c -p 6739
这里写图片描述

从这里可以看懂,在cluster模式下与普通模式下的不同,集群模式下客户端可以自动的切换到其他节点。
正常情况下的客户端执行逻辑如下:
这里写图片描述

7. 安装ruby以及gem的redis组件

各个操作系统的不同,安装方案各有差异,这里以ubuntu的方式来进行。
这里写图片描述

8. 进行集群的reshard

src/redis-trib.rb reshard 127.0.0.1:6739

从源节点移动到目标节点
• ./redis-trib.rb reshard 127.0.0.1:6379
• How many slots do you want to move (from 1 to 16384)? 4000 //输入被迁移的solt的数量
• What is the receiving node ID? //输入目的地节点的id,执行第一行命
• Please enter all the source node IDs.//输入被迁移的槽
• Do you want to proceed with the proposed reshard plan (yes/no)? Yes //迁移计划确认

这里写图片描述

如何来确认reshard来进行呢?查看命令的日志即可得知:
这里写图片描述

9. 总结

redis提供了完整的一套如何进行集群处理的机制,并利用一致性hash来更好的处理redis的动态调整。

Redis关键点(rehash)

hash table是一种高效的数据结构,被广泛的用在key-value存储中,Redis的dict其实就是一个典型的hash table实现。 rehash是在hash table的大小不能满...
  • jsjwk
  • jsjwk
  • 2012年09月10日 17:11
  • 8424

Redis Cluster 集群一致性原理及slot迁移测试

参考:Redis Cluster原理与管理;Inconsistent slot mapping;Redis中文文档 集群信息一致性问题 主从和slot的一致性是由epoch来管理的. epoch就...
  • u011535541
  • u011535541
  • 2017年12月19日 09:32
  • 203

3、Redis 集群特性之容错、数据迁移

前言: 该篇中主要讲解一下redis的容错以及数据的迁移(横向拓展) redis 集群信息 在前面章节中讲到将Node加入到cluster以后打印了如下日志: [root@localhost sr...
  • liaokailin
  • liaokailin
  • 2015年08月14日 23:45
  • 3457

redis:字典实现及rehash原理

字典只使用ht[0]哈希表,ht[1]哈希表只会在对ht[0]哈希表进行rehash时使用 键---->哈希值---->索引值  Redis使用MurmurHash算法,优点:即使...
  • qq_29108585
  • qq_29108585
  • 2017年02月28日 18:30
  • 555

redis源码分析-rehash过程详解

hash table是一种高效的数据结构,被广泛的用在key-value存储中,Redis的dict其实就是一个典型的hash table实现。 rehash是在hash table的大小不能满足需...
  • wangfaqiang
  • wangfaqiang
  • 2014年11月27日 15:31
  • 1053

Redis3.0集群完全版(数据迁移问题)

Redis3.0集群安装手册     一、概述 要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系...
  • luqiang81191293
  • luqiang81191293
  • 2016年02月03日 11:43
  • 5503

redis集群安装配置数据迁移和客户端(java方向)第二节,数据迁移

安装部署完成,下一节介绍,添加节点,删除节点,数据迁移,客户端(Java方向,主要是讲spring,jedis和cluster下的批量提交等)...
  • cs_chang
  • cs_chang
  • 2016年10月28日 16:47
  • 535

【Redis深入】字典rehash图解

引入在讲rehash之前,我们先回顾一下字典的结构1.字典dict.h/dict的源码/* * 字典 */ typedef struct dict { // 类型特定函数 dictT...
  • baiye_xing
  • baiye_xing
  • 2017年07月25日 17:33
  • 471

redis源码阅读(4)-timeEvnet之rehash重哈希过程

当redis数据库中HashTable数据达到触发条件时,会触发哈希表的重构的操作。触发条件可以设置:1、Resize缩小哈希表触发条件是:元素数量/槽的数量小于REDIS_HT_MINFILL时,触...
  • hehe123456ZXC
  • hehe123456ZXC
  • 2016年11月21日 20:48
  • 650

简单redis迁移(会丢数据)

原redis A 迁移到新redis B C 1、在B执行slaveof A_ip A_port 命令开启主从同步,从A同步数据。C执行slaveof B_ip B_port 作为B的从机; 2、...
  • cs583200859
  • cs583200859
  • 2017年06月24日 23:01
  • 203
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Redis的集群安装以及rehash重新迁移教程指南
举报原因:
原因补充:

(最多只允许输入30个字)