redis主从复制的原理及实现

 更新时间:2023年08月22日 09:43:15   作者:淘淘桃  
Redis主从复制是一种数据同步机制,它通过将一个Redis实例的数据复制到其他Redis,本文主要介绍了redis主从复制的原理及实现,具有一定的参考价值,感兴趣的可以了解一下

redis的四种模式:单例模式;主从模式;哨兵模式,集群模式 

一、主从模式

单例模式虽然操作简单,但是不具备高可用

缺点:

  • 单点的宕机引来的服务的灾难、数据丢失
  • 单点服务器内存瓶颈,无法无限纵向扩容

解决办法:

单节点宕机,可以由其他节点暂时接替,宕机的慢慢排查,也就是主从模式

 优点

有了主从,提高了Redis整体的可用性,当主节点(master)挂了,可以把从节点(slave)手动升级为主节点继续服务。 

缺点

master挂了整个Redis将失去写操作的能力,仅具备读操作,需要运维半夜爬起来手动升级,中间的请求失败数据丢失无法容忍。

解决办法

可以有一种方式自动升级slave为master      ------【哨兵模式】

1.1主从复制

从一台Redis服务器的数据(主节点master),复制到其他Redis服务器(从节点slave)。数据复制单向,只能由主节点到从节点,master可读可写,slave只可读不可写;默认每台Redis服务器都是主节点,从节点需要在配置文件中单独配置,才会从默认的主节点变成从节点。一个主节点可以有0个或多个从节点,但每个从节点只能有一个主节点。

1.1.1 复制原理

slave第一次连接master,一定会执行一次全量复制
全量复制数据量过大,会造成很大的网络开销,消耗CPU/内存/硬盘IO
增量复制用于处理在主从复制中因网络等数据丢失的场景,当slave再次连接上master,并且就是原来的master,如果条件允许,master补发数据给slave,补发数据量小,避免全量复制的开销(到底能不能复制还要看offset和buffer的情况)
如果slave再次连上的master是新选举的master,那么只能进行全量复制
早期的redis只有全量复制,增量复制是对全量复制的重大优化,尽量采用2.8以上版本

1.1.1.1 全量复制

  • slave给master发一个sync同步命令
  • master通过bgsave命令fork子进程,持久化生成RDB文件
  • master通过网络将RDB文件传给slave
  • slave清空老数据,载入新的RDB文件,此时slave阻塞,无法响应客户端,专心复制

1.1.1.2 增量复制

  • 主从节点各自维护自己的复制偏移量offset,主节点写入命令时,offset=offset+命令字节长度;从节点收到主节点命令也会相应增加自己的offset,并同步给主节点。主节点同时维护自己的offset和从节点的offset,以此来判断主从节点数据是否一致。
  • 主节点指令记录在本地buffer(缓冲区),异步将buffer同步给从节点
  • 若网络不好,同步速度慢了,buffer满了就会从头开始覆盖前面的内容,于是无法增量复制,必须全量复制

 # 主从原理
1. 副本库通过slaveof 127.0.0.1 6379命令,连接主库,并发送SYNC给主库 
2. 主库收到SYNC,会立即触发BGSAVE,后台保存RDB,发送给副本库
3. 副本库接收后会应用RDB快照
4. 主库会陆续将中间产生的新的操作,保存并发送给副本库
5. 到此,我们主复制集就正常工作了
6. 再此以后,主库只要发生新的操作,都会以命令传播的形式自动发送给副本库.
7. 所有复制相关信息,从info信息中都可以查到.即使重启任何节点,他的主从关系依然都在.
8. 如果发生主从关系断开时,从库数据没有任何损坏,在下次重连之后,从库发送PSYNC给主库
9. 主库只会将从库缺失部分的数据同步给从库应用,达到快速恢复主从的目的

# 主库是否要开启持久化(一般情况要开启)
如果不开有可能,主库重启操作,造成所有主从数据丢失!

1.2 读写分离 ;  

大部分情况都是读操作,将读操作放在从节点,写操作放在主节点,减缓服务器压力;同时一些执行耗时比较久的操作也可以放在一台从节点完成,例如keys、sort。(什么时候连主节点写,什么时候连从节点读,由客户端自己控制)

最低配:一主二从,当主节点宕机后,其中一个从节点升级为主节点,还能剩一个从节点。

1.3 主要作用

  • 数据冗余:热备份,持久化另一种方式
  • 故障恢复:master宕机,快速升级slave为master
  • 读写分离:master写,slave,提高服务器负载能力,同时可以根据需求添加slave
  • 负载均衡:配合读写分离,读多写少场景,多个slave分担负载,大大提高并发
  • 高可用基石:是实现哨兵和集群的基础
     

二、主从的搭建具体操作         

# 前置条件1 :至少需要两台机器--》在一台机器运行两个redis实例
# 前置条件2:辅助配置(主从数据一致性配置)
min-slaves-to-write 1
min-slaves-max-lag 3
#那么在从服务器的数量少于1个,或者三个从服务器的延迟(lag)值都大于或等于3秒时,主服务器将拒绝执行写命令
# 方式一:
# 1 6380是从,6379是主
# 2 启动器两台实例
# 3 搭建主从关系
	-在从库上:slaveof ip port
  slaveof 127.0.0.1 6379
# 4 断开主从关系
	-在从库上:slaveof no one
# 方式二:配置文件方式
# 在从库的配置文件中:
slaveof 127.0.0.1 6379
slave-read-only yes
# 使用info查看主从关系

到此这篇关于redis主从复制的原理及实现的文章就介绍到这了,更多相关redis主从复制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • redis4.0入门小结

    redis4.0入门小结

    这篇文章主要介绍了redis4.0入门小结,文中通过示例和概念介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 利用Redis如何实现自动补全功能

    利用Redis如何实现自动补全功能

    这篇文章主要给大家介绍了关于如何利用Redis如何实现自动补全功能的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Redis Key过期监听的配置详解

    Redis Key过期监听的配置详解

    这篇文章主要介绍了Redis Key过期监听配置,默认情况下在Windows系统中双击redis-server.exe用的是内置的配置文件,文中通过代码示例和图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-06-06
  • 基于Redis缓存数据常见的三种问题及解决

    基于Redis缓存数据常见的三种问题及解决

    这篇文章主要介绍了基于Redis缓存数据常见的三种问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • ELK配置转存redis缓存采集nginx访问日志的操作方法

    ELK配置转存redis缓存采集nginx访问日志的操作方法

    本文介绍了在服务器上部署MySQL及如何启动MySQL服务,并详细说明了如何查找安装软件的日志文件位置,通过使用rpm命令查询MySQL服务的日志文件位置,以及通过编辑Logstash配置文件来添加MySQL日志信息,感兴趣的朋友一起看看吧
    2024-11-11
  • Redis高可用集群redis-cluster详解

    Redis高可用集群redis-cluster详解

    redis cluster 是redis官方提供的分布式解决方案,在3.0版本后推出的,有效地解决了redis分布式的需求,当一个redis节点挂了可以快速的切换到另一个节点,对redis-cluster高可用集群相关知识感兴趣的朋友一起看看吧
    2022-03-03
  • redis底层数据结构之ziplist实现详解

    redis底层数据结构之ziplist实现详解

    这篇文章主要为大家介绍了redis底层数据结构之ziplist实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Redis使用bloom-filter过滤器实现推荐去重

    Redis使用bloom-filter过滤器实现推荐去重

    这篇文章主要介绍了Redis使用bloom-filter过滤器实现推荐去重,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • redis客户端实现高可用读写分离的方式详解

    redis客户端实现高可用读写分离的方式详解

    基于sentienl 获取和动态感知 master、slaves节点信息的变化,我们的读写分离客户端就能具备高可用+动态扩容感知能力了,接下来通过本文给大家分享redis客户端实现高可用读写分离的方式,感兴趣的朋友一起看看吧
    2021-07-07
  • springboot使用Redis作缓存使用入门教程

    springboot使用Redis作缓存使用入门教程

    这篇文章主要介绍了springboot使用Redis作缓存使用入门教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07

最新评论