redis主从复制

redis主从复制

文档

  1. redis单机安装
  2. redis常用的五种数据类型
  3. redis数据类型-位图bitmap
  4. redis数据类型-基数统计HyperLogLog
  5. redis数据类型-地理空间GEO
  6. redis数据类型-流Stream
  7. redis数据类型-位域bitfield
  8. redis持久化-RDB
  9. redis持久化-AOF
  10. redis持久化-RDB+AOF混合模式
  11. redis事务
  12. redis管道 -redis pipeline -redis pipelining
  13. redis发布订阅

官方文档

  1. 官网操作命令指南页面:https://redis.io/docs/latest/commands/?name=get&group=string
  2. Redis replication

说明

  1. redis版本:7.0.0

redis主从复制

基本规则
  1. 仅配置从节点即可,即在从节点中配置主节点的信息,就可达到同步的目的
  2. 在配置主从复制的过程中,主节点没有任何配置上的变化
  3. slave节点配置replicaof参数,值为master节点信息
  4. 如果master节点设置了密码(几乎是必须要配置的),即配置文件中requirepass参数设置了值,那么slave节点就要配置masterauth参数,值为master节点的密码,否则master会拒绝slave的访问请求
配置主从模式
  1. 配置一主二从,在三台机器分配创建redis服务,参考:redis单机安装

  2. 如果机器上已安装了redis服务,建议复制全新的配置文件redis.conf进行修改,并将修改后的配置文件做为redis服务的启动文件

  3. 三台机器分别复制redis.conf文件,并重命名为redis6379.confredis6380.confredis6381.conf,相关配置项如下

    支持后台启动:daemonize设置为yes

    properties 复制代码
    # daemonize no
    daemonize yes

    关闭保护模式:protected-mode设置为no

    properties 复制代码
    # protected-mode yes
    protected-mode no

    注释掉bind配置,bind 127.0.0.1 表示只能本机访问

    properties 复制代码
    # bind 127.0.0.1 -::1

    设置访问密码,requirepass 设置redis访问密码

    properties 复制代码
    # requirepass foobared
    requirepass 123456

    修改设置pid文件

    properties 复制代码
    pidfile /var/run/redis_6379.pid

    修改log文件,需提前创建好指定路径

    properties 复制代码
    # logfile ""
    logfile "/opt/module/redis/myredis/log/redis7.log"

    修改端口号,分配修改为637963806381

    properties 复制代码
    port 6379

    修改dump文件的保存路径,rdb持久化使用的文件,rdb持久化默认开启,rdb文件默认为dump.rdb

    properties 复制代码
    # dir ./
    dir /opt/module/redis/myredis
  4. 从节点额外的配置,从节点需要配置主节点的服务器地址、端口号和密码,修改的配置文件仍然是上面指定的配置文件

    添加主节点的服务地址和端口号

    properties 复制代码
    # replicaof <masterip> <masterport>
    replicaof 192.168.145.132 6379

    添加主节点的密码

    properties 复制代码
    # masterauth <master-password>
    masterauth 123456
  5. 启动服务,已启动的关闭后重启,分别指定配置文件redis6379.confredis6380.confredis6381.conf

    shell 复制代码
    ./redis-server /opt/module/redis/myredis/redis6379.conf
  6. 连接服务器,分别指定对应的端口,指定密码

    shell 复制代码
    ./redis-cli -a 123456 -p 6379
  7. 保证三台机器可以互相访问

    关闭防火墙命令

    shell 复制代码
    systemctl stop firewalld
  8. 启动成功后,查看主、从节点输出的日志

    主节点的相关日志

    verilog 复制代码
    4378:M 16 Jul 2025 23:58:14.197 * Synchronization with replica 192.168.145.133:6380 succeeded
    ...
    4378:M 16 Jul 2025 23:58:14.197 * Synchronization with replica 192.168.145.134:6381 succeeded
    ...

    从节点的相关日志

    verilog 复制代码
    43183:S 16 Jul 2025 23:58:09.098 * Connecting to MASTER 192.168.145.132:6379
    ...
  9. 同步成功后,查看主、从节点的主从复制配置信息,redis命令:info replication

    主节点的主从复制配置信息:

    properties 复制代码
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=192.168.145.133,port=6380,state=online,offset=546,lag=1
    slave1:ip=192.168.145.134,port=6381,state=online,offset=546,lag=1
    master_failover_state:no-failover
    master_replid:0033119d9e4f4137c8612bfdebb7949c04fad4db
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:560
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:560

    从节点的主从复制配置信息:

    properties 复制代码
    # Replication
    role:slave
    master_host:192.168.145.132
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:4
    master_sync_in_progress:0
    slave_read_repl_offset:938
    slave_repl_offset:938
    slave_priority:100
    slave_read_only:1
    replica_announced:1
    connected_slaves:0
    master_failover_state:no-failover
    master_replid:0033119d9e4f4137c8612bfdebb7949c04fad4db
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:938
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:15
    repl_backlog_histlen:924
使用命令配置主从模式
  1. 如果没修改配置文件,也可以使用命令临时配置主从模式
  2. 在从节点执行命令:slaveof 192.168.145.132 6379,表示同步指定节点的数据,即命令中的节点做为主节点,当前节点为从节点,如果当前节点已经是某个主节点的从节点,那么会停止和原主节点的同步关系,转而和当前命令中设置的节点同步
  3. 需要注意的是,如果主节点有密码,则仍需在从节点的配置文件中配置masterauth参数,值为master节点的密码
主从模式传递
  1. 从节点可以做为其它节点的主节点,例如有3个节点192.168.145.132:6379192.168.145.133:6380192.168.145.134:6381,在192.168.145.133:6380节点配置主节点192.168.145.132:6379,在192.168.145.134:6381节点配置主节点192.168.145.133:6380,具体配置如下,以命令的形式为例

  2. 192.168.145.133:6380节点执行命令:slaveof 192.168.145.132 6379

  3. 192.168.145.134:6381节点执行命令:slaveof 192.168.145.133 6380

  4. 192.168.145.132:6379节点执行命令:info replication,输出信息

    properties 复制代码
    # Replication
    role:master
    connected_slaves:1
    slave0:ip=192.168.145.133,port=6380,state=online,offset=7584,lag=1
    master_failover_state:no-failover
    master_replid:9b33c980c8ba7eaedac481e76fbe9cfd00a7313a
    master_replid2:0033119d9e4f4137c8612bfdebb7949c04fad4db
    master_repl_offset:7584
    second_repl_offset:3104
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:3104
    repl_backlog_histlen:4481
  5. 192.168.145.133:6380节点执行命令:info replication,输出信息

    properties 复制代码
    # Replication
    role:slave
    master_host:192.168.145.132
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:9
    master_sync_in_progress:0
    slave_read_repl_offset:7696
    slave_repl_offset:7696
    slave_priority:100
    slave_read_only:1
    replica_announced:1
    connected_slaves:1
    slave0:ip=192.168.145.134,port=6381,state=online,offset=7696,lag=1
    master_failover_state:no-failover
    master_replid:9b33c980c8ba7eaedac481e76fbe9cfd00a7313a
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:7696
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:6374
    repl_backlog_histlen:1323
  6. 192.168.145.134:6381节点执行命令:info replication,输出信息

    properties 复制代码
    # Replication
    role:slave
    master_host:192.168.145.133
    master_port:6380
    master_link_status:up
    master_last_io_seconds_ago:10
    master_sync_in_progress:0
    slave_read_repl_offset:7738
    slave_repl_offset:7738
    slave_priority:100
    slave_read_only:1
    replica_announced:1
    connected_slaves:0
    master_failover_state:no-failover
    master_replid:9b33c980c8ba7eaedac481e76fbe9cfd00a7313a
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:7738
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:6388
    repl_backlog_histlen:1351
停止主从同步
  1. 在从节点执行命令:slaveof no one,表示停止当前节点与其它节点同步,停止后,当前节点即为master节点,执行命令:info replication,输出信息

    properties 复制代码
    # Replication
    role:master
    connected_slaves:0
    master_failover_state:no-failover
    master_replid:e5ecbdf9a927853e469be84d80f191f4c9e414bc
    master_replid2:9b33c980c8ba7eaedac481e76fbe9cfd00a7313a
    master_repl_offset:8606
    second_repl_offset:8607
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:6388
    repl_backlog_histlen:2219
主从模式说明
  1. 从节点只允许读操作,不能写操作,在从节点执行写操作会报如下错误

    shell 复制代码
    127.0.0.1:6380> set k1 hello
    (error) READONLY You can't write against a read only replica.
  2. 复制点问题。全部数据都会复制,覆盖清除从节点原本的数据

  3. 主节点宕机问题。主节点宕机后,从节点依然是slave状态,并且标记主节点down,下面是主节点宕机后,从节点执行命令:info replication,输出信息

    properties 复制代码
    # Replication
    role:slave
    master_host:192.168.145.132
    master_port:6379
    master_link_status:down
    master_last_io_seconds_ago:-1
    master_sync_in_progress:0
    slave_read_repl_offset:3103
    slave_repl_offset:3103
    master_link_down_since_seconds:5
    slave_priority:100
    slave_read_only:1
    replica_announced:1
    connected_slaves:0
    master_failover_state:no-failover
    master_replid:0033119d9e4f4137c8612bfdebb7949c04fad4db
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:3103
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:15
    repl_backlog_histlen:3089
  4. 主节点恢复后,会恢复主从复制关系

  5. 从节点宕机后,再次恢复,会再次同步主节点的数据

主从复制流程
  1. slave节点启动成功连接到master节点后会发送一个sync命令
  2. slave节点首次连接master节点,会全量复制主节点数据,自身原有的数据会被覆盖清除
    1. 全量复制的具体流程:
      1. master节点接到sync命令后会开始在后台保存快照,即进行RDB持久化
      2. 同时收集所有新产生的修改操作命令
      3. RDB持久后结束后,master节点将rdb文件和所有缓存的命令发送到slave节点,以完成异常完全同步
  3. slave节点接收到rdb文件后,将其存盘并加载到内存中,从而完成复制初始化
  4. 保持通信,心跳周期repl-ping-replica-period,默认10s
  5. 增量复制,master节点将新收集到的修改命令自动依次传给slave节点,完成同步
  6. slave节点下线后恢复,重新续传
    1. 续传的具体流程:master节点会检查backlog里面的offsetmasterslave都会保存一个复制的offset还有一个masterIdmaster只会把已经复制的offset后面的数据复制给slave,类似断点续传
    2. 官网说明:How Redis replication works
主从复制的缺点
  1. 复制延时,信号衰减。系统繁忙,slave节点增多,都会加重延迟问题
  2. 主节点宕机后,默认不会在从节点中选举新的主节点,即保持从节点状态,从节点不能执行写操作