1、概念

主从复制是Redis的一项重要特性,用于将一个Redis服务器(Master主节点)的数据复制到其他Redis服务器(Slave从节点),以实现数据的高可用性和读写分离。数据的复制是单向的,只能由主节点到从节点。

2、作用

主从复制在Redis中扮演着重要的角色,带来了以下几个主要的作用:

  1. 高可用性:通过将数据复制到多个从节点,即使主节点发生故障,从节点可替代主节点提供服务,从而保障系统的高可用性。

  2. 读写分离:主节点负责处理写入操作,从节点负责处理读操作,从而分担主节点的负载,提高系统的整体性能。

  3. 数据冗余备份:由于从节点是主节点的副本,主节点数据的备份可以在从节点上实现。

  4. 高可用基石:主从复制还是哨兵和集群能够实施的基础。

3、配置

主从复制的配置涉及到主节点和从节点的设置,具体步骤如下:

  1. 配置主节点:在主节点的配置文件(redis.conf)中进行以下配置:

    # 启用主节点
    daemonize yes # 设置主节点的监听IP和端口
    bind <主节点IP>
    port <主节点端口> # 设置主节点的认证密码(可选)
    requirepass <密码> # 开启AOF持久化(可选,默认RDB持久化)
    appendonly yes
  2. 配置从节点:在从节点的配置文件(redis.conf)中进行以下配置:

    # 启用从节点
    daemonize yes # 设置从节点的监听IP和端口
    bind <从节点IP>
    port <从节点端口> # 设置从节点的认证密码(与主节点一致)
    requirepass <密码> # 设置主节点的地址和端口
    replicaof <主节点IP> <主节点端口>
  3. 启动节点:分别启动主节点和从节点:

    redis-server redis.conf   # 启动主节点
    redis-server redis.conf # 启动从节点
  4. 验证复制:查看从节点的状态,确保它已成功连接到主节点:

    redis-cli -h <从节点IP> -p <从节点端口> 
    
    info replication

如果看到输出中有role:slave,且master_hostmaster_port显示正确的主节点地址和端口,说明主从复制已经配置成功。

3、原理

主从复制过程大致可分为3个阶段:建立连接阶段、数据同步阶段、命令传播阶段。

3.1、第一阶段:建立链接、协商同步

  • 在执行replicaof命令后,slave会向master发送psync命令,携带master的runID(实例ID)和offset(复制进度)参数,因为是第一次请求复制,所以runID为?,offset为-1。
  • master收到psync命令后返回FULLRESYNC命令,并携带master的runID和offset,slave保存。

这一步的目的是为全量复制做准备。

3.2、第二阶段:数据同步

  • 完成第一阶段工作后,master会执行bgsave命令生成RDB文件,并发送给slave。
  • slave在收到RDB文件后,先清空本地数据,再加载新的RDB文件数据。

3.3、第三阶段:命令传播

  • 在完成第一次全量复制后,master与slave会建立一个长连接和replication buffer缓冲区,master的写入命令都会存入缓冲区。同时,master也会通过这个长连接将repl buffer数据传播给slave,来保证数据一致性。

那么有人可能会问,如果主从节点之间网络短暂中断,如何保证数据一致性?

答案:增量复制。

在2.8以前只有全量复制,如果主从库在命令传播时出现了网络闪断,那么,从库就会和主库重新进行一次全量复制,开销非常大。因此从Redis 2.8 开始提供了增量复制的功能,在网络断了之后,主从库会采用增量复制的方式继续同步。

  • savle在恢复网络后,会发送 psync 命令给master,此时的 psync 命令里的 offset 参数不是 -1。
  • master收到该命令后,然后用 continue 响应命令告诉slave接下来采用增量复制的方式同步数据。
  • 然后master将断网期间写入命令发送给slave,然后slave再执行这些命令。

写入命令除了写入repl buffer,还会写入repl backlog(复制积压缓冲区),默认大小为1M,在内存中为环形结构。主要用于根据offset找到增量数据。结构如下图:

注意点:

断开重连并不一定是增量复制。如上图所示,repl backlog为环形结构,如果网络断开时间太长,写入命令如果超过1M,旧的命令就会被覆盖。因此如果master offset和slave offset相差的数据已被覆盖则会通过全量复制。

因此,repl backlog可以适当配置大一些。

Redis从入门到放弃(7):主从复制的更多相关文章

  1. Redis 从入门到放弃

    Redis 从入门到放弃 http://www.iocoder.cn/Fight/Redis-went-from-getting-started-to-quitting/

  2. redis从入门到放弃 -> 部署方案

    单点部署方案 环境准备: [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@ ...

  3. redis从入门到放弃 -> 简介&概念

    一.redis简介 Redis是一款开源的.高性能的键-值存储.它常被称作是一款数据结构服务器. 当值支持的主要数据类型为:字符串(strings)类型,括哈希(hashes).列表(lists).集 ...

  4. Redis——从入门到放弃

    redis简介 Redis is an open source (BSD licensed), in-memory data structure store, used as a database, ...

  5. Redis从入门到精通:初级篇

    原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...

  6. 编程从入门到放弃(Java)

      1.Java入门篇 1.1 基础入门和面向对象 1.1.1 编程基础 [01] Java语言的基本认识 [02] 类和对象 [03] 类的结构和创建对象 [04] 包和访问权限修饰符 [05] 利 ...

  7. Redis从入门到精通:初级篇(转)

    原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...

  8. 后端API入门到放弃指北

    后端API入门学习指北 了解一下一下概念. RESTful API标准] 所有的API都遵循[RESTful API标准]. 建议大家都简单了解一下HTTP协议和RESTful API相关资料. 阮一 ...

  9. Redis数据库入门基础,及优缺点介绍

    简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis 是一个高性能的key-value数据库.R ...

  10. Go从入门到放弃

    Go语言介绍 为什么你应该学习Go语言? 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置Go语言开发环境 Go语言基础 Go语言基础之变量和常量 Go语言基础之基本数据类型 Go语言基 ...

随机推荐

  1. NOIP 2021 备战计划

    NOIP 2021 备战计划 复习知识点: 加粗表示一定去复习,?表示很可能不需要 线段树.树状数组:无论最近写多少遍都要去好好复习 Dij.SPFA:理由同上 大DP:哪个不重要? 门类:线性DP. ...

  2. 【Vue2】NavigationDuplicated: Avoided redundant navigation to current location:xxxxx

    翻译过来就是,导航重复:避免了到当前位置的冗余导航. 简单来说就是重复跳转了相同路径 原因 触发这种情况是因为vue-router中引入了primise,当传递了多次重复的参数就会抛出异常,而这种问题 ...

  3. #Powerquery pq从入门到精通,笔记梳理

    详细视频可以B站搜索,ms_excel博主,看leila的视频翻译课,powerquery从入门到精通. 后续也会根据自己工作来更新这部分的实际用法.

  4. 用tk.mybaits实现指定字段更新

    ​ 去年年底的因为业务需要需要在使用tk.mybaits框架的系统中实现指定字段的更新,可是tk.mybaits框架本身并不支持这个功能,我翻遍了CSDN和其他相关的技术相关的网站都没有找到相关的解决 ...

  5. 2022-09-19:给定字符串 S and T,找出 S 中最短的(连续)子串 W ,使得 T 是 W 的 子序列 。 如果 S 中没有窗口可以包含 T 中的所有字符,返回空字符串 ““。 如果有不

    2022-09-19:给定字符串 S and T,找出 S 中最短的(连续)子串 W ,使得 T 是 W 的 子序列 . 如果 S 中没有窗口可以包含 T 中的所有字符,返回空字符串 "&q ...

  6. 2021-10-19:缺失的区间。给定一个排序的整数数组 nums ,其中元素的范围在 闭区间 [lower, upper] 当中,返回不包含在数组中的缺失区间。力扣163。

    2021-10-19:缺失的区间.给定一个排序的整数数组 nums ,其中元素的范围在 闭区间 [lower, upper] 当中,返回不包含在数组中的缺失区间.力扣163. 福大大 答案2021-1 ...

  7. 2021-10-18:乘积最大子数组。给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。力扣152。

    2021-10-18:乘积最大子数组.给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积.力扣152. 福大大 答案2021-1 ...

  8. React笔记-Hooks(九)(非常全面)

    React笔记-Hooks(九) Hooks 概念 React Hooks 的意思是 组件尽量写成纯函数 如果需要外部功能和副作用 就用钩子把外部代码"钩"进来 函数组件和类组件区 ...

  9. 代码随想录算法训练营Day8字符串|●  344.反转字符串  541. 反转字符串II  剑指Offer 05.替换空格  151.翻转字符串里的单词  剑指Offer58-II.左旋转字符串

    344.反转字符串 题目连接:344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,__你必须原地修改输入数组.使用 ...

  10. 在Istio中,到底怎么获取 Envoy 访问日志?

    Envoy 访问日志记录了通过 Envoy 进行请求 / 响应交互的相关记录,可以方便地了解具体通信过程和调试定位问题. 环境准备 部署 httpbin 服务: kubectl apply -f sa ...