Redis搭建主从同步流程及原理

一、关于 Redis 主从复制

1.1 关于 Redis 的主从复制

redis 的主从复制分为全量复制和增量复制,全量复制是slave重写master生成的rdb文件。增量复制类似于MySQL主从复制,master将操作记录到日志中,并同步到slave,来完成同步。

1.2 Redis 主从架构

在这里插入图片描述
redis 配置主从同步后,默认从库只能读,不可写。

1.3 优缺点

优点:

  • 实现数据备份,提高安全性
  • 实现读写分离,提高性能

缺点:

  • 增加维护成本
  • 当多个 slave 节点宕机,增加主服务压力
  • 数据延迟同步问题

二、配置 Redis 主从复制

2.1 准备事项

ip端口角色redis版本
39.101.1.1226379主(master)Redis 6.2.7
175.24.33.2006379从(slave)Redis 6.2.7

2.2 同步服务器的时区和时间

2.3 关闭服务器防火墙

centos示例:

  • 查看防火墙
systemctl status firewalld.service
  • 开启防火墙
systemctl start firewalld.service
  • 关闭防火墙
systemctl stop firewalld.service

2.4 开启端口

主服务 在服务器运营商中开启:6379 端口。

2.5 修改配置文件

修改主服务配置文件(redis.conf):

# 默认是 127.0.0.1,0.0.0.0 可非本地访问
bind 0.0.0.0

修改从服务配置文件(redis.conf)(如果需要一主多从,从服务的配置方式一样):

# 默认是 127.0.0.1,0.0.0.0 可非本地访问
bind 0.0.0.0
# 从属于主redis
slaveof 39.101.1.122 6379 

2.6 重启 Redis 服务

重启服务,将修改后的配置文件重载。

注意优先级,先重启主服务,在重启子服务。

2.7 查看连接状态

主服务查看:info replication

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=175.24.33.200,port=6379,state=online,offset=28457,lag=1
master_failover_state:no-failover
master_replid:020a7669df2d1f28093f39e3c344757d56ccd66e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28457
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28457

从服务查看:info replication

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:39.101.1.122
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_read_repl_offset:28807
slave_repl_offset:28807
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:020a7669df2d1f28093f39e3c344757d56ccd66e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28807
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28807

只要主服务看到的 connected_slaves (从服务连接量正确),和从服务看到的 master_link_statusup 即可,不能是 downdown 代表未连接成功。

其中,role 显示当前角色,master 或 slave。

2.8 测试

主服务:

127.0.0.1:6379> set name haha
OK

从服务:

127.0.0.1:6379> get name
"haha"

三、全量同步和增量同步

上面介绍了主从的搭建过程,这儿在介绍下主从同步的流程。

redis 有两种同步方式:全量同步 和 增量同步

整个流程:

在这里插入图片描述

3.1 全量同步

全量同步:master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog,逐个发送给slave。

在这里插入图片描述
过程概述:

  • slave 节点请求增量同步
  • master检查replid不一致,拒绝增量同步,开始全量同步
  • master将完整的内存数据生成RDB文件,发送给slave
  • slave清空本地数据,加载RDB文件
  • master将RDB期间接收到的命令记录在repl_baklog,并持续将log中的命令发送给slave
  • slave执行接收到的命令,与master保持同步

什么时候执行全量同步?

1、slave节点第一次连接master节点时。

2、slave节点断开时间太久,repl_baklog中的offset已经被覆盖时。

3.2 增量同步

增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave。

过程概述:

  • slave请求增量同步
  • master检查replid是否一致
  • 一致,master 去 repl_baklog 中获取 offset 后的数据
  • master 发送 offset 后的命令
  • slave 接收后执行命令
  • 完成同步

什么时候执行增量同步?

1、slave节点断开又恢复,并且在repl_baklog中能找到offset时

四、常见问题

问题一:使用 info 查看状态的时候 master_link_status 为 down

  • 原因一:

    虽然 redis 服务已开启,但是 6379 端口在安全组中未开放。

  • 原因二:

    主配置文件和从配置文件中的 bind 为 127.0.0.1,应该设置成 0.0.0.0

  • 原因三:

    replicaof 和 slaveof 的区别:replicaof 是新版的命令,slaveof 是旧版的

    replicaof :>= 5.0.0
    slaveof:>= 1.0.0.

    版本查询:https://www.redis.com.cn/

  • 原因四:

    主服务设置了密码,但是从服务没有配置该密码。可通过 masterauth 在配置文件中配置上即可。

  • 原因五:主服务或从服务没关闭防火墙

问题二:关于 repl_baklog

repl_baklog这个文件是一个固定大小的数组,只不过数组是环形,也就是说角标到达数组末尾后,会再次从0开始读写,这样数组头部的数据就会被覆盖。

数组一旦写满,再有新数据写入时,就会覆盖数组的旧数据。此时slave来增量同步,发现自己offset已经被覆盖了,此时只能全量同步。

问题三:在不设置哨兵的情况下 master宕机或重启,导致 slave 频繁全量复制

https://www.cnblogs.com/qq1971590238/p/16140998.html

五、结束

参考文档:

https://www.cnblogs.com/tangs1/p/15784878.html

https://blog.csdn.net/qq_45748269/article/details/121622447

https://blog.csdn.net/weixin_43889841/article/details/105078298

https://sunnyboy.blog.csdn.net/article/details/117483197

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值