redis集群结构

  

特点:
     1 所有redis节点(包括主和从)彼此互联(两两通信),底层使用内部的二进制传输协议,优化传输速度;(所有功能特点的基础)
    2 集群中也有主从,也有高可用的逻辑,但是没有哨兵进程,整合到主节点的功能里了;集群中的事件被主节点(大部分主节点);通过主节点的过半选举实现哨兵以前的逻辑;
    3 客户端与redis-cluster连接,无需关心分片的计算,客户端不在关心分片的计算逻辑,内部分发分布式数据(内部有分片计算逻辑),客户端将key交给redis节点后,集群内部判断key值的正确存储位置,转发存储;
    4 redis-cluster把所有的主节点对应到[0-16383]整数区间--槽道slot;各自的主节点维护一批槽道号(0-5000,5001-10000,10001-16383);在分片计算时,对key值做hash取模运算(就是取余,不在使用hashCode,CRC16);key值对应的取模运算结果,将会判断由哪个节点维护;将key--slot--node,如果我们想要迁移某个key值,必须将对应的slot一并迁移;

存取工作原理

存储获取值时的转发逻辑

槽道迁移,数据key迁移

底层是是通过槽道来完成管理的。

redis的集群槽道原理

通过槽道原理抛2个问题:
    1 节点接收数据计算槽道号后,如何判断当前槽道号是否归我管?
    2 判断不归本节点管理时,如何获取正确管理者信息
   
槽道逻辑结构

槽道是一种计算逻辑

计算逻辑:
        ○ 二进制16384位的位序列可以实现当前节点判断槽道号管理权的逻辑;(16384位二进制就是2048个元素的byte数组)
        计算二进制,获取人为定义的二进制下标号(人为定义,计算位移计算),每一位的下标号对应二进制(1/0),与下标号一直的槽道号到底归不归当前节点管理,是通过下标对应的二进制值判断1表示管理true,0表示不管理false;
        特点:
        1每个主节点都管理一批槽道,每个主节点的16384位的二进制不一样(也就是说每个主节点对应一个索引数组)
        2从节点和没有槽道管理权的主节点的二进制是全是0
        
  模拟获取二进制下标和对应二进制值的代码(byte):

         @Test
public void test(){
byte a=55;
//假设,这个byte二进制代表位序列中第一个byte
System.out.println(Integer.toBinaryString(a));
//获取定义的0号下标对应的二进制
for(int i=0;i<8;i++){
//第一次移动7位,第二次移动6,第三次移动5
int move=8-i-1;
int result=(a>>move)&1;
System.out.println("当前"+i+"号下标对应的二进制"+result);
}
}

        ○ 索引数组
16384个元素的数组,下标0-16383,每个下标对应的元素引用的变量,指向内存中一个保存下标对应槽道号管理者的索引节点信息;

总结:

  存入数据时,首先对存入的key值进行取模运算,通过计算值,得到key值对应的槽道(16384个槽道,其实是一个16389个元素索引数组,每个数组元素变量保存着相对应槽道号管理者的节点信息), 获取槽道信息,根据对应槽道号数组元素变量的信息找到对应的主节点,并将数据存入主节点;

如何找到槽道号相对应的主节点???

  底层是根据二进制计算得出,是由16384个二进制位找到主节点的槽道号,并将主节点的相关信息保存在槽道号对应数组元素的变量中.当有数据存入或者取出时,计算key值得槽道号,找到对应的数组元素,通过这个数组元素中节点的信息,找到节点,进行存取操作.

 redis集群的命令

 集群
  cluster info :打印集群的信息
  cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。
 节点
  cluster meet <ip> <port> :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
  cluster forget <node_id> :从集群中移除 node_id 指定的节点(保证空槽道)。
  cluster replicate <node_id> :将当前节点设置为 node_id 指定的节点的从节点。
  cluster saveconfig :将节点的配置文件保存到硬盘里面。
 槽(slot)
  cluster addslots <slot> [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
  cluster delslots <slot> [slot ...] :移除一个或多个槽对当前节点的指派。
  cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
  cluster setslot <slot> node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
  另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
  cluster setslot <slot> migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
  cluster setslot <slot> importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
  cluster setslot <slot> stable :取消对槽 slot 的导入( import)或者迁移( migrate)。
 
  cluster keyslot <key> :计算键 key 应该被放置在哪个槽上。
  cluster countkeysinslot <slot> :返回槽 slot 目前包含的键值对数量。
  cluster getkeysinslot <slot> <count> :返回 count 个 slot 槽中的键 

Redis-cluster详解的更多相关文章

  1. redis配置详解

    ##redis配置详解 # Redis configuration file example. # # Note that in order to read the configuration fil ...

  2. redis配置文件详解-3

    redis3.0以上配置文件 #################################INCLUDES ################################### include ...

  3. CentOS7/RHEL7安装Redis步骤详解

    CentOS7/RHEL7安装Redis步骤详解 CentOS7/RHEL7安装Redis还是头一次测试安装了,因为centos7升级之后与centos6有比较大的区别了,下面我们就一起来看看Cent ...

  4. Redis协议详解

    smark Beetle可靠.高性能的.Net Socket Tcp通讯组件 支持flash amf3,protobuf,Silverlight,windows phone Redis协议详解 由于前 ...

  5. Redis学习——详解Redis配置文件(三)

    一.Redis脚本简介 在我们介绍Redis的配置文件之前,我们先来说一下Redis安装完成后生成的几个可执行文件: redis-server .redis-cli .redis-benchmark ...

  6. Redis:默认配置文件redis.conf详解

    转: Redis:默认配置文件redis.conf详解 # Redis配置文件样例 # Note on units: when memory size is needed, it is possibl ...

  7. Python操作redis学习系列之(集合)set,redis set详解 (六)

    # -*- coding: utf-8 -*- import redis r = redis.Redis(host=") 1. Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合 ...

  8. Redis配置文件redis.conf详解

    一.Redis配置文件redis.conf详解 # Note on units: when memory size is needed, it is possible to specifiy # it ...

  9. [转]使用python来操作redis用法详解

    转自:使用python来操作redis用法详解 class CommRedisBase(): def __init__(self): REDIS_CONF = {} connection_pool = ...

  10. linux离线部署redis及redis.conf详解

    一.离线部署redis 由于博主部署的虚拟机没有网络也没有gcc编译器,所以就寻找具备gcc编译器的编译环境把redis编译安装好,Copy Redis安装目录文件夹到目标虚拟机的目录下.copy时r ...

随机推荐

  1. java 获取网络地址图片

    收藏一个获取网络图片的方法. //获取网络图片 public void ImageRequest(String ImageName,String GifUrl) throws Exception { ...

  2. 电影:换肤(Replace)

    一个恐怖题材的电影,欧美的恐怖电影给我的感觉是一点也不恐怖,只是血腥,非常血腥,看这部电影的时候我还在吃中午饭........ 开头没看懂,应该都是女主的幻觉吧,女主本来是一个年近六十多岁的老太太,然 ...

  3. python 爬虫初试

    python3.5  抓网易新闻的排行榜上的新闻,主要用自带的request模块和lxml import re from urllib import request from lxml import ...

  4. 使用git版本管理工具

    1.(1)正常提交:git add 提交文件 git init   //git init之后建立一个.gitignore可以避免node_modules这类文件夹提交 git add . git co ...

  5. angular监听移动端键盘的弹起和收回

    页面的提交按钮采用的是固定定位在页面的底部,键盘弹出后,提交按钮紧挨着键盘的上方,输入框获得焦点后,键盘弹出,并且输入框回自动定位上方的空白处,此时由于键盘上方固定定位的提交按钮的原因有可能会遮挡住获 ...

  6. 使用Gulp压缩HTML和CSS

    ---恢复内容开始--- 今天我么继续压缩,但是今天的压缩和之前的不同了!可以说是第二种方法吧! 今天用Gulp来压缩HTML和CSS! 1.首先我们先来安装GUlp:先安装全局gulp 2.然后是开 ...

  7. spark编程python实例

    spark编程python实例 ValueError: Cannot run multiple SparkContexts at once; existing SparkContext(app=PyS ...

  8. matlab练习程序(毛玻璃模糊)

    算是一种特效模糊方式吧,算法原理就是用邻域随机像素代替当前所处理的像素就可以了. 效果如下图所示: 原图: 处理后结果: matlab代码如下: clear all; close all;clc; i ...

  9. CSS和文档流

    1.  CSS的定位机制有3种:普通流.浮动和定位. 2.  文档流:从上到下,从左到右,一个挨一个的简单或者叫正常布局. 3.  定位:(position) Static:保持文档流. Relati ...

  10. 如何将bug杀死在摇篮里?

    阿里妹导读:在欧洲中世纪的传说中,有一种叫“人狼”的妖怪,就是人面狼身.它们会讲人话,专在月圆之夜去袭击人类.而且传说中对“人狼”用一般的枪弹是不起作用的,普通子弹都伤不到也打不死它,只有一种用银子作 ...