暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis 主从复制

老码农空杯修行记 2020-09-07
227

为保证高可用,实际中除了服务冗余,数据也要冗余,所以一些分布式组件,比如kafka等都会看到副本的概念,同样redis为了高可用也有副本的机制。

主从复制相关配置
    # 配置文件指定主节点redis的ip和端口信息
    # slaveof <masterip> <masterport>
    slaveof lacr_r1 6379


    # 主节点密码,用于同步前认证
    # masterauth <master-password>
    masterauth 122222


    # 主从失联后如何响应客户端
    # yes: 仍然用最新同步成功的数据响应,若初次
    # 同步,空值响应
    # no:响应错误 “SYNC with master in progress”
    slave-serve-stale-data yes


    # 从节点是否设置为只读,默认只读,但是可以设置为no
    # 可写,但这只能临时存储,一旦同步master以后,数据
    # 会丢失
    # 默认情况下,写slave会报错
    # (error) READONLY You can't
    # write against a read only slave.
    slave-read-only yes


    # 向slave传输快照时,是否不在磁盘上建立快照文件
    # no:默认选项,此时同步前会写快照文件,然后传输快照
    #     文件给slave
    # yes:主节点开启一个子进程,直接将rdb文件写入到与slave
    #      连接的socket中,不会写磁盘
    repl-diskless-sync no


    # master 有个同步传输队列存储了待同步的slave,
    # 待下一个同步周期来时给队列里的slave进行快照
    # 同步。
    # 配置为 diskless 模式时,为了一次能够同步给
    # 更多的slave,就是同步队列里有更多的slave,
    # 主节点同步前会有一个秒级别的等待,用来等待更
    # 多的slave进入同步队列,从而提高同步效率
    repl-diskless-sync-delay 5


    # 类似心跳,定义slave多长时间向master
    # 发送一个ping,默认10s
    repl-ping-slave-period 10


    # master 等待slave的ping的超时时间,
    # 设置上要大于 repl-ping-slave-period
    repl-timeout 60


    # 带宽和数据延迟的这种设置
    # no 占用更多带宽,发送更多数据,slave收到
    #    收到数据延迟低
    # yes tcp发送用更小的包,带宽小,但是slave
    # 收到数据会有延迟,大概40ms
    repl-disable-tcp-nodelay no


    # backlog 缓冲区
    # 主节点开辟的缓冲区,当slave分区网络
    # 断开时,重连没必要同步全部,只需要同步
    # 断开期间的即可,该缓冲设置越大,允许
    # slave断开的时间越长
    repl-backlog-size 1mb


    # 主节点多长时间没有slave链接时释放backlog
    # 缓冲区,单位s,设置0,表示永远不释放
    repl-backlog-ttl 3600


    # slave 优先级设定,当主节点工作不正常时
    # 该值越低的节点会被选为主节点,若设置为0
    # 表示永远不选则为主节点
    slave-priority 100


    # 当从节点数少于该配置的值时,不处理写请求
    # 默认为0
    min-slaves-to-write 3


    # 当从节点延迟超过10时,不处理写请求,延迟
    # 通过 PING 来评估
    # 默认为10s
    min-slaves-max-lag 10
    # 用于slave上报自己真实ip,port
    # 这些信息有助于redis哨兵发现slave
    # 实例,上报后这些信息可以用INFO,
    # ROLE 命令获取
    slave-announce-ip 5.5.5.5
    slave-announce-port 1234

    主从复制流程

    • redis-slave 节点发起链接,slaveof 决定
    • redis-slave 节点发送 sync 命令

    • redis-master 开启子进程执行BGSAVE
    • redis-master 执行完快照后,发送快照文件给 redis-slave
    • redis-slave 丢弃自己的数据,载入redis-master 发送的快照
    • redis-master 发送缓冲区的写命令给 redis-slave
    • redis-slave 执行这些缓冲区的命令,至此,一次完整的复制结束
    • redis-master 每接收一条写命令,则同步给从节点

    主从复制注意事项

    • redis 服务器设置为从节点时,原来可能存储了一些数据,若不想丢失,在开始设置为从服务器之前备份好这些数据,因为一旦设置为从,从服务会丢弃原有的数据,使用主节点的数据
    • 主服务器需要有足够的内存来创建子进程以及写缓冲区,一般最好让主服务器只使用50%~65%的内存,留下35%~45%用来BGSAVE子进程和写缓冲区

    • redis 不支持相互设置为主,也就是不支持主主复制,只支持主从复制
    • redis 主节点会尽可能的使用相同的快照发送给从节点,但是从节点不凑巧,在不同的时间点接入,那么主节点不得不每一个从节点执行复制的流程,此时响应服务性能会降低

    主从链

    redis从服务器可以由从服务器,本质上从从复制和从主复制没有本质区别,唯一差别在从主同步快照写快照时会断开从从链接,最底层从服务器需要重新链接同步快照

    有什么意义?当系统读请求要求特别高时,为了提高读性能,可能扩充很多从服务器,构成一主多从结构

    一主多从会使得主节点负载升高,大量从节点的同步、网络分区恢复后重新链接同步都使得主节点负载超限,此时可以通过主从链来缓解主节点的负载

    主从结构优点
    • 数据冗余:主节点宕机,还有从节点的数据可用
    • 存储高可用:主节点宕机,从节点可通过优先级提升为主
    • 提升读性能:多个从节点,分散单点读压力
    文章转载自老码农空杯修行记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论