Redis实战 | 持久化、主从复制特性和故障处理思路
前言
前面两篇我们了解了Redis的安装、Redis最常用的5种数据类型。本篇总结下Redis的持久化、主从复制特性,以及Redis服务挂了之后的一些处理思路。
前期回顾传送门:
Linux下安装Redis简易教程
Redis实战 | 5种Redis数据类型详解
Redis的两种持久化方式
经常有面试官会问:Redis数据存储在内存中,万一断电了怎么办呢?
不要慌,这个其实就是在问Redis的持久化策略啦。我们知道,保存在内存中的数据,在服务重启或者是机器挂掉之后是会丢失的。而硬盘中的数据是不会丢失的,因此只有将数据保存在硬盘上才相对安全些。
Redis为了追求高性能而将数据存在内存中,同时也提供了持久化的选项保证数据的安全性。这两种方式是:
- RDB快照持久化,就是将某一时刻的数据写入硬盘中
- AOF只追加文件的方式,就是将被执行的写命令追加到文件,并保存到硬盘里
1、RDB持久化方式
什么是RDB持久化呢?
也叫快照持久化,就是将当前Redis数据库中的数据快照保存一份到磁盘文件中(一般叫dump.rdb)。好了,这个时候如果断电了,没事啊,重启后,Redis通过加载rdb文件可以将数据库状态恢复。基本上算是,满血复活了(因为存在数据丢失问题,血不是很满!)
RDB 功能最核心的是 rdbSave 和 rdbLoad 两个函数, 前者用于生成 RDB 文件到磁盘, 而后者则用于将 RDB 文件中的数据重新载入到内存中
看图说话:

怎么实现RDB的持久化呢?
SAVE 和 BGSAVE两个命令来实现RDB持久化,这两个命令都会调用 rdbSave 函数,将数据保存在rdb文件中。但是有所区别:
- SAVE命令会直接调用rdbSave函数,阻塞Redis主进程,在保存完成之前,Redis不再响应其他任何客户端命令。
- BGSAVE命令fork出一个子进程,子进程调用rdbSave函数,这样Redis主进程可以继续处理客户端请求。
一般我们怎么配置RDB持久化呢?
这里我们可以通过修改redis.conf配置文件中关于RDB持久化的选项让Redis自动去执行持久化。比如下面这些选项:
# 900s之内有1次写入
save 900 1
# 300s内有10次写入
save 300 10
# 60s内有10000次写入
save 60 10000
#执行bgsave失败时是否继续执行写命令,默认是yes
stop-writes-on-bgsave-error yes
#是否对快照文件进行压缩,模式是yes
rdbcompression yes
#快照文件的名称,默认是dump.rdb
dbfilename dump.rdb
当配置了多个save选项时,当任意一个save配置项条件被满足时,Redis就会触发一次BGSAVE命令。
除了在redis.conf配置文件中配置rdb持久化之外,还有一些方式,可以创建快照:
- 通过直接在redis客户端敲save或bgsave命令的方式触发一次快照持久化
- 通过shutdown命令关闭服务器时,会执行一个SAVE命令,阻塞所有客户端,并在SAVE命令执行完毕之后关闭服务器
前面说到,RDB丢失数据的问题,其实就是在两次同步数据之间,如果服务器发生崩溃,便会丢失掉这之间的数据。
2、AOF持久化方式
什么是AOF,就是appendonly file的缩写啦!
简单来说,AOF持久化就是将被执行的写命令追加到AOF文件的末尾,以此来记录数据发生的变化。在恢复数据时,只需要从头到尾重新执行一遍AOF文件所包含的所有命令即可。
那么,AOF持久化有哪些配置项呢?
# 是否使用appendonly模式,默认是no
appendonly no
# appendfilename文件名
appendfilename "appendonly.aof"
# appendfsync always //每个命令都同步
appendfsync everysec //没秒执行一次同步,默认是这个
# appendfsync no //操作系统决定何时进行同步
# 在对aof文件进行压缩的时候能否执行同步
no-appendfsync-on-rewrite no
AOF方式的持久化有个缺点,就是文件的体积比较大。
Redis为了缓解这个问题,给我们提供了BGREWRITEAOF的命令,这个命令会通过移除AOF文件中的一些冗余命令来重写AOF文件,使得AOF文件的体积尽可能地缩小。类比BGSAVE命令,这里的BGREWRITEAOF命令也是fork出一个子进程进行AOF文件的压缩(也就是重写)工作。
同样地,我们可以在redis.conf配置文件中配置AOF文件的重写选项,让Redis自动执行BGREWRITEAOF
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
这两个配置的意思就是,当AOF文件的体积大于64MB,
并且AOF文件的体积比上一次重写之后的体积大了至少一倍(100%)时,
Redis将执行AOF文件的重写命令。
Redis的主从复制
单机版Redis实例存在的问题
- 首先是数据安全性问题,毕竟所有数据在一台机器上,万一这台机器被炸毁了,岂不是没救了。因此,需要多机器备份数据出来,Redis主从复制特性帮助我们实现数据的热备份。
- 第二个就是性能问题了,尤其是在处理一些较复杂命令和较大数据集合的操作时,每秒处理的请求数会下降不少。
什么是主从复制
就是将一台Redis服务器的数据,复制到另外一台或几台Redis服务器上。前者就是主服务器,后者就是从服务器。主服务器负责处理客户端的读写请求,而从服务器可以分担一部分读请求或者负责所有的读请求。
客户端每次向主服务器写入的命令,从服务器都能得到实时的更新。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

如何配置主从复制
配置主从复制其实很简单,就一条命令 slaveof。配置主从复制,其实就是配置Redis的从服务器从哪台主服务器复制数据。主服务器不需要动的。
因此,我们可以修改从服务器的 redis.conf 文件,增加如下一行配置就行:
slaveof masterip port
除了配置文件的方式外,还可以在启动redis实例的时候 加入 --slaveof masterip port ,这样就会告诉redis实例从哪台机器和端口处复制数据。
也可以直接在redis客户端执行命令 slaveof masterip port,让服务器开始复制一个主服务器。
另外,如果要断开同主服务器的复制,可以使用下面命令:
slaveof no one
Redis主从复制的具体过程是怎样的
当从服务器连接主服务器时,主从服务器执行的大概操作如下图所示:

需要注意的是,从服务器在进行同步时,会清空自己的所有数据。
故障处理
服务器宕机之后,可能需要恢复数据,这时候会用到之前说的持久化到硬盘上的aof或是dump快照文件。Redis给我们提供了两个命令行工具,在系统故障之后,用来检查aof文件和快照文件的状态,并且在还有修复功能。
下面是这两个命令行程序:
redis-check-aof
redis-check-dump
下面举例一种故障的场景:
A是redis主服务器,B是从服务器。A机器故障暂无法修复。现将C机器上的redis服务作为主服务器替换上去。
具体的替换计划是这样的:
- 首先向B发送一个SAVE命令,让它创建一个最新的快照文件
- 接着将这个快照文件发送给机器C,并在机器C上面启动Redis
- 在机器B上执行slaveof 命令,让它将C机器作为主服务器
作者Info:
公众号:二营长的笔记
Redis实战 | 持久化、主从复制特性和故障处理思路的更多相关文章
- 【中间件】Redis 实战之主从复制、高可用、分布式
目录 简介 持久化 主从复制 高可用 Redis-Sentinel .NET Core开发 分布式 Redis-Cluster 配置说明 常见问题 简介 本节内容基于 CentOS 7.4.1708, ...
- Redis 实战之主从复制、高可用、分布式
目录 简介 持久化 主从复制 高可用 Redis-Sentinel .NET Core开发 分布式 Redis-Cluster 配置说明 常见问题 简介 本节内容基于 CentOS 7.4.170 ...
- Ubuntu redis 实战 持久化策略 主从复制 以及 故障恢复
推荐文章 redis数据结构学习 redis持久化 redis主从复制 redis哨兵
- redis实战笔记(1)-第1章 初识Redis
第1章 初识Redis 注:本书在redis3.0版本的,比如redis3.0以后支持服务端集群.3.0之前只能客户端分片. 本章主要内容 1.Redis与其他软件的相同之处和不同之处 2.Re ...
- Redis数据库高级实用特性:持久化机制
Redis数据库高级实用特性:持久化机制 大型web系统数据缓存设计 Redis高级特性:虚拟内存的使用技巧 Redis高级实用特性:安全性与主从复制 Memcached.Redis OR Tair
- Redis实战总结-配置、持久化、复制
Redis的配置主要放置在redis.conf,可以通过修改配置文件实现Redis许多特性,比如复制,持久化,集群等. redis.conf部分配置详解 # 启动redis,显示加载配置redis.c ...
- Redis数据库 02事务| 持久化| 主从复制| 集群
1. Redis事务 Redis不支持事务,此事务不是关系型数据库中的事务: Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的 ...
- .Net Redis实战——事务和数据持久化
Redis事务 Redis事务可以让一个客户端在不被其他客户端打断的情况下执行多个命令,和关系数据库那种可以在执行的过程中进行回滚(rollback)的事务不同,在Redis里面,被MULTI命令和E ...
- 删库到跑路?还得看这篇Redis数据库持久化与企业容灾备份恢复实战指南
本章目录 0x00 数据持久化 1.RDB 方式 2.AOF 方式 如何抉择 RDB OR AOF? 0x01 备份容灾 一.备份 1.手动备份redis数据库 2.迁移Redis指定db-数据库 3 ...
随机推荐
- mysql format时间格式化说明
原文地址为:mysql format时间格式化说明 date_format(datetime,formatting)可以格式日期和时间(例如 YYYY-MM-DD HH:MM:SS)和(HH:MM:S ...
- Getting started with the basics of programming exercises_3
1.编写一个程序删除每个输入行末尾的空格及制表符并删除完全是空白符的行 #include<stdio.h> #define MAXLINE 1000 // maximum input li ...
- vue实现购物车逻辑
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 2018-2-13-win10-uwp-如何让-Page-继承泛型类
title author date CreateTime categories win10 uwp 如何让 Page 继承泛型类 lindexi 2018-2-13 17:23:3 +0800 201 ...
- PyTorch之前向传播函数自动调用forward
参考:1. pytorch学习笔记(九):PyTorch结构介绍 2.pytorch学习笔记(七):pytorch hook 和 关于pytorch backward过程的理解 3.Pytorch入门 ...
- 洛谷P1595 信封问题 题解 错排问题
作者:zifeiy 标签:排列组合,错排问题 题目链接:https://www.luogu.org/problem/P1595 题目描述:某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都 ...
- uni-app 生命周期函数
应用生命周期 函数名 说明 onLaunch 当uni-app 初始化完成时触发(全局只触发一次) onShow 当 uni-app 启动,或从后台进入前台显示 onHide 当 uni-app 从前 ...
- P1101 走迷宫一
题目描述 大魔王抓住了爱丽丝,将她丢进了一口枯井中,并堵住了井口. 爱丽丝在井底发现了一张地图,他发现他现在身处一个迷宫当中,从地图中可以发现,迷宫是一个N*M的矩形,爱丽丝身处迷宫的左上角,唯一的出 ...
- HashMap之红黑树
红黑树的设计,相比 jdk1.7 的 HashMap 而言,jdk1.8 最重要的就是引入了红黑树的设计,当冲突的链表长度超过 8 个的时候,链表结构就会转为红黑树结构. 01.故事的起因 “ JDK ...
- Java并发编程(您不知道的线程池操作), 最受欢迎的 8 位 Java 大师,Java并发包中的同步队列SynchronousQueue实现原理
Java_并发编程培训 java并发程序设计教程 JUC Exchanger 一.概述 Exchanger 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchan ...