12.Redis主从复制(Master/Slave)

目录


Redis专栏目录(点击进入…)



Redis主从复制(Master/Slave)

什么是主从复制?

数据一般是存储在数据库中,为了保证数据的高可用,一般使用多台数据库服务器做集群。选中其中的一台作为主服务器(Master),其余的作为从服务器(Slave)。Master上的数据更新后根据配置文件配置的策略,自动同步到Slave上,这就是主从复制

在Redis集群中,让若干个Redis服务器去复制另一个Redis服务器,定义被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),这种模式叫做主从复制模式。

数据流向是单向的,只能是从master到slave

主从切换技术的方法:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,优先考虑哨兵模式。


主从复制原理

(1)从服务器连接主服务器,发送SYNC命令
(2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令
(3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令
(4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照
(5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令
(6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;(从服务器初始化完成)
(7)主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令(从服务器初始化完成后的操作)


主从复制有什么作用?

优点

(1)保证了数据的高可用。

因为数据在多台服务器上存储了多份,即使一台机器宕掉了,其余的机器还可以顶上
支持主从复制,主机会自动将数据同步到从机,可以进行读写分离

(2)实现了数据读写分离

什么叫读写分离?
写数据在Master上,读数据是在Slave上,这就叫读写分离。
它缓解了以往 Master 既要处理读数据又要处理写数据的压力,Master上负责写,Slave 上负责读,大大提升了数据库服务器的性能。为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成

Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。
Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据

(3)容灾恢复

当主机宕掉了之后,就没有办法向数据库中写数据了,怎么办?
其余的Salve根据配置的策略,选出一台晋升为Master,其余的Slave成为新Master的从机,当原来宕掉的Master恢复后,自动成为Slave,实现了容灾恢复


缺点

(1)当master需要同步发送到slave上的数据量非常大的时候,会存在一定的时延
(2)当系统很繁忙或者slave机器数量非常多的时候也会使这个问题更加严重
(3)Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复
(4)主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性
(5)Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂


Redis如何实现主从复制?

(1)开启多个redis服务
(2)使用不同的pidfile(文件名)
(3)指明不同的端口号
(4)生成不同的rdb或aof文件
(5)产生不同的日志文件


基本使用(操作在Slave上)

(1)命令slaveof

优点:无需重启。缺点:不便于管理

// 命令行使用
slaveof ip port  // 使用命令后自身数据会被清空,但取消slave只是停止复制,并不清空

(2)修改配置文件(redis.conf)

优点:统一配置。缺点:需要重启

#配置文件中配置
slaveof ip port
slave-read-only yes  # 只允许从节点进行读操作

全量复制过程

(1)Redis内部会发出一个同步命令,刚开始是Psync命令,Psync ? -1表示要求master主机同步数据
(2)主机会向从机发送run_id和offset,因为slave并没有对应的 offset,所以是全量复制
(3)从机slave会保存主机master的基本信息
(4)主节点收到全量复制的命令后,执行bgsave(异步执行),在后台生成RDB文件(快照),并使用一个缓冲区(称为复制缓冲区)记录从现在开始执行的所有写命令
(5)主机发送RDB文件给从机
(6)发送缓冲区数据
(7)刷新旧的数据。从节点在载入主节点的数据之前要先将老数据清除
(8)加载RDB文件将数据库状态更新至主节点执行bgsave时的数据库状态和缓冲区数据的加载

部分复制过程

(1)如果网络抖动(连接断开 connection lost)
(2)主机master 还是会写 repl_back_buffer(复制缓冲区)
(3)从机slave会继续尝试连接主机
(4)从机slave会把自己当前run_id和偏移量传输给主机master,并且执行pysnc命令同步
(5)如果master发现你的偏移量是在缓冲区的范围内,就会返回 continue命令
(6)同步了offset的部分数据,所以部分复制的基础就是偏移量offset


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未禾

您的支持是我最宝贵的财富!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值