从零单排学Redis【铂金一】
前言
好的,今天我们要上铂金段位了,如果还没经历过青铜和白银和黄金阶段的,可以先去蹭蹭经验再回来:
从零单排学Redis【青铜】
从零单排学Redis【白银】
从零单排学Redis【黄金】
这篇文章主要讲的是Redis主从复制。因为Redis集群的知识点有点多,所以铂金上分得要好几篇~
文本力求简单讲清每个知识点,希望大家看完能有所收获
一、主从架构
1.1为什么要主从架构
Redis也跟关系型数据(MySQL)一样,如果有过多请求还是撑不住的。
因为Redis如果只有一台服务器的话,那随着请求越来越多:
Redis的内存是有限的,可能放不下那么多的数据
单台Redis支持的并发量也是有限的。
万一这台Redis挂了,所有的请求全走关系数据库了,那就更炸了。
显然,出现的上述问题是因为一台Redis服务器不够,所以多搞几台Redis服务器就可以了
为了实现我们服务的高可用性,可以将这几台Redis服务器做成是主从来进行管理
tip:Redis作者已将Master/Slave架构改名为Master/Replica
1.2 主从架构的特点
下面我们来看看Redis的主从架构特点:
主服务器负责接收写请求
从服务器负责接收读请求
从服务器的数据由主服务器复制过去。主从服务器的数据是一致的
主从架构的好处:
读写分离(主服务器负责写,从服务器负责读)
高可用(某一台从服务器挂了,其他从服务器还能继续接收请求,不影响服务)
处理更多的并发量(每台从服务器都可以接收读请求,读QPS就上去了)
主从架构除了上面的形式,也有下面这种的(只不过用得比较少):
二、复制功能
主从架构的特点之一:主服务器和从服务器的数据是一致的。
因为主服务器是能接收写请求的,主服务器处理完写请求,会做什么来保证主从数据的一致性呢?如果主从服务器断开了,过一阵子才重连,又会怎么处理呢?下面将会了解到这些细节~
在Redis中,用户可以通过执行SALVEOF命令或者设置salveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(salve)
2.1复制功能的具体实现
复制功能分为两个操作:
同步(sync)
将从服务器的数据库状态更新至主服务器的数据库状态
命令传播(command propagate)
主服务器的数据库状态被修改,导致主从服务器的数据库状态不一致,让主从服务器的数据库状态重新回到一致状态。
从服务器对主服务器的同步又可以分为两种情况:
初次同步:从服务器没有复制过任何的主服务器,或者从服务器要复制的主服务器跟上次复制的主服务器不一样。
断线后同步:处于命令传播阶段的主从服务器因为网络原因中断了复制,从服务器通过自动重连重新连接主服务器,并继续复制主服务器
在Redis2.8以前,断线后复制这部分其实缺少的只是部分的数据,但是要让主从服务器重新执行SYNC命令,这样的做法是非常低效的。(因为执行SYNC命令是把所有的数据再次同步,而不是只同步丢失的数据)
接下来我们来详细看看Redis2.8以后复制功能是怎么实现的:
2.1.1 复制的前置工作
首先我们来看一下前置的工作:
从服务器设置主服务器的IP和端口
建立与主服务器的Socket连接
发送PING命令(检测Socket读写是否正常与主服务器的通信状况)
身份验证(看有没有设置对应的验证配置)
从服务器给主服务器发送端口的信息,主服务器记录监听的端口
前面也提到了,Redis2.8之前,断线后同步会重新执行SYNC命令,这是非常低效的。下面我们来看一下Redis2.8之后是怎么进行同步的。
Redis从2.8版本开始,使用PSYNC命令来替代SYNC命令执行复制时同步的操作。
PSYNC命令具有完整重同步和部分重同步两种模式(其实就跟上面所说的初次复制和断线后复制差不多个意思)。
2.1.2 完整重同步
下面先来看看完整重同步是怎么实现的:
从服务器向主服务器发送PSYNC命令
收到PSYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件。并用一个缓冲区来记录从现在开始执行的所有写命令。
当主服务器的BGSAVE命令执行完后,将生成的RDB文件发送给从服务器,从服务器接收和载入RBD文件。将自己的数据库状态更新至与主服务器执行BGSAVE命令时的状态。
主服务器将所有缓冲区的写命令发送给从服务器,从服务器执行这些写命令,达到数据最终一致性。
2.1.2 部分重同步
接下来我们来看看部分重同步,部分重同步可以让我们断线后重连只需要同步缺失的数据(而不是Redis2.8之前的同步全部数据),这是符合逻辑的!
部分重同步功能由以下部分组成:
主从服务器的复制偏移量
主服务器的复制积压缓冲区
服务器运行的ID(run ID)
首先我们来解释一下上面的名词:
复制偏移量:执行复制的双方都会分别维护一个复制偏移量
主服务器每次传播N个字节,就将自己的复制偏移量加上N
从服务器每次收到主服务器的N个字节,就将自己的复制偏移量加上N
通过对比主从复制的偏移量,就很容易知道主从服务器的数据是否处于一致性的状态!
那断线重连以后,从服务器向主服务器发送PSYNC命令,报告现在的偏移量是36,那么主服务器该对从服务器执行完整重同步还是部分重同步呢??这就交由复制积压缓冲区来决定。
当主服务器进行命令传播时,不仅仅会将写命令发送给所有的从服务器,还会将写命令入队到复制积压缓冲区里面(这个大小可以调的)。如果复制积压缓冲区存在丢失的偏移量的数据,那就执行部分重同步,否则执行完整重同步。
服务器运行的ID(run ID)实际上就是用来比对ID是否相同。如果不相同,则说明从服务器断线之前复制的主服务器和当前连接的主服务器是两台服务器,这就会进行完整重同步。
所以流程大概如此:
2.1.3 命令传播
当完成了同步之后,主从服务器就会进入命令传播阶段。这时主服务器只要将自己的写命令发送给从服务器,而从服务器接收并执行主服务器发送过来的写命令,就可以保证主从服务器一直保持数据一致了!
在命令传播阶段,从服务器默认会以每秒一次的频率,向服务器发送命令REPLCONF ACK <replication_offset>
其中replication_offset是从服务器当前的复制偏移量
发送这个命令主要有三个作用:
检测主从服务器的网络状态
辅助实现min-slaves选项
检测命令丢失
五、最后
画了好久好久的图,终于写完啦。
抛个问题:如果从服务器挂了,没关系,我们一般会有多个从服务器,其他的请求可以交由没有挂的从服务器继续处理。如果主服务器挂了,怎么办?因为我们的写请求由主服务器处理,只有一台主服务器,那就无法处理写请求了?
问题留到下篇解决~~
参考资料:
《Redis设计与实现》
《Redis实战》
从零单排学Redis【铂金一】相关推荐
- 从零单排学Redis【铂金二】
前言 好的,今天我们要上[铂金二]了,如果还没有上铂金的,赶紧先去蹭蹭经验再回来(不然不带你上分了): 从零单排学Redis[青铜] 从零单排学Redis[白银] 从零单排学Redis[黄金] 从零单 ...
- 从零单排学Redis【黄金】
前言 好的,今天我们要上黄金段位了,如果还没经历过青铜和白银阶段的,可以先去蹭蹭经验再回来: 从零单排学Redis[青铜] 从零单排学Redis[白银] 看过相关Redis基础的同学可以知道Redis ...
- 从零单排学Redis【白银】
前言 今天继续来学习Redis,上一篇从零单排学Redis[青铜]已经将Redis常用的数据结构过了一遍了.如果还没看的同学可以先去看一遍再回来~ 这篇主要讲的内容有: Redis服务器的数据库 Re ...
- 【3y】从零单排学Redis【青铜】
前言 只有光头才能变强 最近在学Redis,我相信只要是接触过Java开发的都会听过Redis这么一个技术.面试也是非常高频的一个知识点,之前一直都是处于了解阶段.秋招过后这段时间是没有什么压力的,所 ...
- 从零单排学Redis【青铜】
前言 redis 最近在学Redis,我相信只要是接触过Java开发的都会听过Redis这么一个技术.面试也是非常高频的一个知识点,之前一直都是处于了解阶段.秋招过后这段时间是没有什么压力的,所以打算 ...
- 编程没基础学python多长时间-零基础学Python的过程有多难?需要多久?
Python是一门简单高效,应用范围广泛的计算机语言.先我们要知道Python已经算是一门相对其他编程语言而言,最适合零基础新手学习的开发语言,换句话说,如果连Python都学不进去就不要考虑进入IT ...
- 零基础学python全彩版实战答案-零基础学Python(全彩版)
商品描述: 本店出售的图书均是正版二手书,有一些笔记划线,基本是六-九品新左右,基本都没有光盘.介意者请提前咨询客服.本店所有书籍,因买家导致退货退款的,发出运费参照不包邮运费模板由买家承担.如果签收 ...
- 零基础学python图文版-杭州零基础学python图文版
杭州零基础学python图文版 来源:教育联展网 编辑:佚名 发布时间:2018-09-19 学习python有什么用? 如果你想学Python,或者你刚开始学习Python,那么你可能会问:&quo ...
- 0基础学python要多久-零基础学Python的过程有多难?需要多久?
Python是一门简单高效,应用范围广泛的计算机语言.先我们要知道Python已经算是一门相对其他编程语言而言,最适合零基础新手学习的开发语言,换句话说,如果连Python都学不进去就不要考虑进入IT ...
最新文章
- 踏上云旅程 存储准备好了吗
- mxnet报错解决:AttributeError: module 'mxnet.context' has no attribute 'num_gpus'
- [BTS2004]一步一步学习BizTalk2004 CBR(content-based routing)
- OGG 同步报错 - TCP/IP error 111 (Connection refused)
- 微信开发-ACCESS TOKEN 过期失效解决方案
- Android Apk包的签名出库、自动编译与混淆
- 【C语言】创建一个函数,判断某一正整数是否为素数,并调用这个函数找出1000以内所有素数...
- 【音效处理】Delay/Echo 简介
- 和feign的区别_Feign的传参研究
- linux常用删除空文件夹,Linux基础 linux系统中的批量删除文件与空文件删除的命令介绍...
- 性能测试之JMeter配置元件【随机变量】
- layui table 表格两种赋值方式下,data分页效果有效, url分页效果的失效 问题的解决。
- 黑鸭宣布开源项目-年度新秀
- 犀牛脚本插件-python-vb-编辑使用方式-rhino脚本插件
- 【历史上的今天】11 月 28 日:中国顶级域名 CN 被注册;上世纪最大的论坛诞生;首个 Fortran 程序开发者逝世
- linux 安装 zookeeper
- python数据分析经典书籍有哪些_数据分析有哪些好书值得推荐?
- 仿Android端饿了么外卖的效果
- 数据产品经理类型划分和工作汇报框架
- 蚁群算法解决 TSP 问题
热门文章
- HTTP 和 HTTP API 设计
- LeetCode每日一题:N叉树的层序遍历(No.429)
- 一个后端开发人员的node.js学习笔记(一)安装与第一个服务器
- LeetCode--160--相交链表
- Apache httpd Server 配置正向代理
- 【51NOD-0】1012 最小公倍数LCM
- 用C语言扩展Python的功能
- Moore-Penrose广义逆:可解决MATLAB报错“矩阵接近奇异值,或者缩放错误。结果可能不准确”
- Linux下进程间通信方式之管道、信号、共享内存、消息队列、信号量、套接字
- boost之asio同步io使用实例