【Linux】Redis高可用概述1(RDB和AOF的备份恢复)

news2024/12/24 8:39:34

在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务 (99.9%、99.99%、99.999% 等等)

但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服 务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安全不会丢失等。

在Redis中,实现高可用的技术主要包括持久化、复制、哨兵和集群,下面分别说明它们的作用,以及解决了什么 样的问题。

  1. 持久化:持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储 在硬盘,保证数据不会因进程退出而丢失。
  2. 复制:复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现高可用的。复制主要实现了数据的多机备 份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力 受到单机的限制。
  3. 哨兵:在复制的基础上,哨兵实现了自动化的故障恢复。缺陷:写操作无法负载均衡;存储能力受到单机的限 制。
  4. 集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高 可用方案。

一、Redis持久化

持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期 将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢 复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。

Redis持久化分为 RDB持久化AOF持久化前者将当前数据保存到硬盘,后者则是将每次执行的写命令保存 到硬盘(类似于MySQL的binlog)由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此 AOF是目前主流的持久化方式,不过RDB持久化仍然有其用武之地。 


1.1 RDB持久化

RDB全称为RedisDataBase,RDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),保存的文件后缀是rdb,默认的文件名为dump.rdb。当Redis重新启动时,可以读取快照文件恢复数据。

什么是快照呢,你可以理解成把当前时刻的数据拍成一张照片保存下来。


1.1.1 触发条件

RDB持久化的触发分为手动触发和自动触发两种。

1) 手动触发

save命令和bgsave命令都可以生成RDB文件。

 save命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。具体流 程如下:

 执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。我们的客户端可能都是几万或者是几十万,这种方式显然不可取。


bgsave命令会创建一个子进程,由子进程来负责创建RDB文件,父进程(即Redis主进程)则继续处理请求。

执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体流程如下:

具体操作是:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用bgsave 命令


1.1.2 save与bgsave命令对比

bgsave命令执行过程中,只有fork子进程时会阻塞服务器,而对于save命令,整个过程都会阻塞服务器,因此 save已基本被废弃,线上环境要杜绝save的使用;后文中也将只介绍bgsave命令。此外,在自动触发RDB持久化 时,Redis也会选择bgsave而不是save来进行持久化;


2) 自动触发

save m n

自动触发最常见的情况是在配置文件中通过save m n,指定当m秒内发生n次变化时,会触发bgsave。 例如,查看redis的默认配置文件(Linux下为redis根目录下的redis.conf),可以看到如下配置信息:

其中save 900 1的含义是:

当时间到900秒时,如果redis数据发生了至少1次变化,则执行bgsave;

save 300 10和save 60 10000同理。

当三个save条件满足任意一个时,都会引起bgsave的调用。 


1.1.3 相关参数配置解释

参数配置在 redis.conf 文件里。

# save:这里是用来配置触发 Redis的持久化条件,也就是什么时候将内存中的数据保存到硬盘。 默认如下配置

save 900 1 #表示900 秒内如果至少有 1 个 key 的值变化,则保存

save 300 10 #表示300 秒内如果至少有 10 个 key 的值变化,则保存

save 60 10000 #表示60 秒内如果至少有 10000 个 key 的值变化,则保存

# 默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没 有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始 接收数据了

stop-writes-on-bgsave-error yes

# 默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行 压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。

rdbcompression yes

# 默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的 性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。

rdbchecksum yes

设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。使用上面的 dbfilename 作为保存的文件 名。

dir /usr/local/var/db/redis/ 设置快照的文件名,默认是 dump.rdb dbfilename dump.rdb


1.1.4 RDB的优缺点、

优点:  

适合大规模的数据恢复,如果业务对数据完整性和一致性要求不高,RDB是很好的选择。

缺点:

RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。当进行快照持久化时,会 开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所 以在快照持久化期间修改的数据不会被保存,可能丢失数据。


1.1.5 RDB备份触发条件:

  1. 执行save或bgsave命令可触发生成dump.rdb文件
  2. 执行shutdown命令可以触发生成dump.rdb文件
  3. 配置文件中如果通过配置参数save m n,指定当m秒内发生n次变化时,会触发bgsave生成dump.rdb文件

1.2 AOF持久化

AOF 全称是Append Only File,是 redis 记录执行指令的日志文件。

1.2.1 AOF工作原理

将写操作追加到文件中,AOF 日志是写后日志,“写后”的意思是 Redis 是先执行命令,把数据写入内存后,然后才 记日志;里面记录的是指令执行的步骤,非常详细,描绘出了数据的变化过程。

工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。

1.2.2 AOF持久化原理

每当有一个写命令过来时,就直接保存在我们的AOF文件中。

1.2.3 AOF备份触发条件(配置文件修改三种参数)

  • 每修改同步always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
  • 每秒同步everysec:异步操作,每秒记录 如果一秒内宕机,有数据丢失
  • 不同no:从不同步

二、RDB备份恢复案例

连接redis,进行数据的增加删除操作

 再执行save命令

 然后将进程关掉

 将rdb文件挪走

 在重新启动,连接客户端

 可以看到没有数据,因为你将它默认的存储数据的文件挪走了

 这时候重新输入两条数据,这时候目录里是没有dump.rdb文件的,因为这时数据是存在内存中的,只用手动执行save命令,才会将数据写到dump.rdb文件里

 

 

想要之前的数据回来,就将服务关掉,然后将原来的dump.rdb挪回来

 

 重新开启redis服务,连接redis客户端,查询数据;发现数据回来了


三、AOF备份恢复案例

 修改配置文件

重启服务,会有一个appendonly.aof文件

 

 连接客户端,查看是否有数据,发现没有,因为我们这时候使用的是AOF,原来使用RBD存数的数据还在,只是我们不用了;

 重新设置数据,发现appendonly.aof文件内存变了,不再是0

 然后将服务关掉,将appendonly.aof文件挪走,再启动服务,连接客户端,进行查看数据,发现为空;

 再将服务关掉,将原来挪走的aof文件挪回来,

 再进行查看,发现有数据了;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优惠卷秒杀——分布式锁

在集群的模式下,有多个jvm,每个jvm内部有他自己的锁,导致并行执行存在线程安全问题 分布式锁:满足分布式系统或集群模式下多线程可见并且互斥的锁 基于Redis实现分布式锁 基于redis锁的初级版本 public interface ILock {/*** …

第十四届蓝桥杯C++--A组题解(更新中)

本来考场上做完想着这回图一乐,打打暴力混个省奖得了,看完民间题解感觉跟自己估计的差不多,应该挺寄的,没想到出分捡了个省一,喜提弱省省一倒数 这篇博客把自己会的题先放上来,其他的题慢慢补,好…

干翻Mybatis源码系列之第八篇:Mybatis提供的缓存方案细节注意

前言 Mybatis缓存设计成了两层的体系,第一层叫做一级缓存,第二层叫做二级缓存(全局缓存)。我们从这里可以看到Mybatis的缓存方案是有两种处理方式的。 一级缓存(默认开启) 一级缓存默认开启的&#xff0c…

[天翼杯 2021]esay_eval

[天翼杯 2021]esay_eval <?php class A{ #定义一个名为A的类public $code ""; #定义一个公共属性code function __call($method,$args){ #call魔术方法 当调用一个不存在的成员方法的时候触发eval($this->code); #将code的值以php代码执行 }function __w…

c高级day3作业

#!/bin/bash # 脚本名称:myfirstshell echo hello hostname ls -a .. echo $PATH echo $HOME df -h id -g hostname echo goodbye #!/bin/bash a(ls -l /etc | grep "^-" ) #/etc文件中普通文件 b(ls -l /etc | grep "^d" ) #/etc文件中一级目录文件 …

一篇了解智慧网关

智慧网关是指基于互联网技术的智能网关&#xff0c;能够连接不同的物联网设备和传感器&#xff0c;实现数据采集、信息传递、远程控制、通信管理等功能。作为物联网架构中的核心设备之一&#xff0c;智慧网关在智能家居、智慧城市、智能制造、智能交通、智能农业等领域得到了广…

solidworks三维建模竞赛练习题

solidworks三维建模竞赛练习题&#xff1a;3D01‐ 01 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 02 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 03 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 04 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 05 solidw…

windows docker 创建mysql主从 容器创建mysql主从

1. docker命令新建mysql-master&#xff0c;只是简单测试&#xff0c;没有设置映射&#xff0c;只是验证主从连接&#xff0c;需要可自行添加 docker run --restartalways --name mysql-master --privilegedtrue -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:8.0 2.…

Linux - 第11节 - 网络入门

目录 1.计算机网络背景 1.1.网络发展 1.2.认识 "协议" 2.网络协议初识 2.1.协议分层 2.2.OSI七层模型 2.3.TCP/IP五层&#xff08;或四层&#xff09;模型 3.网络传输基本流程 3.1.同局域网的两台主机通信 3.2.跨网络的两台主机通信 1.计算机网络背景 1.1…

spring事务报错Transaction rolled back because it has been marked as rollback-only

之前经常报"Transaction rolled back because it has been marked as rollback-only"这个异常 字面意思是"事务回滚了&#xff0c;因为它被标记了必须回滚"&#xff0c;最开始完全不懂事务的嵌套&#xff0c;每次出现这个错误都想知道为什么&#xff0c;但…

套接字类型和协议设置

创建套接字 成功返回文件描述符&#xff0c;失败返回-1 int socket (int __domain, int __type, int __protocol) ;__domain&#xff1a;套接字中使用的协议族信息 一般使用PF_INET&#xff08;IPv4互联网协议族&#xff09;&#xff0c;其它协议族不常使用或尚未普及。另外&a…

算法设计与分析:大整数的加减乘除运算

目录 任务描述 相关知识 大整数的思想 大整数加法 大整数减法 大整数与整数的乘法 大整数乘法 大整数与整数的除法 n的阶乘求解思路 编程要求 测试说明 任务描述 本关任务&#xff1a;掌握大整数的基本思想&#xff0c;并运用大整数的基本运算计算出常规整数n的阶乘…

seaweedfs服务启动参数及翻译(seaweed参数、seaweed命令、weed参数、weed命令)(在单个容器同时启动master、volume、filer服务)

文章目录 weed命令翻译weed server命令翻译 weed filer命令 docker容器运行示例&#xff08;docker run命令&#xff09;以下是一个在单个容器启动master、volume、filer服务的示例 weed server 容器debug 版本&#xff1a;3.47从官方镜像docker容器里扒下来的&#xff0c;只扒…

【多线程】单例模式

目录 饿汉模式 懒汉模式-单线程版 懒汉模式-多线程版 懒汉模式-多线程版(改进) 单例是一种设计模式。 啥是设计模式 ? 设计模式好比象棋中的 " 棋谱 ". 红方当头炮 , 黑方马来跳 . 针对红方的一些走法 , 黑方应招的时候有一些固定的套路. 按照套路来走局势…

5.11 C高级作业

编写一个名为myfirstshell.sh的脚本&#xff0c;它包括以下内容。 1、包含一段注释&#xff0c;列出您的姓名、脚本的名称和编写这个脚本的目的 2、和当前用户说“hello 用户名” 3、显示您的机器名 hostname 4、显示上一级目录中的所有文件的列表 5、显示变量PATH和HOME的…

高性能网络 SIG 月度动态:长期投入得到业界认可,新增一位 virtio reviewer

高性能网络 SIG&#xff08;Special Interest Group&#xff09; &#xff1a;在云计算时代&#xff0c;软硬件高速发展&#xff0c;云原生、微服务等新的应用形态兴起&#xff0c;让更多的数据在进程之间流动&#xff0c;而网络则成为了这些数据流的载体&#xff0c;在整个云时…

Hive概述和安装

hive简介 Hive&#xff1a;由Facebook开源用于解决海量结构化日志的数据统计工具。 Hive是基于Hadoop的一个数据仓库工具&#xff0c;将结构化的数据文件映射为一张表&#xff0c;并提供类SQL(HQL)查询功能。 Hive本质&#xff1a;将HQL转化成MapReduce程序 &#xff08;1&am…

无锁队列实现及使用场景

写在前面 在看无锁队列之前&#xff0c;我们先来看看看队列的操作。队列是一种非常重要的数据结构&#xff0c;其特性是先进先出&#xff08;FIFO&#xff09;&#xff0c;符合流水线业务流程。在进程间通信、网络通信间经常采用队列做缓存&#xff0c;缓解数据处理压力。根据…

device_node转换成platform_device

device_node转换成platform_device 文章目录 device_node转换成platform_device转换规则主要核心函数of_default_bus_match_tablearmarm64of_platform_register_reconfig_notifier Linux内核是如何将device_node转换成platform_deviceof_platform_populate函数处理根节点下的子…

在ubuntu连接Xlight FTP Server

一 在windows上搭建服务器 http://www.xlightftpd.com/download.htm 使用英文版&#xff0c;使防止在ubuntu中登录中文版时&#xff0c;显示乱码 新建用户和用户对应的服务器目录 如下所示&#xff0c;默认只有读权限 全都勾选 勾选完毕后的效果 在目录中放一个文件&#…