Redis集群通过分片(sharding)进行数据共享,并提供复制和故障转移功能。

节点

一个Redis集群由多个node组成,连接各节点的命令格式如下:

CLUSTER MEET

127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7001

槽指派

Redis集群通过分片的方式来保存键值对:集群的整个数据库被分为16384的槽(slot)。

通过CLUSTER ADDSLOTS命令,可以将一个或多个槽指派给节点负责:

CLUSTER ADDSLOTS [slot ...]

127.0.0.1:7000> CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000

OK

执行命令将槽0-5000指派给节点7000负责

记录节点的槽指派信息

slots属性是一个二进制位数组,数组长度为16384/8=2048个字节,共包含16384个二进制位。

为什么是16384个?

因为节点之间需要经常互相发送心跳等信息,其中就槽位也是包含在内的,取一个中间值16384能在一定程度

上减少消息的大小,又减少了数据不均衡的问题。

计算键属于哪个槽

节点使用 CRC16(key) & 16383 计算出一个 0-16383之间的整数作为键key的槽号。

但是,如果计算出来的槽值不能由当前节点处理,那么,该节点会向客户端返回MOVED错误,指引客户端转向可

以处理的节点。

MOVED 10086 127.0.0.1:7002

表示槽10086正由127.0.0.1:7002节点负责。

节点数据库实现

单机和节点的区别:节点只能使用0号数据库。

淘汰策略是一样的,从过期key里淘汰最久未使用的key,volatile-LRU。

重新分片

客户端访问key时,key所属的槽如果正在从旧节点转移到新节点,会发送ask错误(隐藏的)。

复制与故障转移

Redis集群节点分为master和slave,如果主节点下线,会选择一个从节点作为新的主节点。

设置从节点

CLUSTER REPLICATE <node_id>

可以让接收命令的节点变成从节点(和复制反命令过来了)

故障转移

当一个从节点发现自己正在复制的主节点下线了,从节点开始对下线主节点进行故障转移,以下步骤:

  1. 被选中的从节点会执行SLAVEOF no one命令,成为新的主节点。
  2. 将槽指派给自己。
  3. 新主节点向集群广播发送PONG消息,昭告天下。

选举新的主节点

和领头哨兵选举类似,都是基于Raft算法实现的。(见Redis哨兵)

Reference

《Redis设计与实现》

Redis分布式方案:集群的更多相关文章

  1. Window平台搭建Redis分布式缓存集群 (一)server搭建及性能測试

    百度定义:Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对很多其它.包含string(字符串).list(链表).set(集合).zset(sort ...

  2. 分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型

    分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型   分布式缓存特性: 1) 高性能:当传统数据库面临大规模 ...

  3. 京东分布式MySQL集群方案介绍

    背景 数据库作为一个非常基础的系统,任何一家互联网公司都会使用,数据库产品也很多,有Oracle.SQL Server .MySQL.PostgeSQL.MariaDB等,像SQLServer/Ora ...

  4. 分布式MySQL集群方案的探索与思考

    转载:http://www.infoq.com/cn/articles/exploration-of-distributed-mysql-cluster-scheme?utm_campaign=rig ...

  5. Redis 3.0集群 Window搭建方案

    Redis 3.0集群 Window搭建方案 1.集群安装前准备 安装Ruby环境,安装:rubyinstaller-2.3.0-x64.exe http://dl.bintray.com/onecl ...

  6. Redis+TwemProxy(nutcracker)集群方案部署记录

    Twemproxy 又称nutcracker ,是一个memcache.Redis协议的轻量级代理,一个用于sharding 的中间件.有了Twemproxy,客户端不直接访问Redis服务器,而是通 ...

  7. Citus 分布式 PostgreSQL 集群 - SQL Reference(SQL支持和变通方案)

    由于 Citus 通过扩展 PostgreSQL 提供分布式功能,因此它与 PostgreSQL 结构兼容.这意味着用户可以使用丰富且可扩展的 PostgreSQL 生态系统附带的工具和功能来处理使用 ...

  8. redis整合Spring集群搭建及业务中的使用

    1.redis安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到li ...

  9. linux Redis 5.0集群搭建

    文档结构如下: Redis cluster 是redis的分布式解决方案,在3.0版本正式推出后,有效的解决了redis分布式方面的需求:当遇到单机内存,并发,流量等瓶颈是,可以采用cluster架构 ...

  10. Redis存储Tomcat集群的Session

    Redis存储Tomcat集群的Session 如何 做到把新开发的代码推送到到生产系统中部署,生产系统要能够零宕机.对使用用户零影响. 设想 是使用集群来搞定,通过通知负载均衡Nginx,取下集群中 ...

随机推荐

  1. WPF教程(四)RelativeSource属性

    我们进行Bingding时,如果明确知道数据源的Name,就能用Source或者ElementName进行绑定,但是有时候我们需要绑定的数据源可能没有明确的Name,此时我们就需要利用Bingding ...

  2. uwp 中的音频开发

    xml code --------------------------------------------------- <UserControl x:Class="WinTest.H ...

  3. 关于腾讯云redis 无法外网访问的解决方案

    问题简介: 今天购买了一台腾讯云的redis:如图 可是我没有找到 腾讯云提供的外网地址,我该怎么连接呢?百度了一大堆 全部是 在腾讯云服务器上搭建的Redis实例的解决办法.完全不匹配. 开始解决: ...

  4. jquery validate 验证插件 解决多个相同的Name 只验证第一个的方案

    方案一:如果 项目里不是只是个别页面 有多个name 验证, 那么利用 prototype 来写,把这段代码加在你所要使用多个name的页面  的js初始化里 即可 if ($.validator) ...

  5. apt-get 安装程序时报 'E: Unable to locate package xxx' 错误处理办法

    提示无法定位包,要执行命令更新: sudo apt-get update

  6. Spring笔记(1)

    Spring快速入门 开发步骤 导入坐标 <dependency> <groupId>org.springframework</groupId> <artif ...

  7. PyQT5基础布局管理

    绝对定位布局 使用move(x, y)可以对窗口进行布局,以窗口左上角为原点,向右为 x 轴正方向,向下为 y 轴正方向,移动(x,y); import sys from PyQt5.QtGui im ...

  8. WebService学习总结(二)--使用JDK开发WebService

    一.WebService的开发方法 使用java的WebService时可以使用一下两种开发手段 使用jdk开发(1.6及以上版本) 使用CXF框架开发(工作中) 二.使用JDK开发WebServic ...

  9. Linux下chkconfig

    1.chkconfig命令用于检查,设置系统的各种服务! 2.chkconfig语法 chkconfig [--add] [--del] [--list] [系统服务] 或 chkconfig [-- ...

  10. HDD成都站:HMS Core 6.0带来新可能 多元服务驱动产品商业成功

    9月10日,由华为开发者联盟主办的HDD(Huawei Developer Day)于成都举行.活动中,华为HMS Core各领域专家重点解读了HMS Core 6.0为开发者带来的多项全新能力,及生 ...