Redis 主从复制

Redis主从复制的原理

当建立主从关系时,slave配置slaveof

当redis生成dump.rdb文件时,工作过程如下

  • redis主进程fork一个子进程
  • fork出来的子进程将内存的数据集dump到临时的RDB中
  • 当子进程对临时的RDB文件写入完毕,redis用新的RDB文件代替旧的RDB文件

AOF :append only file。每当Redis执行一个改变数据集的命令时,这个命令都会被追加到AOF文件的末尾。当redis重新启动时,程序可以通过AOF文件恢复数据

持久化文件监控

Redis 监控最直接的方法当然就是使用系统提供的 info 命令来做了,只需要执行下面一条命令,就能获得 Redis 系统的状态报告。

其中跟RDB文件状态监控相关的参数

  • rdb_changes_since_last_save 表明上次RDB保存以后改变的key次数
  • rdb_bgsave_in_progress 表示当前是否在进行bgsave操作。是为1
  • rdb_last_save_time 上次保存RDB文件的时间戳
  • rdb_last_bgsave_time_sec 上次保存的耗时
  • rdb_last_bgsave_status 上次保存的状态
  • rdb_current_bgsave_time_sec 目前保存RDB文件已花费的时间

其中跟AOF文件状态监控相关的参数

  • aof_enabled AOF文件是否启用
  • aof_rewrite_in_progress 表示当前是否在进行写入AOF文件操作
  • aof_rewrite_scheduled
  • aof_last_rewrite_time_sec 上次写入的时间戳
  • aof_current_rewrite_time_sec:-1
  • aof_last_bgrewrite_status:ok 上次写入状态
  • aof_last_write_status:ok 上次写入状态

在我们优化master之前,可以看看目前我们的其中一个生产环境的的redis的持久化状态

通过redis-cli的info命令,可以看到 「rdb_last_bgsave_time_sec」参数的值,
这个值表示上次bgsave命令执行的时间。在磁盘IO定量的情况下,redis占用的内存越大,
这个值也就越大。通常「rdb_last_bgsave_time_sec」这个时间取决于两个因素:

  • REDIS占用的内存大小
  • 磁盘的写速度。

rdb_last_bgsave_time_sec:85 这个标识表示我们上次保存dump RDB文件的时间。这个耗时受限于上面提到的两个因素。

当redis处于 rdb_bgsave_in_progress状态时,通过vmstat命令查看性能,得到wa值偏高,也就是说CPU在等待
IO的请求完成,我们线上的一个应用redis占用的内存是5G左右,也就是redis会生成大约5G左右的dump.rdb文件

vmstat命令

通过上面的输出,看到BGSAVE 对于IO的性能影响比较大

那么该如何解决由RDB文件带来的性能上不足的问题,又能保证数据持久化的目的

通常的设计思路就是利用「Replication」机制来解决:即master不开启RDB日志和AOF日志,来保证master的读写性能。而slave则开启rdb和aof来进行持久化,保证数据的持久性,

建立主从复制步骤和灾难恢复

我在测试机器上,开启两个实例,端口分别为6379和6380

修改master的redis.conf

关闭RDB

关闭AOF

分别启动master和slave的redis

修改slave配置,指向master服务器

查看slave的复制状态

取消Slave的同步,避免主库在未完成数据恢复前就重启,进而直接覆盖掉从库上的数据,导致所有的数据丢失。

查看数据是否恢复

redis丢失数据案例

背景介绍:

我们的一台redis服务器,硬件配置为4核,4G内存。redis持久话方案是RDB。前面几个月redis使用的

内存在1G左右。在一次重启之后,redis只恢复了部分数据,这时查看redis.log文件。看见了如下的错误

这时,想起了redis启动时的警告

vm.overcommit_memory不同的值说明

  • 0 表示检查是否有足够的内存可用,如果是,允许分配;如果内存不够,拒绝该请求,并返回一个错误给应用程序。
  • 1 允许分配超出物理内存加上交换内存的请求
  • 2 内核总是返回true

redis的数据回写机制分为两种

  • 同步回写即SAVE命令。redis主进程直接写数据到磁盘。当数据量大时,这个命令将阻塞,响应时间长
  • 异步回写即BGSAVE命令。redis 主进程fork一个子进程,复制主进程的内存并通过子进程回写数据到磁盘。

由于RDB文件写的时候fork一个子进程。相当于复制了一个内存镜像。当时系统的内存是4G,而redis占用了
近3G的内存,因此肯定会报内存无法分配。如果 「vm.overcommit_memory」设置为0,在可用内存不足的情况
下,就无法分配新的内存。如果 「vm.overcommit_memory」设置为1。 那么redis将使用交换内存。

解决办法:

方法一: 修改内核参数 vi /etc/sysctl。设置 vm.overcommit_memory = 1 然后执行

方法二: 使用交换内存并不是一个完美的方案。最好的办法是扩大物理内存。

复制有可能碰到的问题

使用slaveof命令后,长时间看不到数据同步。以为复制功能失效,或配置错了。其实,不用担心,有两种方法可以确定是否正在建立复制。

在创建Redis复制时,一开始可能会发现Slave长时间不开始同步数据,可能数据量太大,导致了Master正在dump数据慢,此时如果你在Master上执行「top -p $(pgrep -d, redis-server)」命令,就能看到dump的过程

方式一: 通过「top」命令

redis-server是单进程的,现在通过「top」命令查看已经有2个进程,因为之前提到的,redis在建立复制的时,会在

主服务器上执行 BGSAVE 命令。fork一个子进程,dump出RDB文件。 master dump 完毕,然后再将快照文件传给slave。

方式二:通过「rdb_bgsave_in_progress」标识

进入master的redis-cli

如果「rdb_bgsave_in_progress」为1,那么master正在进行bgsave命令。同时「rdb_current_bgsave_time_sec」
显示bgsave命令已经执行的时间。由于在master服务器上默认不开启RDB和AOF日志,如果「rdb_bgsave_in_progress」为1,那么就可以肯定由于复制原因发送一个「bgsave」指令 dump 出 RDB 文件。

redis 内存达到上限

有运营的同事反应,系统在登录的情况下,操作时会无缘无故跳到登录页面。 由于我们的系统做了分布式的
session,默认把session放到redis里,按照以往的故障经验。可能是redis使用了最大内存上限
导致了无法设置key。 登录 redis 服务器查看 redis.conf 文件设置了最大8G内存「maxmemory 8G」
然后通过「redis-cli info memory 」 查询到目前的内存使用情况 「used_memory_human:7.71G」
接着通过redis-cli工具设置值 。报错 「OOM command not allowed when used memory 」。再次
验证了redis服务器已经达到了最大内存

解决方法:

Original: https://www.cnblogs.com/tuyile006/p/16085409.html
Author: 小y
Title: Redis 主从复制

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/528804/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux常用命令总结

    Linux常用命令总结 关机 & 重启&注销 常用命令 作用 shutdown -h now 即刻关机 shutdown -h 5 5分钟后关机 shutdown …

    Linux 2023年6月7日
    0102
  • php获取图片的主要颜色值RGB

    public function dominant_color() { $image = 'D:/Python/flow/test_photos/12240303_80d8…

    Linux 2023年6月7日
    0114
  • Ubuntu 20.04 双系统安装完整教程

    1、查看电脑的信息 1.1 查看BIOS模式 “win+r”快捷键进入”运行”,输入”msinfo32″回车…

    Linux 2023年6月7日
    096
  • 每天一个 HTTP 状态码 205

    205 Reset Content 表示服务器成功地处理了客户端的请求,要求客户端… 205 Reset Content 205 Reset Content 表示服务器…

    Linux 2023年6月7日
    0120
  • [20220314]利用vim下使用gdb进行各种进制转换插件.txt

    [20220314]利用vim下使用gdb进行各种进制转换插件.txt –//前一段时间学习使用gdb进行各种进制转换,当时遇到有时候16进制与10进制一起运算的问题,…

    Linux 2023年5月27日
    076
  • opencv

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月14日
    0109
  • 安装Redis

    1、下载redis 2、解压缩、安装 安装完之后,可以执行以下make test,执行make test之前需要先安装tcl 3、配置 redis服务后台启动 找到: 修改为: 4…

    Linux 2023年5月28日
    093
  • 小白上手Linux系统安装jdk教程

    Eg:将上传后的jdk,解压到/home/lzh/jdk目录下,命令如下: tar -zxvf ./ jdk 版本号 -C /home/lzh/jdk/ 注意末尾必须加&#8221…

    Linux 2023年5月27日
    090
  • LaTeX 数学公式语法

    参考来源: https://blog.csdn.net/anxiaoxi45/article/details/39449445 https://www.cnblogs.com/ya…

    Linux 2023年6月7日
    098
  • WPF 调试依赖属性变更方法

    本文告诉大家如何调试 WPF 的某个依赖属性被变更的方法 在 WPF 里面,所有的依赖属性都有带通知的功能,通过带通知的功能,可以在通知里加上断点,通过调用堆栈了解是哪个模块调用的…

    Linux 2023年6月6日
    093
  • 【C++基础】函数的分文件编写

    cpp函数的分文件编写 作用:让代码结构更加清晰 如下步骤: 创建后缀名为.h的头文件 创建后缀名为.cpp的源文件 在头文件中写函数的声明 在源文件中写函数的定义,同时引入自定义…

    Linux 2023年6月13日
    0104
  • 高等代数:4 矩阵的运算

    4 矩阵的运算 1、数域K上两个矩阵称为 相等,如果它们的行数相等,列数也相等,并且它们的所有元素对应相等。 2、定义1:设(A=(a_{ij}),B=(b_{ij}))都是数域K…

    Linux 2023年6月8日
    096
  • freePBR的UE4材质合集

    我手动下载了freepbr.com上的所有ue4材质,放到百度云上分享给大家。 freePBR的UE4材质合集 想开个新坑了。但工欲善其事必先利其器。于是我手动下载了freepbr…

    Linux 2023年6月6日
    098
  • Postman环境变量的使用

    前言 请注意,Postman新版有ui上的改动,本文使用的Postman 版本8.4.0 for Mac, ui有调整,但是功能无改变。 Postman是一款接口调测的软件,服务端…

    Linux 2023年6月14日
    0102
  • 同城双活概述

    引言 同城双活,是年度最大的架构变更。同城容灾,对于生产的高可用保障,重大的意义和价值是不言而喻的。 用储总的话说,这么重要的架构工作,所有架构师都应该重点主导和参与。 同城双活,…

    Linux 2023年6月14日
    0125
  • Netty-如何写一个Http服务器

    前言 动机 最近在学习Netty框架,发现Netty是支持Http协议的。加上以前看过Spring-MVC的源码,就想着二者能不能结合一下,整一个简易的web框架(PS:其实不是整…

    Linux 2023年6月7日
    098
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球