[redis 源码走读] - 主从数据复制 ①

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

redis 主从模式作用:多节点协调工作保证服务高可用;读写分离,提高系统负载能力;多节点保存数据副本,确保数据安全性。

主从模式,需要实现数据同步,master 节点将数据(全量/增量)复制到链接它的 slave 节点。redis 为了保证节点高性能,采用了异步的数据复制方式,高效地实现了数据的最终一致,并非强一致。

那么接下来,将分两个章节来探索 redis 数据复制的核心工作流程。


1. 复制架构

 
    # Master-Replica replication. Use replicaof to make a Redis instance a copy of
    # another Redis server. A few things to understand ASAP about Redis replication.
    #
    #   +------------------+      +---------------+
    #   |      Master      | ---> |    Replica    |
    #   | (receive writes) |      |  (exact copy) |
    #   +------------------+      +---------------+

主从复制,数据是由 master 发送到 slave。一般有两种架构:一主多从,链式主从。这两种复制架构各有优缺点:

  • A 图,主从节点间数据复制实时性较好,但是如果 slave 节点数量多了,master 复制数据量就会增大,特别是全量复制场景,对 master 性能影响比较大。
  • B 图,D,E sub-slave 节点数据复制实时性相对差一点,但是能降低 master 数据复制给多个从节点的压力,整个系统能支撑更大的负载。


2. 配置

redis.conf 对应 REPLICATION 部分主要配置项内容。

 
    # 服务建立主从关系命令,设置该服务为其它服务的 slave。
    replicaof <masterip> <masterport>
    
    # slave是否支持写命令操作。
    replica-read-only yes
    
    # 积压缓冲区大小。缓冲区在 master,slave 断线重连后,
    # 如果是增量复制,master 就从缓冲区里取出数据复制给 slave。
    repl-backlog-size 1mb
    
    # 防止脑裂设置,对 slave 的链接数量和 slave 复制(保活)时间限制。
    min-replicas-to-write 3
    min-replicas-max-lag 10

3. 客户端命令

3.1. replicaof

客户端命令:replicaof / slaveof,可以使两个 redis 实例实现主从复制关系。

 
    # 建立主从关系。
    replicaof <masterip> <masterport>
    
    # 取消主从关系。
    replicaof no one

replicaof 和 slaveof 命令实现方法相同,但是不支持 redis cluster 集群模式下使用。

 
    // replicaof 和 slaveof 命令功能实现相同。
    struct redisCommand redisCommandTable[] = {
        ...
        {"slaveof",replicaofCommand,3,
         "admin no-script ok-stale",
         0,NULL,0,0,0,0,0,0},
    
        {"replicaof",replicaofCommand,3,
         "admin no-script ok-stale",
         0,NULL,0,0,0,0,0,0},
        ...
    }
    
    // 不支持 cluster 集群模式。
    void replicaofCommand(cli
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值