(一)主从复制介绍

前面所讲的关于redis的操作都属于单机操作,单机操作虽然操作简单,但是处理能力有限,无法高可用。所谓高可用性,就是指当一台服务器宕机的时候,有备用的服务器能顶替上,在单机操作上这是无法实现的,因此就出现了主从复制。

我们把一台服务器看作是主服务器(master),把另外多台服务器看作是从服务器(slave),主从复制就是将master中的数据即时有效的复制到slave中。

主从复制特征:

一个master可以拥有多个slave,一个slave只对应于一个master

master负责执行写数据,将出现变化的数据自动同步到slave

slave负责读数据,禁止写数据

有了主从复制之后,就可以实现高可用了,当一台slave宕机后,还有多台slave存在;当master宕机后,由于slave的数据和master是一样的,就可以推选一台slave为新的master,都能做到高可用。

主从复制的作用:

读写分离:master写,slave读

负载均衡:由slave分担master负载,并根据具体的需求可以改变slave的数量

故障恢复:当master出现问题时,可以由slave来代替master,实现快速恢复

数据冗余:有了多台slave,数据备份就变得更加容易

(二)主从复制工作流程

主从复制工作流程可以分为三个阶段:

1.建立连接阶段

2.数据同步阶段

3.命令传播阶段(反复同步)

2.1 建立连接阶段

1.设置master的地址和端口号

2.建立socket连接

3.发送ping命令(定时器任务)

4.身份验证

为了实现上述过程,我分别在两个端口开启redis服务,6379代表master,6380代表slave

复制两份redis的配置文件,重命名为redis6379.conf和redis6380.conf,分别修改配置文件中的port为6379和6380。在cmd下开启两个服务:

 再开启两个客户端分别连接两个redis服务,6379是master,6380是slave


  1. redis-cli -p 6379
  2. redis-cli -p 6380

主从连接

slaveof <masterip> <masterport>

此时主从连接已经完成,我在master设置一个name,在slave中可以直接获取

主从连接除了可以用命令连接之外,还可以在配置文件中进行配置,在redis6380.conf中增加这一句

slaveof 127.0.0.1 6379

再启动时就自动完成了主从连接

断开主从连接

slaveof no one

2.2 数据同步阶段

1.请求同步数据

2.创建RDB同步数据

3.恢复RDB同步数据

4.请求部分同步数据

5.恢复部分同步数据

光看这样5步可能有点抽象,用一张图来表示:

数据同步又分为全量复制和部分复制两块,其中全量复制就是你启动同步指令之后进行的RDB操作,把master中的数据通过RDB发送给slave。由于RDB采用bgsave指令,所以在全量复制期间master所做的操作会进入一个缓冲区,当全量复制结束后就需要通过部分复制来恢复缓冲区中的操作,这里采用AOF。

数据部分同步的注意事项:

通过上面的介绍我们知道了当在进行全量复制时所进行的操作会放入缓存区,但是如果缓存区设置过小就会导致master阻塞,通过下面方式可以设置缓存区大小:

repl-backlog-size 1mb

可以通过配置以下参数暂时关闭slave对外服务

slave-server-stable-data yes|no

2.3 命令传播阶段

命令传播阶段就是当master数据库状态发生变化,就会通过命令传播阶段同步给slave

命令传播阶段有三个核心要素:

服务器的运行id、主服务器的复制积压缓冲区、主从服务器的复制偏移量

服务器运行id:

服务器运行id是每台服务器每次运行的身份识别码,由40个字符组成,用于在服务器之间传输时识别身份。

主服务器的复制积压缓冲区:

复制积压缓冲区又称为复制缓冲区,是一个先进先出的队列。当master数据库发生变化时,master会将要传播给slave的命令保存在复制缓冲区中,slave分别从复制缓冲区接收信息。

主从服务器的复制偏移量:

因为命令传播阶段首先由master把数据放入缓冲区中,因此master需要一个复制偏移量记录发送给slave的指令对应的位置。而slave要把缓冲区中的数据同步到自己这里,因此也需要一个复制偏移量记录接收到的位置,如果因为意外断网,等网络再次连接之后就可以直接从复制偏移量的位置继续复制。

2.4 心跳机制

进入命令传播阶段后,master和slave需要通过心跳机制保持双方连接

master心跳:

通过ping指令查询slave是否在线,可由repl-ping-slave-period设置周期,默认10秒

slave心跳:

指令:

replconf ack {offset}

周期1秒;

作用:汇报slave自己的复制偏移量;判断master是否在线

当slave多数都掉线或者slave延迟过高时,可以强制关闭master的写功能,停止数据同步:


  1. min-slaves-to-write 2 当连接的slave小于等于2台时停止数据同步
  2. min-slaves-max-lag 10 当连接的slave延迟大于10秒,停止数据同步

redis入门到精通系列(八):redis的高可用--主从复制详解的更多相关文章

  1. redis入门到精通系列(四):Jedis--使用java操作redis详解

    (一)前言 如果不把数据库和后端语言联系起来,就起不到数据库应该要起到的作用.Java语言通过JDBC操作mysql,用Jedis操作redis.当然了,java操作redis的方式不止jedis一种 ...

  2. redis入门到精通系列(二):redis操作的两个实践案例

    在前面一篇博客中我们已经学完了redis的五种数据类型操作,回顾一下,五种操作类型分别为:字符串类型(string).列表类型(list).散列类型(hash).集合类型(set).有序集合类型(so ...

  3. redis入门到精通系列(一)

    (一)为什么要用Nosql 如果你是计算机本科学生 ,那么一定使用过关系型数据库mysql.在请求量小的情况下,使用mysql不会有任何问题,但是一旦同时有成千上万个请求同时来访问系统时,就会出现卡顿 ...

  4. redis入门到精通系列(九):redis哨兵模式详解

    (一)哨兵概述 前面我们讲了redis的主从复制,为了实现高可用,会选择一台服务器作为master,多台服务器作为slave.现在有这样一种情况,master宕机了,这时系统会选择一台slave作为m ...

  5. redis入门到精通系列(三):key的通用操作和redis内部db的通用操作

    五种数据类型都用到了key,key本身是一种字符串,通过key可以获取redis中保存的对象.这一篇博客就将介绍key的通用操作. (一)key基本操作 删除key del key key是否存在 e ...

  6. redis入门到精通系列(七):redis高级数据类型详解(BitMaps,HyperLogLog,GEO)

    高级数据类型和五种基本数据类型不同,并非新的数据结构.高级数据类型往往是用来解决一些业务场景. (一)BitMaps (1.1) BitMaps概述 在应用场景中,有一些数据只有两个属性,比如是否是学 ...

  7. redis入门到精通系列(六):redis的事务详解

    (一)事务的概念 谈到数据库的高级应用,不可避免会谈到事务.熟悉mysql的朋友们对事务肯定不陌生,简单来讲事务就是控制一个数据库操作序列要么全部执行要么全部不执行.今天我们就来了解redis中的事务 ...

  8. redis入门到精通系列(五):redis的持久化操作(RDB、AOF)

    (一)持久化的概述 持久化顾名思义就是将存储在内存的数据转存到硬盘中.在生活中使用word等应用的时候,如果突然遇到断电的情况,理论上数据应该是都不见的,因为没有保存的word内容都存放在内存里,断电 ...

  9. Jmeter(二) - 从入门到精通 - 创建测试计划(Test Plan)(详解教程)

    1.简介 上一篇中宏哥已经教你把JMeter的测试环境搭建起来了,那么这一篇我们就将JMeter启动起来,一睹其芳容,首先宏哥给大家介绍一下如何来创建一个测试计划(Test Plan). 2.创建一个 ...

随机推荐

  1. 『学了就忘』Linux基础命令 — 32、压缩和解压缩相关命令

    目录 1.".zip"格式压缩 2.".gz"格式压缩 3.".bz2"格式压缩 4.".tar"格式打包 5.打包和压 ...

  2. vue3快速上手

    前言 虽然Vue3肯定是未来的趋势,但还不是很成熟,实际开发中用的也不多,建议学Vue3之前先掌握Vue2,将Vue3作为未来的知识储备. Vue3快速上手 Vue3简介 2020年9月18日,Vue ...

  3. Python多版本共存的方法

    目录 Python2.Python3共存的方法 python2下载及环境变量配置 第一步.打开Python官网,下载Python2 第二步.python2环境变量配置 测试结果 Python2.Pyt ...

  4. Chrome handless无界面浏览器的脚本操作

    1.什么是Phantomjs (已经停止更新) 是一个无界面的浏览器 支持页面元素查找,js的执行等 由于不进行css和gui渲染,运行效率要比真实的浏览器要快很多 2.如何使用Phantomjs? ...

  5. 如何提高C# StringBuilder的性能

    本文探讨使用C# StringBuilder 的最佳实践,用于减少内存分配,提高字符串操作的性能. 在 .NET 中,字符串是不可变的类型.每当你在 .NET 中修改一个字符串对象时,就会在内存中创建 ...

  6. 软件分享:网页监测及 IIS 重启工具 IISMonitor

    本人以前编写过一款简单的工具软件 IISMonitor,这几天整理完善并补写了使用说明,分享出来,供大家免费使用.使用过程中,遇到什么问题或有什么建议,也可回帖留言,我尽力提供修改支持. 1.工具简介 ...

  7. flume的配置详解

    Flume:===================== Flume是一种分布式的.可靠的.可用的服务,可以有效地收集.聚合和移动大量的日志数据. 它有一个基于流数据的简单而灵活的体系结构. 它具有健壮 ...

  8. [ccBB]Billboards

    参考loj2265中关于杨表的相关知识 先来考虑$m\mid n$的情况: 记$t=\frac{n}{m}$,将序列划分为$[1,m],[m+1,2m],...,[(t-1)m+1,tm]$这$t$段 ...

  9. [atARC094F]Normalization

    考虑$s$能变成$t$的必要条件(假设$s\ne t$): 1.$s$中存在一对相邻字符不同 2.$|s|=|t|$且若将a-c对应为0-2,则字符模3同余: 3.$t$中存在一对相邻两个字符相同 同 ...

  10. vip视频解析保存

    无广告通用:https://vip.52jiexi.top/?url= 腾讯直解 无广告解析:https://jx.lfeifei.cn/?url= 无广告解析:https://api.steak51 ...