Redis分布式方案:集群
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>
可以让接收命令的节点变成从节点(和复制反命令过来了)
故障转移
当一个从节点发现自己正在复制的主节点下线了,从节点开始对下线主节点进行故障转移,以下步骤:
- 被选中的从节点会执行SLAVEOF no one命令,成为新的主节点。
- 将槽指派给自己。
- 新主节点向集群广播发送PONG消息,昭告天下。
选举新的主节点
和领头哨兵选举类似,都是基于Raft算法实现的。(见Redis哨兵)
Reference
《Redis设计与实现》
Redis分布式方案:集群的更多相关文章
- Window平台搭建Redis分布式缓存集群 (一)server搭建及性能測试
百度定义:Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对很多其它.包含string(字符串).list(链表).set(集合).zset(sort ...
- 分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型
分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型 分布式缓存特性: 1) 高性能:当传统数据库面临大规模 ...
- 京东分布式MySQL集群方案介绍
背景 数据库作为一个非常基础的系统,任何一家互联网公司都会使用,数据库产品也很多,有Oracle.SQL Server .MySQL.PostgeSQL.MariaDB等,像SQLServer/Ora ...
- 分布式MySQL集群方案的探索与思考
转载:http://www.infoq.com/cn/articles/exploration-of-distributed-mysql-cluster-scheme?utm_campaign=rig ...
- Redis 3.0集群 Window搭建方案
Redis 3.0集群 Window搭建方案 1.集群安装前准备 安装Ruby环境,安装:rubyinstaller-2.3.0-x64.exe http://dl.bintray.com/onecl ...
- Redis+TwemProxy(nutcracker)集群方案部署记录
Twemproxy 又称nutcracker ,是一个memcache.Redis协议的轻量级代理,一个用于sharding 的中间件.有了Twemproxy,客户端不直接访问Redis服务器,而是通 ...
- Citus 分布式 PostgreSQL 集群 - SQL Reference(SQL支持和变通方案)
由于 Citus 通过扩展 PostgreSQL 提供分布式功能,因此它与 PostgreSQL 结构兼容.这意味着用户可以使用丰富且可扩展的 PostgreSQL 生态系统附带的工具和功能来处理使用 ...
- redis整合Spring集群搭建及业务中的使用
1.redis安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到li ...
- linux Redis 5.0集群搭建
文档结构如下: Redis cluster 是redis的分布式解决方案,在3.0版本正式推出后,有效的解决了redis分布式方面的需求:当遇到单机内存,并发,流量等瓶颈是,可以采用cluster架构 ...
- Redis存储Tomcat集群的Session
Redis存储Tomcat集群的Session 如何 做到把新开发的代码推送到到生产系统中部署,生产系统要能够零宕机.对使用用户零影响. 设想 是使用集群来搞定,通过通知负载均衡Nginx,取下集群中 ...
随机推荐
- 微信支付 调用支付jsapi缺少参数total_fee 和 支付验证签名失败 prepay_id配置问题
=======================================================先熟悉一下统一下单api所需要的参数=========================== ...
- Asp.NetCore3.1 WebApi 获取配置json文件中的数据
下面只是做一个简单的测试: 1:定义好appsetting.Json文件的配置信息如下: { "Logging": { "LogLevel": { " ...
- MySQL案例:一次单核CPU占用过高问题的处理
客户现场反馈,top的检查结果中,一个CPU的占用一直是100%.实际上现场有4个CPU,而且这个服务器是mysql专属服务器. 我的第一反应是io_thread一类的参数设置有问题,检查以后发现re ...
- JavaScript——数组——数组长度
JavaScript--数组--数组长度 JavaScript中的数组长度是可变的,可用赋值运算符改变数组大小,如果改变之后的数组的长度比原数组大,则新数组会在末尾补充相应数量的空位,空位上的数组元素 ...
- vue 前端反向代理后台,解决跨域问题
// 和 src 同层的 config 文件夹下的 index.js dev 里面的 // Paths assetsSubDirectory: 'static', assetsPubl ...
- thinkphp5.x在函数禁用的情况下绕过
描述 测试的时候发现一个thinkphp的网站,有tp5的漏洞但无法执行命令,但没机会进行后续测试,所有在这里自己搭建环境进行复现一下. 使用的是tp5.0.16 一开始使用网上的payload打一直 ...
- 使用kubeadm安装kubernetes 1.21
文章原文 配置要求 至少2台 2核4G 的服务器 本文档中,CPU必须为 x86架构 CentOS 7.8 或 CentOS Stream 8 安装后的软件版本为 Kubernetes v1.21.x ...
- C语言实现有限状态机
1. 什么是有限状态机 有限状态机在百度百科上的解释为: 有限状态自动机(FSM "finite state machine" 或者FSA "finite state a ...
- 自定义组件 v-model 的使用
关于自定义组件如何使用 v-model,本章直讲如何使用: 一. $emit('input', params) // 父组件中 <template> <article> {{f ...
- Java基础学习3
Java语法学习3 基本运算符 关系运算符返回结果为布尔类型 %:取余 模运算 +.-.*./.% :二元运算符 两个变量间的运算 ++.-- 一元运算符 package Study; public ...