Redis之复制

1.  如何配置复制

    1.  建立复制

        默认情况下,redis都是主节点,每个从节点只能有一个主节点,而一个主节点可以有多个从节点。复制的数据流是单向的,只能从主节点到从节点。

        1.  配置方式

            1.  在从节点的配置文件中,添加slaveof {masterHost} {masterPort},随着redis服务启动

            2.  从节点启动时,添加命令参数,也就是在redis-server后面加入--slaveof {masterHost} {masterPort}

            3.  进入从节点命令行,输入:slaveof {masterHost} {masterPort}

    2.  断开复制

        1.  配置方式

            1.  进入从节点命令行,输入:slaveof no one

        2.  断开复制的作用

            1.  从节点升级为主节点

                当主节点有问题,需要升级从节点为主节点

            2.  从节点指向新的主节点

                当从节点断开复制,并指向新的主节点时,从节点上的数据会被清除 

2.  如何保证复制的安全性

    1.  主节点设置验证密码

        1.  在主节点配置文件中,添加requirepass {password} ,需要重启redis服务

        2.  动态设置密码,使用config set require {password}

    2.  从节点连接主节点需要配置

        1.  在从节点配置文件中,masterauth {master-password}

        2.  动态配置验证,使用config set masterauth {password} 

3.  从节点只读模式

    1.  从节点使用slave-read-only=yes配合为只读模式。

4.  网络延迟

    redis提供了一个参数repl-disable-tcp-nodelay,关闭TCP_NODELAY

    同一机房,关闭repl-disable-tcp-nodelay

    跨机房,开启repl-disable-tcp-nodelay

5.  复制拓扑结构

    1.  一主一从

        

 

         注意:当A没有持久化,B开启AOF持久化,A不能自动重启,不然B的数据会被清空。当A发生故障时,B应该slaveof no one断开与A的复制关系,然后再重启A。

    2.  一主多从

                        

    3.  树状结构

        

 

6.  复制原理

    1.  复制过程

                

    2.  数据同步

        1.  全量复制

            用于初次复制场景,把主节点全部数据一次性发给从节点,当数据量较大时,会对主从节点和网络造成很大的开销。

            1.  全量复制流程  

            

 

             注意:默认主从复制的超时时间为60秒(repl-timetou)

            2.  全量复制的时间开销

                1.  主节点bgsave时间

                2.  RDB文件网络传输时间

                3.  从节点清空数据时间

                4.  从节点加载RDB的时间

                5.  可能的AOF重写时间                                       

        2.  部分复制 

            用于因为网络闪断等原因造成的主从节点数据不一致的场景。

            

        3.  同步命令psync运行需要以上组件支持

            1.  主从节点各自复制偏移量

                在主从节点查看info replication可以看到各自的复制偏移量

            2.  主节点复制积压缓冲区

                保存在主节点上的一个固定长度的队列,默认大小为1MB

                

 

                当主节点有连接的从节点被创建,主节点响应写命令,不但会把命令发送给从节点,还会写入复制积压缓冲区, 用于部分复制和复制命令丢失的数据补救。

                复制缓冲区相关统计信息保存在主节点的info replication

                                

            3.  主节点运行id    

                每个redis启动后都会动态分配一个40位的十六进制字符串作为运行ID.

                运行ID的作用是用来唯一标识redis节点。

                当运行ID变化后从节点将做全量复制。

                1.  如何查看运行ID
                    info server

                2.  redis重启后,运行ID会发生改变。

                3.  如何重启又不改变运行ID

                    debug reload

                    但是debug reload会阻塞redis主进程

            4.  psync命令

                psync {runId} {offset}

                runId  从节点所复制主节点的运行id

                offset  当前从节点已复制的数据偏移量           
                

 

        

         4.  心跳

            1.  主从节点彼此都有心跳检测机制,各自模拟称对方的客户端进行通信,使用命令client list查看相关客户端信息

            2.  主节点默认每隔10秒对从节点发送ping命令,可以通过参数repl-ping-slave-period控制发送频率

            3.  从节点在主线程中每隔1秒发送replconf ack {offset}命令,给主节点上报自身当前的复制偏移量,replconf命令的主要作用:

                1.  实时监测从节点网络状态

                2.  上报自身复制偏移量,检查复制数据是否丢失

                3.  实现保证从节点的数量的和延迟性功能

        5.  异步复制

            

 

7.  复制的问题

    1.  读写分离       

        1.  优点:对于读占比高的场景,可以把一些读流量分摊到从节点来减轻master压力。

        2.  缺点

            1.  数据延迟

            2.  读到过期数据

                惰性删除

                定时删除

            3.  从节点故障 

    2.  主从配置不一致

        1.  maxmemory配置不同 

    3.  规避全量复制 

        1.  第一次建立复制

            低峰时候进程操作

        2.  节点运行ID不匹配

            换其他架构

        3.  复制积压缓冲区不足                                        

posted @ 2022-03-03 09:22  奋斗史  阅读(95)  评论(0)    收藏  举报