• Redis 主从复制



    概述

    • 主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器,前者称为主节点,后者称为从节点
    • 一个主节点可以有零个或多个从节点,但每个从节点只能有一个主节点
    • 数据的复制是单向的,只能由主节点复制到从节点
    • 从节点仅仅用来同步数据,不能用于顶替宕机的主节点
    • 主从服务器之间采用的是「读写分离」的方式,主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而从服务器一般是只读,并接受主服务器同步过来写操作命令,然后执行这条命令

    开启主从复制

    Ubuntu 18.04.5,redis-7.0.4 为例,准备三台机器并修改配置,这里以一台机器的三个端口作演示,分别是 6379、6380、6381,对应主节点、从节点一、从节点二

    我们可以使用 replicaof(Redis 5.0 之前使用 slaveof)命令,形成主服务器和从服务器的关系

    比如,分别在从节点一、从节点二执行下面这条命令:

    #replicaof <主节点的IP地址> <主节点的Redis端口号>
    replicaof 127.0.0.1 6379
    
    • 1
    • 2

    也可以修改从节点一、从节点二的配置文件

    从节点一配置

    slave1
    port 6380
    # replicaof   分别对应主节点的ip和port
    replicaof 127.0.0.1 6379
    
    • 1
    • 2
    • 3
    • 4

    从节点二配置

    slave2
    port 6381
    # replicaof   分别对应主节点的ip和port
    replicaof 127.0.0.1 6379
    
    • 1
    • 2
    • 3
    • 4

    然后分别进入三个节点的目录,启动 redis

    /redis/master/redis-server redis.conf
    /redis/slave1/redis-server redis.conf
    /redis/slave2/redis-server redis.conf
    
    • 1
    • 2
    • 3

    其他配置

    # 设置master的密码(如果master用requirepass指定了密码)
    masterauth 
    # 设置指定的master用户,可以用该项为slave指定一个特定用户用于同步
    masteruser 
    # 当slave失去与master的连接,或者数据同步正在进行时,slave的行为有两种可能:
    # yes(默认):slave会继续响应客户端请求,可能会返回过期数据或空数据
    # no:slave将对所有数据访问命令返回指定错误信息,除了以下命令:
    # INFO, REPLICAOF, AUTH, SHUTDOWN, REPLCONF, ROLE, CONFIG, SUBSCRIBE,UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, COMMAND, POST,HOST and LATENCY
    replica-serve-stale-data yes
    # 设置slave是否接受写操作,可写的slave实例可能对存储临时数据比较有用(因为写入salve的数据在同master同步后很容易被删除)
    # 但如果客户端由于配置错误而向其写入数据,也可能会导致问题,所以默认不接受写操作
    replica-read-only yes
    # 数据同步策略:磁盘或socket,默认使用socket
    # 新创建的slave和重新连接的slave只能执行“完全同步”,即将RDB文件从master传输到副本
    # 可能发生的传输方式有两种:
    # 磁盘备份:master创建一个用于将RDB文件写入磁盘的进程,完成之后将RDB文件传输给slave
    # socket:master创建一个新的进程,直接将RDB文件写入副本套接字
    # 使用磁盘方式,所有slave可以共享生成的RDB文件,而使用socket方式,所有salve必须排队等候传输
    # 绝大多数情况下,磁盘速度比网络慢
    repl-diskless-sync yes
    # 如果开启socket方式,可以配置延迟时间,以等待master创建子进程,从而并行的通过socket传输
    # 默认值为5秒,设置为0秒则为无延迟,必须等当前传输完成才能继续下一个
    repl-diskless-sync-delay 5
    # 如果开启socket方式,可以配置最大连接salve数,当连接的slave数量达到最大值时将开始传输,不需要等到延迟时间结束
    # 设置为0则为不限制,延迟时间结束才开始传输
    repl-diskless-sync-max-replicas 0
    # 如果使用socket方式,当slave收到master的rdb文件时有三种选择:
    # disabled:将rdb文件存储到磁盘,等全部接收以后加载到内存
    # on-empty-db:接受所有rdb文件到内存中,然后直接解析该rdb文件
    # swapdb:先拷贝当前数据到内存,当来自master的rdb文件解析成功以后再删除掉拷贝,不成功则恢复,这能避免数据丢失,但需要相当大的内存,有可能导致OOM
    repl-diskless-load disabled
    # master每隔一段时间slave发送ping,默认值为10秒
    repl-ping-replica-period 10
    # 超时时间,适用于三种场景:
    # 1.同步期间的大容量传输I/O
    # 2.master认为slave超时
    # 3.slave认为master超时
    # 注意超时时间必须大于repl-ping-replica-period设置的时间间隔,默认60s
    repl-timeout 60
    # 是否设置主从之间tcp链接为nodelay
    # 如果设置为yes,Redis将使用较少的带宽将数据复制到副本,这可能会增加数据在副本的延迟
    # 如果设置为no,Redis将更多带宽将用于复制,数据在副本的延迟减少
    repl-disable-tcp-nodelay no
    # 设置复制缓冲区的大小
    # 如果slave断开连接,当slave再次连接时,通常不需要重新同步所有数据,只需要重新同步slave断开时丢失的部分数据即可
    # 缓冲区越大,副本所能承受的断开时间就越长
    # 只有在master至少连接了一个slave时,才会使用缓冲区
    repl-backlog-size 1mb
    # 如果一段时间后master没有连接的slave,那么缓存将被释放,下面选项配置释放缓冲的时间
    # 注意,slave不会释缓冲,因为slave随时可能升级为master,并且与其他slave重新同步数据
    # 如果设置为0表示永不释放
    repl-backlog-ttl 3600
    # Redis哨兵机制会根据优先级来选择要升级为master的slave,优先级较低的slave被认为更适合升级
    # 如果优先级设置为0表示无法升级
    # 默认情况下,优先级为100
    replica-priority 100
    # 从master同步数据或者从aof读取数据时可能会出错,造成数据不一致
    # 默认设置ignore,表示忽略错误继续执行命令(旧版redis可能会复制持久化在未来版本中可能会出错的命令)
    # 设置为panic或panic-on-replicas,出现错误则抛出异常
    propagation-error-behavior ignore
    # 默认为no,表示当slave无法将从master收到的写命令持久化时,将抛出异常
    # 不建议修改默认值,但为了兼容老版本redis可以设置yes,这只会记录一个警告日志并执行收到的写命令
    replica-ignore-disk-write-errors no
    # 设置是否公布该副本,默认情况,哨兵会公布所有副本
    # 副本可以从哨兵的公告中移除,一个未公布的副本会忽略"sentinel replicas "命令并且不会暴露给哨兵的客户端
    # 该项不影响replica-priority优先级设置
    replica-announced yes
    # 以下两个设置通常联合使用,用于设定slave(在线且延迟不超过指定秒数,延迟从最后一次收到slave的ping计算,slave通常每秒一次ping)数量少于某个值时master停止将写操作
    # 任何一个设置为0都可关闭该功能
    # 默认min-replicas-to-write为0,功能是关闭的,min-replicas-max-lag是10
    min-replicas-to-write 3
    min-replicas-max-lag 10
    # master有多种方式展示slave的ip和port列表,例如“INFO replication”命令,master的“ROLE”命令
    # 在使用端口转发或者NAT时,副本可能会使用多个不同的ip和port
    # 以下两个设置可以明确的将slave的ip和prt报告给master
    # 如果只需要覆盖port或IP地址,可以不需要同时设置这两个选项
    replica-announce-ip 5.5.5.5
    replica-announce-port 1234
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    参考文章


  • 相关阅读:
    Go语言函数签名和匿名函数
    CloudKit提示Permission Failure:Invalid bundle ID for container 错误的超详细解决
    含文档+PPT+源码等]精品基于Uniapp+SSM实现的设备管理APP[包运行成功]Android毕业设计Java项目源码论文
    Vmware安装
    帆软FINEREPORT11报表移动端自动显示报表内容解决方案
    【金九银十必问面试题】这应该是面试官最想听到的回答,Mysql如何解决幻读问题?
    【JavaSE】内部类
    14:00面试,14:06就出来了,问的问题过于变态了。。。
    【2022南京大学jyy操作系统】(二) 多处理器编程
    Serverless如何赋能餐饮行业数字化?乐凯撒思变之道
  • 原文地址:https://blog.csdn.net/CSDN_handsome/article/details/126438462