[redis读书笔记] 第二部分 集群
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读书笔记] 第二部分 集群的更多相关文章
- 《Apache kafka实战》读书笔记-管理Kafka集群安全之ACL篇
<Apache kafka实战>读书笔记-管理Kafka集群安全之ACL篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家能看到这篇博客的小伙伴,估计你对kaf ...
- Redis学习笔记八:集群模式
作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
- Redis学习笔记~conf自主集群模式
回到目录 Redis自主提供了集群模式,当然也只是比较简单的读写分离模式,或者叫主从模式,它在各个redis服务端自己做数据同步机制,当然就是将主服务端的信息同步到各个slave服务器上,在客户端集成 ...
- [redis读书笔记] 第二部分 单机数据库 RDB持久化
内存中的rdb是会存为文件以做到RDB持久化的.RDB文件时一个二进制文件. 一 载入与存储 文件的载入是在server启动时进行的(rdbload()),因为AOF的更新频率比RDB高,所以如果AO ...
- [redis读书笔记] 第二部分 单机数据库 数据库实现
一 数据库基本实现/命令下发的实现 redis.c里,大家能看到redisCommandTable[] 的实现,列出了支持的所有命令.大部分的入参为redisClient *c,当一条REDIS命令下 ...
- [redis读书笔记] 第二部分 sentinel
1.sentinel的初始化,会制定master的IP和port,然后sentinel会创建向被监视主服务器的命令连接和订阅连接: - 命令连接是用来和主服务器之间进行命令通信的 - 订阅连接,用于 ...
- SpringBoot学习笔记(13)----使用Spring Session+redis实现一个简单的集群
session集群的解决方案: 1.扩展指定server 利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略.缺点:耦合Tomcat/ ...
- redis主从架构,分片集群详解
写在前面:这篇笔记有点长,如果你认真看完,收获会不少,如果你只是忘记了相关命令,请翻到末尾. redis的简单介绍: 一个提供多种数据类类型储存,整个系统都在内存中运行的, 定期通过异步的方式把数据刷 ...
随机推荐
- Sql Server学习笔记
1.指定路径创建数据库 create database student on--创建库的时候必须写 ( name=student, filename='E:\database\student.mdf' ...
- css控制div等比高度
在移动端开发中,在banner轮播图未加载出来之前,banner层是不占文档流高度的,当从服务器获取完banner数据,展示的时候,banner层因为有了内容 所以会撑开,导致banner层下面的内容 ...
- 灵魂画师,在线科普多云平台/CMP云管平台/中间件/虚拟化/容器是个啥
原创: 灵魂工作室 速石科技 经常碰到有人问: 你们是云管吗? 你们和CMP多云管理平台有什么区别? 你们这个多云平台到底是个啥? emmmmm,问题还挺不好回答. 为了说清楚这些问题,但又不希望你们 ...
- 系统升级更新,cocoaPods不可用的问题
1.在终端运行: $ sudo gem install cocoa pods 会出现以下错误: ERROR: While executing gem ... (Errno::EPERM) Opera ...
- kuangbin专题专题十一 网络流 Dining POJ - 3281
题目链接:https://vjudge.net/problem/POJ-3281 题目:有不同种类的食物和饮料,每种只有1个库存,有N头牛,每头牛喜欢某些食物和某些饮料,但是一头牛 只能吃一种食物和喝 ...
- UVA 最大面积最小三角形剖分
点击打开题目 题目大意: 以顺时针或逆时针给出一个简单多边形的n个点的坐标,用n-2条互不相交的,且与边不相交的对角线,分成n-2个三角形,要求其中最大三角形的面积最小 开始还汪星人咬乌龟,无从下口, ...
- 富文本编辑器、全文检索和django发送邮件
1.富文本编辑器 1.1快速了解 借助富文本编辑器,网站的编辑人员能够像使用offfice一样编写出漂亮的.所见即所得的页面.此处以tinymce为例,其它富文本编辑器的使用也是类似的. 在虚拟环境中 ...
- springboot开发之配置自定义的错误界面和错误信息
如何定制错误页面? (1)在有模板引擎的情况下:在template文件夹下的error/状态码:即将错误页面命名为:错误状态码.html放在template文件夹里面的error文件夹下,发生此状态码 ...
- 解决IDEA使用lombok注解无效,@Data不生效问题
在settings设置启用注解即可:
- 使用NetBenchmark压测TCP,HTTP和Websocket服务
NetBenchmark是针对网络服务压测订制的开源组件,组件提供TCP,HTTP和Websocket的压力测试基础功能:为了更好的符合业务需求组件不提供UI配置信息源的方式(毕竟这种方式只能作有限制 ...