每天一个知识点:宕机情况下,Redis 如何实现快速恢复?

再次查询:

上一篇文章,我们讲到了宕机情况下,Redis 如何进行数据备份,那么,数据备份之后如何快速恢复呢?我的建议是使用内存快照(Redis Database)。

redis重启命令_redis重启,会不会数据丢失redis重启命令_redis重启,会不会数据丢失


redis重启命令_redis重启,会不会数据丢失


AOF的优势有哪些呢?

AOF 方法进行故障恢复的时候,需要逐一把作日志都执行一遍。如果作日志非常多,Redis 就会恢复得很缓慢,影响到正常使用。RDB 既可以保证可靠性,还能在宕机时实现快速恢复。

查询密码:

Redis 的数据都在内存中,为了提供所有数据的可靠性保证,它执行的是全量快照,也就是说,把内存中的所有数据都记录到磁盘中,这就类似于给 100 个人拍合影,把每一个人都拍进照片里。这样做的好处是,一次性记录了所有数据,一个都不少。

bgse 可以避免阻塞,但避免阻塞和正常处理写作并不是一回事。此时,主线程的确没有阻塞,可以正常接收请求,但是,为了保证快照完整性,它只能处理读作,因为不能修改正在执行快照的数据。为了快照而暂停写作,肯定是不能接受的。所以这个时候,Redis 就会借助作系统提供的写时技术(Copy-On-Write, COW),在执行快照的同时,正常处理写作。简单来说,bgse 子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据。bgse 子进程运行后,开始读取主线程的内存数据,并把它们写入 RDB 文件。此时,如果主线程对这些数据也都是读作(例如图中的键值对 A),那么,主线程和 bgse 子进程相互不影响。但是,如果主线程要修改一块数据(例如图中的键值对 C),那么,这块数据就会被一份,生成该数据的副本(键值对 C’)。然后,主线程在这个数据副本上进行修改。同时,bgse 子进程可以继续把原来的数据(键值对 C)写入 RDB 文件。

Redis 4.0 中提出了一个混合使用 AOF 日志和内存快照的方法。简单来说,内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令作。这样一来,快照不用很频繁地执行,这就避免了频繁 fork 对主线程的影响。而且,AOF 日志也只用记录两次快照间的作,也就是说,不需要记录所有作了,因此,就不会出现文件过大的情况了,也可以避免重写开销。

关于 AOF 和 RDB 的选择问题,有三点建议:

Redis停止的命令

哨兵模式中的主机关闭之后需要特别注意的一个易错点:就是因为现在老大已经换了,所以老大的认证密码也换了,因此需要在现任老大的所有从机里面配置主机的认证密码,这个哨兵模式是不会帮我们自动配置的,需要我们自动配置,如下图:

以上相同配置完成后,设置启动脚本进行启动;然后用如下命令进行node添加:Redis停止的命令

对于Centos7在安装redis之前需要进行一些常用工具的安装:

我的redis是部署在linux机器上的,而且是redis集群。下面的命令都是在linux上使用的。

“redis-server”所在行的,会有“IP:端口号”,执行第3步停止redis集群时要使用。

2. 进入redis-cli所在目录

注:如果不知道redis-cli所在目录,请使用如下命令查找(网上很多的人回答,redis-cli在redis/bin目录,我的机器却不是)

3. 停止redis服务,使用的IP、端口号为第1步查看出的IP、端口号。

步中的行记录,都要执行一次停止命令。

Could not connect to Redis at 127.0.0.1:XXXX: Connection refused

4. 查看redis服务是否停止成功

执行后,输出的记录中,不存在含有“redis-server”的行,则redis服务停止成功。

原文:

YouLuoJv使用知识的小砖垒起质量、效率灯塔,希望可以照亮更多人的路

linux下退出redis shutdown后怎么开启

1.在linux系统下可以通过初始化脚本启动Redis,使得Redis能随系统自动运行

文件改名为redis_端口号,然后修改第6行的 REDISPORT 为同样的端口号

③:修改配置文件将配置文件模板到/etc/redis目录中以端口号命名(如 6379.c3、另外可以使用cluster nodes查看哪些fail;onf) 然后对部分参数编辑

daemonize yes 使Redis以守护进程模式运行

pidf行记录,都要执行一次停止命令。ile /var/run/redis_端口号.pid 设置Redis的pid文件位置

port 端口号 设置Redis的端口号

dir /var/redis/端口号 设置持久化文件存放位置

⑤:设置Redis随系统自动启动 sudo update-rc.d redis_端口号 defaults

================================================================

停止Redis的时候有可能将内存中的数据同步到硬盘中,强制进程可以会导致数据丢失,

正确停止Redis的方法是 向Redis发送 shutdown命令当Redis收到命令后没回断开所有客户端连接,

然后配置执行持久化,①:在Redis源代码目录中的utils文件夹中有个redis_init_script的初始化脚本,到/etc/init.d目录中,退出(使用 kill Redis 进程的PID 效果与shutdown相同)

Redis持久化的方式选择与原理

处理方法有:1、修改redis.conf文件将daemonize改成yes(也就是改成后台进程),然后重启redis服务。重启之后问题是可以既觉得。

通常Redis将数据存储在内存中或虚拟内存中,但它提供了数据持久化功能可以把内存中的数据持久化到磁盘。持久化有什么好处呢?比如可以保证断电后数据不会丢失,升级也会变得更加方便。

1.RDB 持久化机制 :是对 redis 数据执行周期性的持久化。

这种方式就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为 dump.rdb。客户端也可以使用se或者bgse命令通知redis快照持久化。se作是在主线程中保存快照的,由于redis是用一个主线程来处理所有客户端的请求,这种方式会阻塞所有客户端请求。所以不使用。另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步增量数据。如果数据量大的话,写作会比较多,必然会引起大量的磁盘IO作,可能会影响性能。

2.AOF持久化机制 :AOF 机制对每条写入命令作为日志,以 append-only 的模式写入一个日志文件中,在 redis 重启的时候,可以通过回放 AOF 日志中的写入指令来重新构建整个数据集。当然由于作系统会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样的持久化还是有可能会丢失部分修改。不过我们可以通过配置文件告诉 redis我们想要通过fsync函数强制作系统写入到磁盘的时机。

appendonly yes //启用日志追加持久化方式

(1)appendfsync always //收到写命令就立即强制写入磁盘。最慢的,但是保证完全持久化,不使用。

(2)appendfsync rysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,使用。

(3)appendfsync no //完全依赖作系统,性能,持久化没保证。

优点:

2.AOF方式

优点AOF的劣势有哪些呢?:1.RDB方式

不要仅仅使用 RDB,因为那样会导致你丢失很多数据;也不要仅仅使用 AOF,因为那样有两个问题:,你通过 AOF 做冷备,没有 RDB 做冷备来的恢复速度更快;第二,RDB 每次简单粗暴生成数据快照,更加健壮,可以避免 AOF 这种复杂的备份和恢复机制的 bug;redis 支持同时开启开启两种持久化方式,我们可以综合使用 AOF 和 RDB 两种持久化机制,用 AOF 来保证数据不丢失,作为数据恢复的选择; 用 RDB 来做不同程度的冷备,在 AOF 文件都丢失或损坏不可用的时候,还可以使用 RDB 来进行快速的数据恢复。

出处:

redis安装好了,但redis-cli不能用,就是说$redis-cli回车后没有反应

缺点:Redis 集群中的每个都负责哈希槽的一个子集, 例如,您可能有一个包含 3 个的集群,通过 RDB 或 AOF,都可以将 redis 内存中的数据持久化到磁盘上面来,然后可以将这些数据备份到别的地方去。其中:

Redis 内存故障诊断及常用运维命令

在登录的时候的时候输入密码:

你是否有过这种困扰:我的数据量非常小,但还是报OOM错误?

首先我给大家解释下,Redis的OOM分两种

简短介绍下Redis内存消耗划分情况,为下文诊断提供思路。上图可以总结Redis消耗内存分如下几块:

使用redis-benchmark持续灌入数据

压测几秒钟后,触发OOM

检查输入缓冲区内存消耗,能看到客户端输入缓冲区消耗总量为 2.4G左右,远远超过maxmemory参该Sentinel会询问其他Sentinel,如果Sentinel集群中超过quorum数量的Sentinel认为该Redis主观下线,则该redis客观下线。数设置。

我们可以看出, 7004 升级了 , 7001 是 fail 状态。为测试方便,我直接把积压缓冲区配置为800M。

开启redis-benchmark压测进程

检查积压缓冲区内存消耗,可以看到因为缓冲区设置过大,数据量才存储190多M,Redis就无法写入了。

若客户端输出缓冲区太大如何排查?一般该场景比较少见,常见于用到了redis的 monitor 命令

上文排查过程有些Redis运维命令我认为比较实用,整理如下

脚本执行效果:

缓存-redis 三种模式搭建和运行原理

④:使用 /etc/init.d/redis_端口号 start 启动 Redis

标签: redis 缓存 主从 哨兵 集群

可通过运行上述检查命令,定位到各客户端输入缓冲区的内存消耗(由大到小排序)。

本文简单的介绍redis三种模式在linux的安装部署和数据存储的总结,希望可以相互交流相互提升。

②:建立需要的文件夹/etc/redis存放redis的配置文件/var/redis/端口号 存放Redis的持久化文件

关闭防火墙

正式安装redis

在redis进行maketest时候会出现一系列的异常,有如下解决方案:

用redis-server启动一下redis,做一些实验没什么意义。

要把redis作为一个系统的daemon进程去运行的,每次系统启动,redis进程一起启动,作不走如下:

RDB和AOF是redis的一种数据持久化的机制。 持久化 是为了避免系统在发生灾难性的系统故障时导致的系统数据丢失。我们一般会将数据存放在本地磁盘,还会定期的将数据上传到云。

RDB 是redis的snapshotting,通过redis.conf中的se配置进行设置,如 se 60 1000:

AOF 是以appendonly方式进行数据的储存的,开启AOF模式后,所有存进redis内存的数据都会进入os cache中,然后默认1秒执行一次fsync写入追加到appendonly.aof文件中。一般我们配置redis.conf中的一下指令:

当启动一个sle node的时候,它会发送一个PSYNC命令给 node,如果这是sle node重新连接 node,那么 node仅仅会给sle部分缺少的数据;否则如果是sle node次连接 node,那么会触发一次full resynchronization;

开始full resynchronization的时候,会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端收到的所有写命令缓存在内存中。RDB文件生成完毕之后,会将这个RDB发送给sle,sle会先写入本地磁盘,然后再从本地磁盘加载到内存中。然后会将内存中缓存的写命令发送给sle,sle也会同步这些数据。

sle node如果跟 node有网络故障,断开了连接,会自动重连。如果发现有多个sle node都来重新连接,仅仅会启动一个rdb se作,用一份数据服务所有sle node。

从redis 2.8开始,就支持主从的断点续传,如果主从过程中,网络连接断掉了,那么可以接着上次的地方,继续下去,而不是从头开始一份。

node会在内存中常见一个backlog,和sle都会保存一个replica offset还有一个 id,offset就是保存在backlog中的。如果和sle网络连接断掉了,sle会让从上次的replica offset开始继续,但是如果没有找到对应的offset,那么就会执行一次resynchronization。

在内存中直接创建rdb,然后发送给sle,不会在自己本地落地磁盘了,可以有如下配置:

在redis.conf配置文件中,上面的参数代表至少需要3个sles与进行连接,并且和每个sle的数据同步延迟不能超过10秒。一旦上面的设定没有匹配上,则不在提供相应的服务。

sdown达成的条件很简单,如果一个哨兵ping一个,超过了 is--down-after-milliseconds 指定的毫秒数之后,就主观认为宕机

sdown到odown转换的条件很简单,如果一个哨兵在指定时间内,收到了 quorum 指定数量的其他哨兵也认为那个是sdown了,那么就认为是odown了,客观认为宕机

如果一个sle跟断开连接已经超过了down-after-milliseconds的10倍,外加宕机的时长,那么sle就被认为不适合选举为

(down-after-milliseconds 10) + milliseconds_since__is_in_SDOWN_state

每次一个哨兵要做主备切换,首先需要quorum数量的哨兵认为odown,然后选举出一个sle来做切换,这个sle还得得到majority哨兵的授权,才能正式执行切换;

(2)SENTINEL RESET ,在所有sentinal上执行,清理所有的状态

(3)SENTINEL MASTER name,在所有sentinal上执行,查看所有sentinal对数量是否达成了一致

4.3.2 sle的下线

redis的集群模式为了解决系统的横向扩展以及海量数据的存储问题,如果你的数据量很大,那么就可以用redis cluster。

redis cluster可以支撑N个redis ,一个上面可以挂载多个sle,一般情况我门挂载一个到两个sle,在挂掉以后会主动切换到sle上面,或者当一个上面的sle都挂掉后,集群会从其他上面找到冗余的sle挂载到这个上面,达到了系统的高可用性。

2.1 redis cluster的重要配置

2.2 在三台机器上启动6个redis实例

将上面的配置文件,在/etc/redis下放6个,分别为: 7001.conf,7002.conf,7003.conf,7004.conf,7005.conf,7006.conf

每个启动脚本内,都修改对应的端口号

2.3 创建集群

解决办法是 先安装rvm,再把ruby版本提升至2.3.3

使用redis-trib.rb命令创建集群

--replicas: 表示每个有几个sle

redis-trib.rb check 192.168.31.187:7001 查看状体

3.1 加入新

3.2 reshard一些数据过去

3.4 删除node

Redis集群检测与恢复

删除了 7006 , 7007 后的集群情况

一、redis集群检测方法

1、使用redis-cli登录sle不会过期key,只会等待过期key。如果过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给sle。正常;

2、使用cluster 命令查看集群状态,最重要的字段,cluster_state:ok,说明集群正常;

二、redis集群恢复方法

步骤一、集群中有有进程挂掉,优先重启进程;

实验中3主3从的集群,6个进程全部挂掉情况下,一次重启进程,redis集群还能恢复;

步骤二、如果按照步骤一集群没有恢复,那么就要重建集群

1、一次杀掉集群所有的进程;

2、重建集群配置,以redis5为例

redis-cli [-a xxx] --cluster create --cluster-replicas 1 node_ip_1:port_1 1nodeRedis 提供了两个命令来生成 RDB 文件,分别是 se 和 bgse。_ip_2:port_2 node_ip_3:port_3 node_ip_4:port_4 node_ip_5:port_5 node_ip_6:port_6

可能报错,处理方法:删除data、log、node.conf等文件,重新构建集群。

备注:[-a xxx] redis密码

redis持久化的几种方式介绍

如果redis在append数据到AOF文件时,机器宕机了,可能会导致AOF文件的破损,我们在重启redis之前,找到AOF文件,用redis自带的工具来修复它(执行下面的命令来修复AOF文件:)

1、前言

redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的作日志以追加的方式写入文件)。那么这两种持久化方式有什么区别呢,改如何选择呢?网上看了大多数都是介绍这两种方式怎么配置,怎么使用,就是没有介绍二者的区别,在什么应用场景下使用。

2、二者的区别

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

AOF持久化以日志的形式记录所处理的每一个写、删除作,查询作不会记录,以文本的方式记录,可以打开文件看到详细的作记录。

3、二者优缺点

RDB存在哪些优势每一个Sentinel都可以成为Leader,当一个Sentinel确认redis集群的主主观下线后,会请求其他Sentinel要求将自己选举为Leader。被请求的Sentinel如果没有同意过其他Sentinel的选举请求,则同意该请求(选举票数+1),否则不同意。呢?

1). 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。

2). 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。

3). 性能化。对于Redis的服务进程而言,在开始持久化时,它需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO作了。

4). 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。

RDB又存在哪些劣势呢?

1). 如果你想保证数据的高可用性,即限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

2). 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个停止服务几百毫秒,甚至是1秒钟。

1). 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是的。至于无同步,无需多言,我想大家都能正确的理解它。

2). 由于该机制对日志文件的写入作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。

4). AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改作。事实上,我们也可以通过该文件完成数据的重建。

2). 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。

二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写作频繁的时候,不启用备份来换取更高的性能,待手动运行se的时候,再做备份(rdb)。rdb这个就更有些 ntually consistent的意思了。

4、常用配置

R执行后,输出的记录中,含有“redis-server”的行,全是运行的redis服务。DB持久化配置

Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redisdump快照的频率,在打开6379.conf文件之后,我们搜索se,可以看到下面的配置信息:

se 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。

se 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。

se 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。

AOF持久化配置

在Redis的配置文件中存在三种同步方式,它们分别是:

appendfsync always #每次有数据修改发生时都会写入AOF文件。

appendfsync rysec #每秒钟同步一次,该策略为AOF的缺省策略。

appendfsync no #从不同步。高效但是数据不会被持久化。

更多redis知识请关注redis数据库教程栏目。