1. 一个集群会包含多个节点(一个节点就是一个reid是服务器),CLUST MEET <ip><port>可以添加一个node到集群,命令执行后,两个node之间就会进行握手,握手成功构成集群

2.节点(即redis服务器)启动时,将cluster-enable配置为YES,来决定是否开启服务器的集群模式,开启的node功能如下

3.集群数据结构

CLUSTER MEET的流程,在两个node进行了握手后,发起者NODE A会发送gossip协议消息给所有集群里的其他nodes,他们一一和NODE B进行握手,完成整个集群的配置。

4. 槽指派

所谓槽,就是对每次键值请求,对键进行散列,散列到一个槽,然后通过槽的指派,找到槽对应的那个node,就由这个node来负责处理这次请求。

REDIS有16384个槽,数据库中每个键都属于这个槽,而每个槽都要有node来处理,只有所有槽都被集群里的node处理了,集群才算上线。

下面命令是分配0-5000给指定的node

CLUSTER ADD SLOT <SLOT> [SLOT......]  :cluster add slot 0 1 2  3 4 ... 5000

clusterNode结构用来记录它负责哪些槽,其中slots是一个数组,数组的一个元素占用一个字节,储存8个槽位,即每个bit代表是否管理对应的槽(1为管理),

通过node找槽位:某个node配置了它所管理的槽位后,会通知集群的其他node,每个node更新自己的clusterState.node结构里的slots数组,这样在任何一个node,都能知道集群里整个slot是如何分配的,哪些node管理哪些槽位。

除了通过上面的clusterNode结构里保存一个全局的slot[]数组,在clusterState结构里也有个clusterNode *slots[16384], 存储了clusterNode的指针,表明对应的slot分配给了对应的clusterNode。

空间换时间,下面的操作复杂度都是O(1)
clusterState.slots[]负责通过slot快速找到所属于的node
clusterNode.slots[]负责通过node快速找到它所负责的所有的slots

为什么需要clusterState.slots[]

 为什么需要clusterNode.slots[]:

执行CLUSTER ADDSLOTS <SLOT> [slot....]

5 在集群中执行命令

keyHashSlot()函数会将key进行散列,匹配到槽,方法简单如下:

通过散列后,得到KEY对应的slot,然后查询clusterState.slots[],找到对应的node,如果这个node是自己的node,直接处理,否则发送MOVED错误,带上发现的node的IP和port,转移到客户端,进行处理的转移。一个集群客户端通常与急群众的多个节点创建套接字连接,而所谓的节点转向实际上就是换一个套接字来发送命令。如果连接不存在,客户端先根据MOVED错误提提供的IP和port连接节点,然后进行转向。

集群节点保存键值对的方式和一般redis服务器没有区别,只是它只用0号redisDB,

同时,clusterState会有一个slots_to_keys的跳跃表,存储了槽和key的对应关系

6 复制与故障转移

REDIS集群里的node分为master node和slave node。主节点处理槽,从节点负责从主节点复制,并在主节点下线时竞争成为主节点。

设置一个从节点: CLUSTER REPLICATE <node_id>;

- 接收到命令的节点会将clusterState.myself.slaveOf指向clusterState.nodes中的主node的地址,

- 修改clusterState.myself.flags中的属性为REIDS_NODE_SLAVE

- 然后运用和REDIS服务器的复制功能相同的方法,进行主从复制

clusterNode里有个slaves数组,如果clusterNode是主node,这个slaves里会存着它的从节点们的指针。

  故障检测:

集群中每个节点都会互发ping-pong,构成心跳检测, 如果发现规定时间内没有PONG回来,就在cluster.node里,将对应的node.flags标记为PFAIL(疑似下线)。

    集群中每个节点之间都会互相发消息,交换集群中各个节点的状态信息,当半数以上负责处理槽的主节点将某个主节点标记为疑似下线,那么这个节点就会被标记为FAIL(下线),然后向集群广播,集群所有node都会将其标记为下线。

故障转移:

选择哪个从节点作为主节点,选举的方法类似sentinel选举领头sentinel的方法,每个可以竞选的从节点发送请求,每个管理槽的主节点会回复第一个受到请求的node,将投票回给它,被投票超过 N/2+1票,成功当选,否则,进入下一个纪元,重新开始选举。

   

[redis读书笔记] 第二部分 集群的更多相关文章

  1. 《Apache kafka实战》读书笔记-管理Kafka集群安全之ACL篇

    <Apache kafka实战>读书笔记-管理Kafka集群安全之ACL篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家能看到这篇博客的小伙伴,估计你对kaf ...

  2. Redis学习笔记八:集群模式

    作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...

  3. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  4. Redis学习笔记~conf自主集群模式

    回到目录 Redis自主提供了集群模式,当然也只是比较简单的读写分离模式,或者叫主从模式,它在各个redis服务端自己做数据同步机制,当然就是将主服务端的信息同步到各个slave服务器上,在客户端集成 ...

  5. [redis读书笔记] 第二部分 单机数据库 RDB持久化

    内存中的rdb是会存为文件以做到RDB持久化的.RDB文件时一个二进制文件. 一 载入与存储 文件的载入是在server启动时进行的(rdbload()),因为AOF的更新频率比RDB高,所以如果AO ...

  6. [redis读书笔记] 第二部分 单机数据库 数据库实现

    一 数据库基本实现/命令下发的实现 redis.c里,大家能看到redisCommandTable[] 的实现,列出了支持的所有命令.大部分的入参为redisClient *c,当一条REDIS命令下 ...

  7. [redis读书笔记] 第二部分 sentinel

    1.sentinel的初始化,会制定master的IP和port,然后sentinel会创建向被监视主服务器的命令连接和订阅连接: -  命令连接是用来和主服务器之间进行命令通信的 - 订阅连接,用于 ...

  8. SpringBoot学习笔记(13)----使用Spring Session+redis实现一个简单的集群

    session集群的解决方案: 1.扩展指定server 利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略.缺点:耦合Tomcat/ ...

  9. redis主从架构,分片集群详解

    写在前面:这篇笔记有点长,如果你认真看完,收获会不少,如果你只是忘记了相关命令,请翻到末尾. redis的简单介绍: 一个提供多种数据类类型储存,整个系统都在内存中运行的, 定期通过异步的方式把数据刷 ...

随机推荐

  1. Android反编译三件套 apktool 、dex2jar、jd-gui

    1.还是老话下载三件套(点击下载) 或者自己在百度搜索下载 2.使用apktool反编译apk cd到D:\TESTCODE\android\android反编译三件套目录下 输入java -jar ...

  2. JUnit 5和Selenium基础(三)

    在这一部分教程中,将介绍JUnit 5的其他功能,这些功能将通过并行运行测试,配置测试顺序和创建参数化测试来帮助减少测试的执行时间.还将介绍如何利用Selenium Jupiter功能,例如通过系统属 ...

  3. 【Spring Boot 源码解读】之 【为何引入了 Jedis 依赖最后用的还是 Lettuce 客户端?】

    1.Spring Boot 2.x 的两种 Redis 客户端 首先,我们都知道,从 Spring Boot 2.x 开始 Lettuce 已取代 Jedis 成为首选 Redis 的客户端.当然 S ...

  4. 《【面试突击】— Redis篇》-- Redis哨兵原理及持久化机制

    能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! <[面试突击]— Redis篇>-- Redis哨兵原理及持久化机制 在这个系列里, ...

  5. 投影方式- Unity3D游戏开发培训

    投影方式- Unity3D游戏开发培训   作者:Jesai 2018-02-12 20:33:13 摘  要 透视投影是3D渲染的基本概念,也是3D程序设计的基础.掌握透视投影的原理对于深入理解其他 ...

  6. ZooKeeper 并不适合做注册中心

    zookeeper 的 CP 模型不适合注册中心 zookeeper 是一个非常优秀的项目,非常成熟,被大量的团队使用,但对于服务发现来讲,zookeeper 真的是一个错误的方案. 在 CAP 模型 ...

  7. JSON解析值富文本

    解析前端传递的JSON数据中可能如下 { "result": "<input value="Test" type="button&qu ...

  8. 从源码上理解Netty并发工具-Promise

    前提 最近一直在看Netty相关的内容,也在编写一个轻量级的RPC框架来练手,途中发现了Netty的源码有很多亮点,某些实现甚至可以用苛刻来形容.另外,Netty提供的工具类也是相当优秀,可以开箱即用 ...

  9. ERR : undefined reference to something

    序言: define : 定义.相信你用过 #define PI 3.141592653 (千万记得别在这句代码后加分号) reference : 引用 undefined reference to ...

  10. Python学习,第一课 - 基础学习

    前言. 本内容全部以python3所讲 一.Python安装 windows 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\pyth ...