Redis 设计与实现 (五)--多机数据库的实现
多机数据库的实现
一、复制
slaveof 主服务器ip地址。形成主从关系。
1、同步
从向主服务器发送sync命令。
主服务器收到sync命令执行bgsave,生成rdb文件,缓冲区同时记录从现在开始执行的所有命令。
主服务器执行完毕bgsave命令,会将rdb文件发送给从服务器,从服务器接收并载入这个rdb文件,同步给主服务器状态
主服务器发送缓冲区的命令给从服务器,从服务器执行当前命令,保持数据最终一致。
2、命令传播
第一步同步,类似于初始化。
后续还需要,主从服务器实时同步。
主服务器将 写命令同步发送给从服务器执行。保持主从一致。
3、断点续传
psync 分为完全同步,部分同步
(1)复制偏移量
- 主服务器每次想从服务器创博N个字节数据时,同时将自己的复制偏移量加N.
- 从服务器接收N个字节数据,同时更新自己的偏移量加N.
(2)复制积压缓冲区
- 主服务器将缓冲区命令发送给从服务器,同时更新复制积压缓冲区,标记命令字节的偏移量。
- 主服务器会根据这个积压偏移量,选择同步命令的方式。
(3)同步服务器ID
根据ID和存储的ID对比选择不同的同步方式。
二、Sentinel
哨兵策略是redis高可用的解决方案(一个或者多个哨兵实例组成的哨兵系统),可以监视多个主服务器。
(1)故障转移
- 监测到主服务器下线,选举主服务器下的一个从服务器升级为主服务器.
- 通知其他从服务器,更新主服务器地址.
- 监视下线服务器,并将下线的服务器升级为从服务器.
三、集群
集群实现了分布式数据库解决方案
1、节点:cluster meet <ip><port>
node节点发送上述命令到指定的ip:port节点,它们进行握手,成功后,将指定的ip:port节点添加到node的集群中。
2、启动节点
一个节点就是一个运行在集群模式下的redis服务器,根据cluster-enable来判断是否开启集群模式。
3、配置槽位:通过分片方式来保存数据库中的键值对,集群的整个数据库被分为 0~16384个槽位
cluster addslots <一个或者多个槽位>
节点之间互相同步自己的槽位
数据库要处理的键属于哪个槽 ->指派当前节点->没有的话,moved,下一个->直到找到为止
键槽位算法:cluster keyslot <key>
4、重新分片
moved 槽的负责权有一个节点转移到另一个节点
ask 槽迁移过程中使用的临时措施
5、复制故障转移
集群分为主节点和从节点,主节点用于处理槽,子节点用于复制主节点
在主节点下线时,代替主节点继续处理命令请求。
cluster replicate <node-id> node-id 为主节点,接收此命令的节点为子节点
Redis 设计与实现 (五)--多机数据库的实现的更多相关文章
- Redis设计与实现2.1:数据库和事件
数据库和事件 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 数据库 数据库的结构定义在 redis.h/redisServer 这个结构体中,这个结构体有许多 ...
- Redis(三):多机数据库的实现
复制 在Redis中,用户可以通过SLAVEOF命令或是slaveof选项设置服务器的主从关系,从(SLAVE)服务器会复制主(Master)服务器. 旧版复制功能实现(2.8以前) 旧版复制功能主要 ...
- Redis学习笔记三:多机数据库的实现
1.复制 执行slaveof命令或者设置slaveof选项,让一个服务器去复制另外一个服务器. 旧版复制功能的实现(Redis 2.8 之前的版本) 复制功能分为同步和命令传播两个操作. 同步(syn ...
- Redis 设计与实现 (二)--数据库
typedef struct redisDb { dict *dict; /* The keyspace for this DB */ dict *expires; /* Timeout of key ...
- Redis设计与实现(一~五整合版)【搬运】
Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很 ...
- Redis多机数据库
复制 PSYNC命令具有完整重同步(full resynchronization)和部分重同步(partial resynchronization)两种模式: ·其中完整重同步用于处理初次复制情况:完 ...
- 探索Redis设计与实现9:数据库redisDb与键过期删除策略
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- Redis | 第4章 Redis中的数据库《Redis设计与实现》
目录 前言 1. Redis中的数据库 2. 数据库的键空间 3. 键的生成时间与过期时间 4. Redis中的过期键删除策略 5. AOF.RDB和复制功能对过期键的处理 5.1 生成 RDB 文件 ...
- 《Redis设计与实现》- 数据库
1. 服务器中数据库结构 Redis 服务器将所有数据库都保存在服务器状态 redisServer 结构的 db 数组中,由 redisDb 结构代表一个数据库 struct redisServer ...
随机推荐
- TPshop之短信注册配置(阿里云)
短信注册准备: 1.阿里云账号实名认证(申请地址: https://www.aliyun.com/ , 注意不是阿里大于短信平台) 步骤: 注册登录阿里云——找到控制台 鼠标放在左上角,弹出菜 ...
- centos 7.5+如何格式化硬盘
[root@k8s-node2 ~]# fdisk -l Disk /dev/sdb: bytes, sectors Units = sectors of * = bytes Sector size ...
- 【webpack系列】从零搭建 webpack4+react 脚手架(三)
本章节,我们对如何在脚手架中引入CSS,如何压缩CSS,如何使用CSS Modules,如何使用less,如何使用postcss等问题进行展开学习. 1 支持css (1)在app目录,新建一个css ...
- Scrapyd 改进第一步: Web Interface 添加 charset=UTF-8, 避免查看 log 出现中文乱码
0.问题现象和原因 如下图所示,由于 Scrapyd 的 Web Interface 的 log 链接直接指向 log 文件,Response Headers 的 Content-Type 又没有声明 ...
- 在.Net Core WebAPI下给Swagger增加导出离线文档功能
一丶前言 最近刚接触到Swagger,在github上下载了它的源码和demo学习了一遍,发现这个组件非常好用,不过不足的是它没有导出离线文档的功能,于是乎我就想给它加一个导出功能 Swagger G ...
- python DNN
exam_relu_softmax_dnn ''' 문) bmi.csv 데이터셋을 이용하여 다음과 같이 DNN모델을 생성하시오. 조건1> X,Y변수 -> X변수 : heigh ...
- 解决使用redis作为session缓存 报错 Error: no such key 的问题
spring的issue https://github.com/spring-projects/spring-session/issues/954 原答案是 Updated my codes to 2 ...
- FFT快速傅里叶变换算法
1.FFT算法概要: FFT(Fast Fourier Transformation)是离散傅氏变换(DFT)的快速算法.即为快速傅氏变换.它是根据离散傅氏变换的奇.偶.虚.实等特性,对离散傅立叶变换 ...
- angular之表达式
1.作用:使用表达式把数据绑定到HTML. 2.语法:表达式写在双打括号内:{{expression}} 3.比较:表达式作用类似于ng-bind指令:建议更多的使用指令. 4.AngularJS表达 ...
- Mysql更新关联子查询报错
报错内容:sql 1093 - You can't specify target table 'u' for update in FROM clause 错误原因: if you're doing ...