简介:Redis主从复制与优化

Redis主从复制与优化

主从复制

我们关注主从复制之前,首先要考虑单机有什么问题?

  • 机器故障
  • 容量瓶颈
  • QPS瓶颈

这些都是单节点所遇到的问题,所以这个时候出现了主从复制(一主一从,一主多从)

使用主从复制可以:

  • 数据副本
  • 扩展读性能

注意:

  • 一个master可以有多个slave
  • 一个slave只有一个master
  • 数据流向是单向的,master到slave

主从复制的配置

两种实现方式

  • slaveof命令

两台机器:主节点:47.11.11.11 从节点 47.22.22.22

在从节点执行 slaveof 命令

47.22.22.22-6379 > slacefof 47.11.11.11 6379
OK

取消复制:

47.22.22.22-6379 > slacefof no one
OK
  • 修改配置
slaveof ip  port    //从节点ip + 端口
slave-read-only yes //开启只做读的操作
  • 两种方式比较

  • 查看主从
127.0.0.1:6379> info replication
# Replication
role:master   //主节点
connected_slaves:0
master_replid:1d43401335a5343b27b1638fc9843e3a593fc1a7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

知识点 :

  • 主节点 runID:

每个redis节点启动后都会动态分配一个40位的十六进制字符串为运行ID。运行ID的主要作用是来唯一识别redis节点,比如从节点保存主节点的运行ID识别自已正在复制是哪个主节点。如果只使用ip+port的方式识别主节点,那么主节点重启变更了整体数据集(如替换RDB/AOF文件),从节点再基于偏移量复制数据将是不安全的,因此当运行ID变化后从节点将做全量复制。可以在info server命令查看当前节点的运行ID。

需要注意的是redis关闭再启动,运行的id会随之变化。


全量复制和部分复制等

全量复制

用于初次复制或其它无法进行部分复制的情况,将主节点中的所有数据都发送给从节点。当数据量过大的时候,会造成很大的网络开销。

redis2.8+ 全量复制流程

开销:

  1. bgsave时间
  2. RDB文件网络传输
  3. 从节点清空数据时间
  4. 从节点加载RDB时间
  5. 可能的AOF重写时间

部分复制

用于处理在主从复制中因网络闪退等原因造成数据丢失场景,当从节点再次连上主节点,如果条件允许,主节点会补发丢失数据给从节点,因为补发的数据远远小于全量数据,可以有效避免全量复制的过高开销。但需要注意,如果网络中断时间过长,造成主节点没有能够完整地保存中断期间执行的写命令,则无法进行部分复制,仍使用全量复制 。

流程:

复制偏移量:

  • 参与复制的主从节点都会维护自身复制偏移量,主节点在处理完写入命令操作后,会把命令的字节长度做累加记录,统计信息在info replication中的master_repl_offset指标中。
  • 从节点每秒钟上报自身的复制偏移量给主节点,因此主节点也会保存从节点的复制偏移量slave0:ip=192.168.1.3,port=6379,state=online,offset=116424,lag=0
  • 从节点在接收到主节点发送的命令后,也会累加记录自身的偏移量。统计信息在info replication中的slave_repl_offset中。

复制积压缓冲区:

  • 复制积压缓冲区是保存在主节点上的一个固定长度的队列,默认大小为1MB,当主节点有连接的从节点时被创建,这时主节点响应写命令时,不但会把命令发给从节点,还会写入复制积压缓冲区。
    在命令传播阶段,主节点除了将写命令发送给从节点,还会发送一份给复制积压缓冲区,作为写命令的备份;除了存储写命令,复制积压缓冲区中还存储了其中 的每个字节对应的复制偏移量(offset) 。由于复制积压缓冲区定长且先进先出,所以它保存的是主节点最近执行的写命令;时间较早的写命令会被挤出缓冲区。

生产中常见问题

读写分离

分流到从节点。主节点写数据,从节点读数据,可能遇到读问题

  1. 复制数据延迟
  2. 读到过期数据
  3. 从节点故障
主从配置不一致
  1. 例如maxmemory 不一致 会导致 丢失数据
  2. 例如数据结构优化参数(例如hash-max-ziplist-entries):内存不一致
规避全量复制
  1. 第一次全量复制的时候
      - 第一次不可避免,尽量小节点 ,低峰处理
  2. 节点 运行ID不匹配
      - 故障转移,例如哨兵或者集群
  3. 复制积压缓存区不足
      - 增大复制缓存区配置rel_backlog_size ,网络增强
规避复制风暴
  1. 单机器复制风暴(redis<4.0当master宕机重启,会导致该机器下所有slave同时产生复制。避免单机部署一套redis主从)====》主节点分散多台机

最后的注意事项:

  • 在上述的过程的实现是从库不开启AOF持久化情况下,如果从库开启的AOF持久化,重启时候依然使用全量复制。
  • 之前从master复制过来的数据并不会丢失,只是不再同步之前master(如上图的6379节点)后续写入的数据
  • slaveof 可以用来改变其所属的master节点,即重新成为另一台master的slave,但是新的master首先就会把从节点的数据全部清除掉
  • 关于读写分离延时: 读写分离 ,master会一步将数据复制到slave,如果slave发生阻塞,则会延迟master数据的写命令,造成数据不一致的问题。-------一般不考虑这个问题
  • 读到过期数据:redis在删除key时有两种策略,一种是懒惰型策略,即只有当redis操作这个key时才会将key删除,第二种是定期采样key删除--------当key数据非常多时,采样速度比不上key生成速度会造成很多过期数据没有删除,因为redis一般都是在master节点(增加删除数据),slave查询到过期数据也不能删除。会导致slave读到过期数据(在redis3.2中已经解决)
  • 推荐 redis 主从文章https://www.cnblogs.com/wdliu/p/9407179.html
  • 推荐 redis 全量复制与部分复制文章https://blog.csdn.net/gaobinzhan/article/details/106536326

个人博客:[http://blog.yanxiaolong.cn/](个人博客:http://blog.yanxiaolong.cn/
)

原文链接:https://developer.aliyun.com/article/775627?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

Redis主从复制与优化相关推荐

  1. Redis 主从复制的原理及演进

    本文作者:百度基础架构部工程师,王钰 Redis 的主从复制经历了多次演进,本文将从最基本的原理和实现讲起,并层层递进,逐步呈现 Redis 主从复制的演进历史.大家将了解到 Redis 主从复制的原 ...

  2. Redis 主从复制的原理及演化

    一.什么是主从复制 在数据库语境下,复制( replication)就是将数据从一个数据库复制到另一个数据库中.主从复制,是将数据库分为主节点和从节点,主节点源源不断地将数据复制给从节点,保证主从节点 ...

  3. Redis主从复制下的工作原理

    Redis主从复制下的工作原理 Redis主从复制的配置十分简单,它可以使从服务器是主服务器的完全拷贝.需要清楚Redis主从复制的几点重要内容: 1)Redis使用异步复制.但从Redis 2.8开 ...

  4. 深入Redis 主从复制原理

    复制原理 1.复制过程 复制的过程步骤如下: 1.从节点执行 slaveof 命令        2.从节点只是保存了 slaveof 命令中主节点的信息,并没有立即发起复制        3.从节点 ...

  5. NoSQL(3) 之Redis主从复制、哨兵和集群介绍及详细搭建步骤

    文章目录 一.主从复制 1.1 主从复制的概念 1.2 主从复制的作用 1.3 主从复制的流程 1.4 部署Redis 主从复制步骤 1)首先要搭建redis,在之前的博客写过, 具体可参考:NoSQ ...

  6. Redis—主从复制

    原文作者:编程迷思 原文地址:深入学习Redis(3):主从复制 一.主从复制概述 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器.前者称为主节点(master),后者称为从 ...

  7. Redis主从复制原理学习

    Redis主从复制原理学习总结 - 运维笔记 和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的 ...

  8. 面试官:请讲一下Redis主从复制的功能及实现原理

    摘要:Redis在主从模式下会有许多问题需要考虑,这里写了一些关于redis在多服务器下的一些问题分析和总结. Redis单节点存在单点故障问题,为了解决单点问题,一般都需要对redis配置从节点,然 ...

  9. Redis主从复制、哨兵模式和分布式集群

    为什么需要集群和高可用 为什么需要主从复制 主要是安全性和可用性的考虑,如果只有一个redis服务,一旦服务宕机,那么所有的客户端无法访问,会对业务造成很大影响,另一个是一旦硬件损坏,单机无法恢复,会 ...

最新文章

  1. 给批量用户设磁盘配额
  2. Android之MediaPlayer播放音乐并实现进度条实例
  3. 计算机考研379分,考研379分报考南开大学被刷,是调剂还是二战?师姐建议非常肯定...
  4. 微信公众平台网站开发JS_SDK遇到的bug——wx.config注册提示成功,但部分接口注册失败问题
  5. 设计模式之观察者模式在Listview中的应用
  6. jQuery ajax实现
  7. 还在修改博士论文?这份《博士论文写作技巧》为你指南
  8. 引擎设计跟踪(九.2) 3DS MAX 导出插件 继续
  9. css hot loader,怎么针对依赖包的css 单独写一条loader的规则,不开启 css modules
  10. PrefTest性能测试解决方案 -- C/S结构应用系统的压力测试
  11. 3万字操作系统常用知识总结
  12. MySQL 中的数据类型介绍
  13. ftp 创建工具下载,三款ftp 创建工具下载-免安装版(亲测)
  14. arduino烧录_arduino 烧录 attiny85
  15. Android 字体引入
  16. 【NOIP2018复习】可见点数【数论】
  17. Android studio3.2 分配内存设置方法
  18. Linux: systemd 启动代码分析
  19. windows 上Miktex的镜像源最新配置方法
  20. tkinter显示图片

热门文章

  1. Python爬虫还在写重试代码?快快学习下优雅的tenacity库!
  2. 我的研究生这三年(含腾讯AI Lab实习、CVPR发表经验)
  3. mysql主键自增长_全面的MySQL优化面试解析
  4. 怎么在linux下查看gpu版本号,linux.查看gpu版本
  5. norminv函数是什么matlab,norminv函数的用法,表示的是什么意思
  6. SpringCloud-Eureka-服务注册是如何发起的
  7. PATB1014福尔摩斯的约会
  8. 8、Python MySQL - mysql-connector 驱动
  9. c windows控制台输出颜色文字
  10. BZOJ1036 (其实这只是一份板子)