• Redis搭建主从同步流程及原理


    一、关于 Redis 主从复制

    1.1 关于 Redis 的主从复制

    redis 的主从复制分为全量复制和增量复制,全量复制是slave重写master生成的rdb文件。增量复制类似于MySQL主从复制,master将操作记录到日志中,并同步到slave,来完成同步。

    1.2 Redis 主从架构

    在这里插入图片描述
    redis 配置主从同步后,默认从库只能读,不可写。

    1.3 优缺点

    优点:

    • 实现数据备份,提高安全性
    • 实现读写分离,提高性能

    缺点:

    • 增加维护成本
    • 当多个 slave 节点宕机,增加主服务压力
    • 数据延迟同步问题

    二、配置 Redis 主从复制

    2.1 准备事项

    ip端口角色redis版本
    39.101.1.1226379主(master)Redis 6.2.7
    175.24.33.2006379从(slave)Redis 6.2.7

    2.2 同步服务器的时区和时间

    2.3 关闭服务器防火墙

    centos示例:

    • 查看防火墙
    systemctl status firewalld.service
    
    • 1
    • 开启防火墙
    systemctl start firewalld.service
    
    • 1
    • 关闭防火墙
    systemctl stop firewalld.service
    
    • 1

    2.4 开启端口

    主服务 在服务器运营商中开启:6379 端口。

    2.5 修改配置文件

    修改主服务配置文件(redis.conf):

    # 默认是 127.0.0.1,0.0.0.0 可非本地访问
    bind 0.0.0.0
    
    • 1
    • 2

    修改从服务配置文件(redis.conf)(如果需要一主多从,从服务的配置方式一样):

    # 默认是 127.0.0.1,0.0.0.0 可非本地访问
    bind 0.0.0.0
    # 从属于主redis
    slaveof 39.101.1.122 6379 
    
    • 1
    • 2
    • 3
    • 4

    2.6 重启 Redis 服务

    重启服务,将修改后的配置文件重载。

    注意优先级,先重启主服务,在重启子服务。

    2.7 查看连接状态

    主服务查看:info replication

    127.0.0.1:6379> info replication
    # Replication
    role:master
    connected_slaves:1
    slave0:ip=175.24.33.200,port=6379,state=online,offset=28457,lag=1
    master_failover_state:no-failover
    master_replid:020a7669df2d1f28093f39e3c344757d56ccd66e
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:28457
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:28457
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    从服务查看:info replication

    127.0.0.1:6379> info replication
    # Replication
    role:slave
    master_host:39.101.1.122
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:5
    master_sync_in_progress:0
    slave_read_repl_offset:28807
    slave_repl_offset:28807
    slave_priority:100
    slave_read_only:1
    replica_announced:1
    connected_slaves:0
    master_failover_state:no-failover
    master_replid:020a7669df2d1f28093f39e3c344757d56ccd66e
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:28807
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:28807
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    只要主服务看到的 connected_slaves (从服务连接量正确),和从服务看到的 master_link_statusup 即可,不能是 downdown 代表未连接成功。

    其中,role 显示当前角色,master 或 slave。

    2.8 测试

    主服务:

    127.0.0.1:6379> set name haha
    OK
    
    • 1
    • 2

    从服务:

    127.0.0.1:6379> get name
    "haha"
    
    • 1
    • 2

    三、全量同步和增量同步

    上面介绍了主从的搭建过程,这儿在介绍下主从同步的流程。

    redis 有两种同步方式:全量同步 和 增量同步

    整个流程:

    在这里插入图片描述

    3.1 全量同步

    全量同步:master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog,逐个发送给slave。

    在这里插入图片描述
    过程概述:

    • slave 节点请求增量同步
    • master检查replid不一致,拒绝增量同步,开始全量同步
    • master将完整的内存数据生成RDB文件,发送给slave
    • slave清空本地数据,加载RDB文件
    • master将RDB期间接收到的命令记录在repl_baklog,并持续将log中的命令发送给slave
    • slave执行接收到的命令,与master保持同步

    什么时候执行全量同步?

    1、slave节点第一次连接master节点时。

    2、slave节点断开时间太久,repl_baklog中的offset已经被覆盖时。

    3.2 增量同步

    增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave。

    过程概述:

    • slave请求增量同步
    • master检查replid是否一致
    • 一致,master 去 repl_baklog 中获取 offset 后的数据
    • master 发送 offset 后的命令
    • slave 接收后执行命令
    • 完成同步

    什么时候执行增量同步?

    1、slave节点断开又恢复,并且在repl_baklog中能找到offset时

    四、常见问题

    问题一:使用 info 查看状态的时候 master_link_status 为 down

    • 原因一:

      虽然 redis 服务已开启,但是 6379 端口在安全组中未开放。

    • 原因二:

      主配置文件和从配置文件中的 bind 为 127.0.0.1,应该设置成 0.0.0.0

    • 原因三:

      replicaof 和 slaveof 的区别:replicaof 是新版的命令,slaveof 是旧版的

      replicaof :>= 5.0.0
      slaveof:>= 1.0.0.

      版本查询:https://www.redis.com.cn/

    • 原因四:

      主服务设置了密码,但是从服务没有配置该密码。可通过 masterauth 在配置文件中配置上即可。

    • 原因五:主服务或从服务没关闭防火墙

    问题二:关于 repl_baklog

    repl_baklog这个文件是一个固定大小的数组,只不过数组是环形,也就是说角标到达数组末尾后,会再次从0开始读写,这样数组头部的数据就会被覆盖。

    数组一旦写满,再有新数据写入时,就会覆盖数组的旧数据。此时slave来增量同步,发现自己offset已经被覆盖了,此时只能全量同步。

    问题三:在不设置哨兵的情况下 master宕机或重启,导致 slave 频繁全量复制

    https://www.cnblogs.com/qq1971590238/p/16140998.html

    五、结束

    参考文档:

    https://www.cnblogs.com/tangs1/p/15784878.html

    https://blog.csdn.net/qq_45748269/article/details/121622447

    https://blog.csdn.net/weixin_43889841/article/details/105078298

    https://sunnyboy.blog.csdn.net/article/details/117483197

  • 相关阅读:
    C++ opengl 纹理映射
    wy的leetcode刷题记录_Day51
    电容笔和Apple pencil区别有什么?双十一值得入手的电容笔推荐
    Create Web, Desktop, Mobile Apps for .NET 8 with Telerik
    虹科分享 | MKA:基于先进车载网络安全解决方案的密钥协议
    C语言实现顺序表(图解增删查改+代码)
    【MySQL】Navicat15 安装
    java毕业设计儿童疫苗接种提醒系统小程序服务端Mybatis+系统+数据库+调试部署
    Webpack和Vite
    [论文阅读] 颜色迁移-Linear Monge-Kantorovitch(MKL)
  • 原文地址:https://blog.csdn.net/qq_42249896/article/details/127724595