Redis集群介绍

一、节点

通过CLUSTER MEET <ip> <port>可以指定对应节点到当前节点的集群中,通过cluster-enabled配置可以决定是否开启Redis服务器的集群模式

  • 向节点A发送CLUSTER MEET B_ip B_port
  • 收到命令的A为B创建一个clusterNode的结构,并将该结构存入自己的cluserState.nodes字典
  • B收到A的消息后,也会为A创建一个clusterNode的结构,并将该结构存入自己的cluserState.nodes字典
  • 随后,B向A返回一条PONG消息
  • 收到PONG消息的A,给B发送一条PING消息,至此握手完成。
  • 最后A会把节点B通过Gossip协议(每个节点都会随机选择几个节点发送Gossip消息,其他节点会再次随机选择其他几个节点接力发送消息。这样一段时间过后,整个集群都能收到这条消息。最大的好处是,即使集群节点的数量增加,每个节点的负载也不会增加很多,几乎是恒定的。)传播给集群的其他节点

二、槽指派

Redis集群的整个数据库会被分为16384个槽slot,数据库每个key都属于其中之一,集群每个节点都可以处理0-16384个slot。只有所有的slot都有节点处理,Redis集群才算上线状态,否则处于下线状态。

  • 通过向节点发送CLUSTER ADDSLOTS <slot> [slot...] 可以把对应slot添加给对应节点,如CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000。如果节点1-5000中任何一个槽已经被指配,则返回错误。
  • clusterNode结构的slots(unsigned char slots[16384/8])属性和numslot记录了节点负责处理哪些槽。slots是一个二进制位数组,每一个位记录节点是否负责对应槽。
  • 集群节点之间也会相互传播节点的槽指派信息,每个节点都会知道16384个槽分别被指派给了哪个节点。clusterState结构中的clusterNode *slots[16384]记录了每个槽分别指向那个节点

三、集群中执行命令

3.1

3.1.1

当向集群节点A发送命令get key,但是通过CRC16(key)&16383计算key对应的槽,当clusterState.slot[i]等于clusterState.myself,则槽是自己负责,否则向客户端返回MOVED错误,指引客户端转向正确的节点

3.1.2

一个集群客户端通常会与集群中多个节点创建套接字接口,MOVED节点转向只是换一个套接字发送命令

3.1.3

节点使用clusterState结构中slots_to_keys跳跃表记录槽和键之间的关系,其中键lst和book带有过期时间,每个节点的分值(score)表示一个槽号,节点成员(member)表示一个数据库键


跳跃表介绍123
跳跃表貌似只适用于sorted set数据类型??? 参看

3.2 重新分片

在重新分片过程中,集群对外没有任务变化,源节点和目标节点都可以处理请求

  • 1.通过redis集群管理软件redis-trib对目标节点发送CLUSTER SETSLOT <slot> IMPORTING <source_id>,让目标节点好接受slot的键值对;
  • 2.通过向源节点发送CLUSTER SESLOT <slot> MIGRATING <target_id>准备迁移至SLOT
  • 3.向源节点发送CLUSTER GETKEYSINGSLOT <slot> <count>获取最多count个属于slot的键名
  • 4.对于3获取的键名向源节点发送 MIGRATE <target_ip> <target_port> <key_name> 0 <timeout>迁移键
  • 5.向集群节点发送CLUSTER SETSLOT <slot> NODE <target_id>表示槽slot已经指派给target_id了
    MOVED错误表示槽的负责权已经从一个节点转移到另一个节点;ASK错误表示俩个节点正在进行槽迁移
    集群中的节点通过发送MEET、PING、PONG、PUBLISH、FAIL消息来通信
  • MEET消息:发送者接受客户端的CLUSTER MEET消息,就会向接受者发送MEET消息,请求接受者加入当前集群
  • PING消息:集群内交换最频繁的消息,集群内每个节点每秒向多个其他节点发送ping消息,用于检测节点是否在线和交换彼此状态信息
  • PONG:当接收到ping、meet消息时,作为响应消息回复给发送方确认消息正常通信。pong消息内部封装了自身状态数据。节点也可以向集群内广播自身的pong消息来通知整个集群对自身状态进行更新
  • FAIL消息:当节点判定集群内另一个节点下线时,会向集群内广播一个fail消息,其他节点接收到fail消息之后把对应节点更新为下线状态
  • publish:一个节点接受到publish命令,不但会执行,还会向集群广播这条publish命令,所有接受到消息的节点都会执行publish命令
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • Redis Cluster Specification 1 设计目标和理由 1.1 Redis Cluster g...
    近路阅读 4,246评论 0 12
  • 前言 在前面的文章中,已经介绍了Redis的几种高可用技术:持久化、主从复制和哨兵,但这些方案仍有不足,其中最主要...
    Java架构_师阅读 654评论 0 0
  • Redis Cluster Redis Cluster是Redis官方在Redis 3.0版本正式推出的高可用以及...
    Springlin阅读 3,782评论 1 5
  • 1. 集群概述 Redis集群是Redis提供的分布式数据库方案,集群通过分片进行数据共享,提供复制和故障转移功能...
    孤尘F阅读 4,565评论 0 0
  • Redis Cluster原理分析 文章较长,如需转载可分段。转载请标明作者以及文章来源,谢谢! 作者介绍 姓名:...
    lihanglucien阅读 20,460评论 3 30