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. C# 线程同步的多种方式

    实际应用中多个线程往往需要共享数据,因此必须使用同步技术,确保一次只有一个线程访问和改变共享数据.同步又分为进程内部线程的同步以及进程之间线程的同步. 进程内部线程同步: 1. lock : 使用比较 ...

  2. 数据结构解析-HashMap

    概要 HashMap在JDK1.8之前的实现方式 数组+链表,但是在JDK1.8后对HashMap进行了底层优化,改为了由 数组+链表+红黑树实现,主要的目的是提高查找效率. 如图所示: JDK版本 ...

  3. mzy git学习,初识git(一)

    GIT学习 git工作区.暂存区.本地库.远程库 工作区:实际上我们工作的地方,进行写代码或者文件的地方. 暂存区:我们执行了git add 操作之后,就会被提交到暂存区. 本地库:其实最后我们需要执 ...

  4. linux使用xampp安装MediaWiki环境

    1.下载并安装xampp 下载xampp 在下载页面下载. 放置到相应目录 将xampp-linux-x64-5.6.3-0-installer.run文件复制到部署机器的/root目录下 安装 [r ...

  5. java一些工具类

    import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java. ...

  6. MySQL 实例空间使用率过高的原因和解决方法

    用户在使用 MySQL 实例时,会遇到空间使用告警甚至超过实例限额被锁定的情况.在 RDS 控制台的实例基本信息中,即会出现如下信息: 本文将介绍造成空间使用率过高的常见原因及其相应的解决方法.对于M ...

  7. ks.cfg文件相关

    原文转自:https://www.cnblogs.com/itzgr/p/10029631.html作者:木二 目录 一 图形化生成ks.cfg文件 二 ks.cfg文件相关项解析 一 图形化生成ks ...

  8. python 动图gif合成与分解

    合成 #!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import sys import imageio def main(imgs_ ...

  9. (四)羽夏看C语言——循环与跳转

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  10. noip模拟45

    A. 打表 首先注意这道题数组下标从 \(0\) 开始 可以找规律发现是 \(\displaystyle\frac{\sum |a_i-a _ {ans}|}{2^k}\) 那么严谨证明一下: 由于两 ...