Redis设计与实现——多机数据库的实现
复制
旧版Redis的复制功能分为同步(sync)和命令传播两个操作。
sync:是一个非常耗费资源的操作 命令传播:


新版复制解决了旧版复制功能在处理断线重复制情况时的低效问题,使用PSYNC替代SYNC命令来执行复制的同步工作。
PSYNC命令具有完整重同步和部分重同步,完整重同步与sync类似,部分重同步如下:

部分重同步的实现
复制偏移量:

复制积压缓冲区:
复制积压缓冲区是由主服务器维护的一个固定长度先进先出队列,默认大小为1MB。

PSYNC实现流程:

总结:

Sentinel
Sentinel(哨兵)是redis的高可用(high avaliability)解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,当主服务器下线,自动升级一个从服务器为主服务器,代替已下线服务器接受命令。


集群
节点

槽指派

在集群中执行命令
在对数据库中的16384个槽都进行了指派之后,集群会进入上线状态,这时客户端就可以向集群中的节点发送数据命令了。

重新分片
Redis集群的重新分片操作可以将任意数量已经指派给某个源节点的槽改为指派给另一个目标节点,并且相关槽所属的键值对也会从源节点移动到目标节点。
复制和故障转移
Redis集群中的节点分为主节点和从节点,其中主节点用于处理槽,而从节点主要用于复制某个主节点,并在被复制的主节点下线时,代替下线主节点继续处理命令请求。

其中7000,7001,7002,7003为主节点,而7004,7005为从节点。
消息
MEET消息:发送者会向接受者发送MEET消息,请求接受者加入到发送者当前所处的集群里面。
PING消息:检查检点是否在线。
PONG消息:回应消息。
FAIL消息:当主节点A判断主节点B已经进入FAIL状态,节点A向集群广播一条关于节点B的FAIL消息,收到消息的节点都会立即将节点B标记为下线。
PUBLISH消息:当节点收到该命令,则执行,并广播一条PUBLISH命令,所有收到消息的节点都会执行相同的命令。
Redis设计与实现——多机数据库的实现的更多相关文章
- 探索Redis设计与实现9:数据库redisDb与键过期删除策略
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- Redis学习笔记之多机数据库
1.复制 完整重同步,从服务器完全复制主服务器的数据,主要通过RDB文件和单条命令传输(套接字连接). 部分重同步,主服务器进行命令传播的时候,不仅会把写命令发送给从服务器,而且还会把写命令放入复制积 ...
- 【笔记】《Redis设计与实现》chapter9 数据库
9.1 服务器中的数据库 Redis服务器将所有都保存在服务器状态redis.h/redisServer结构中 struct redisServer{ //... // 一个数组,保存着服务器中所有数 ...
- redis实现与分析-多机数据库
1.复制,主从结构 redis 2.8以前的复制,由2个步骤 1.初始的同步 2.命令传播 存在问题:同步时出现主从 断线,需要重新发送同步sync信号,非常消耗性能 redis2.8以后新版复制 采 ...
- Redis 设计与实现 (五)--多机数据库的实现
多机数据库的实现 一.复制 slaveof 主服务器ip地址.形成主从关系. 1.同步 从向主服务器发送sync命令. 主服务器收到sync命令执行bgsave,生成rdb文件,缓冲区同时记录从 ...
- Redis多机数据库
复制 PSYNC命令具有完整重同步(full resynchronization)和部分重同步(partial resynchronization)两种模式: ·其中完整重同步用于处理初次复制情况:完 ...
- Redis | 第4章 Redis中的数据库《Redis设计与实现》
目录 前言 1. Redis中的数据库 2. 数据库的键空间 3. 键的生成时间与过期时间 4. Redis中的过期键删除策略 5. AOF.RDB和复制功能对过期键的处理 5.1 生成 RDB 文件 ...
- Redis设计与实现2.1:数据库和事件
数据库和事件 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 数据库 数据库的结构定义在 redis.h/redisServer 这个结构体中,这个结构体有许多 ...
- 《Redis设计与实现》- 数据库
1. 服务器中数据库结构 Redis 服务器将所有数据库都保存在服务器状态 redisServer 结构的 db 数组中,由 redisDb 结构代表一个数据库 struct redisServer ...
随机推荐
- 题解 洛谷 P5163 【WD与地图】
首先将操作倒序,把删边转化为加边.先考虑若边是无向边,条件为连通,要怎么处理. 可以用并查集来维护连通性,对每个连通块维护一颗权值线段树,连通块的合并用线段树合并来实现,线段树同时也支持了修改点权. ...
- python mysql中in参数化说明
第一种:拼接字符串,可以解决问题,但是为了避免sql注入,不建议这样写 还是看看第二种:使用.format()函数,很多时候我都是使用这个函数来对sql参数化的 举个例子: select * from ...
- python-元类和使用元类实现简单的ORM
元类 面向对象中,对象是类的实例,即对象是通过类创建出来的,在python中,一切皆对象,同样,类也是一个对象,叫做类对象,只是这个类对象拥有创建其子对象(实例对象)的能力.既然类是对象,那么类是通过 ...
- UUID字符串使用
UUID字符串使用 1.可以生成唯一的字符串标示,在发送请求中可能会用到 function uuid(num) { var s = []; var hexDigits = "01234567 ...
- 使用expect在script中切换到root用户(精华)
使用expect在script中切换到root用户 1.尚观版本 http://www.uplook.cn/biancheng/133/1335040/ 1 a. 命令行: /usr/bin/expe ...
- Blash数组 c++
//输入一个数作为Blash数组的根, //对于该数组的每一个数x,x*2+1 x*3+1均在该数组 //并且该数组没有其他数字 //该数组升序排列 //输入a,n 输出该数组第n个数 // // # ...
- Servlet学习之Tomcat控制台中文乱码问题
Tomcat控制台中文乱码问题 在更新了IDEA2020.1版本后,可以安装官方的简体中文插件,方便我们日常使用,但是更新后再运行Tomcat时,控制台的输出日志出现中文乱码问题,接下来告诉大家如何修 ...
- cmd 安装第三方库问题
pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 一定要指定 信任豆瓣源,不然就算换了源 ...
- pandas 几个重要知识点
将 NaN 替换成某一数值 使用 fillna dataframe.fillna(value = 'xxx',inplace=True) 删除某一个值 使用 drop dataframe.drop(1 ...
- Python字符串内建函数_上
Python字符串内建函数: 注:汉字属于字符(既是大写又是小写).数字可以是: Unicode 数字,全角数字(双字节),罗马数字,汉字数字. 1.capitalize( ): 将字符串第一个字母大 ...