Redis의 지속성 메커니즘에 대한 자세한 분석

青灯夜游
풀어 주다: 2021-12-29 10:11:46
앞으로
1738명이 탐색했습니다.

이 기사에서는 Redis의 지속성 메커니즘인 RDB와 AOF를 이해하고 RDB와 AOF를 비교하는 데 도움이 되기를 바랍니다.

Redis의 지속성 메커니즘에 대한 자세한 분석

Redis 지속성 메커니즘

지속성이 필요한 이유

Redis에 다시 액세스하여 Redis 데이터가 비어 있음을 발견하면 캐시 침투가 발생합니다. 더 중요한 것은 Redis 데이터가 비어 있기 때문에 클라이언트가 액세스하려는 키가 없기 때문에 많은 수의 요청이 즉시 데이터베이스에 도달하여 캐시 사태가 발생합니다(소수의 키가 침투되고 많은 수의 핵심은 눈사태입니다).

이때 데이터베이스가 중단될 수 있습니다. 그리고 Redis가 다운되지 않는다는 보장도 없기 때문에 Redis가 다운되면 내부 내용을 빠르게 복구해야 합니다. 그러므로 끈기가 필요합니다. 지속성은 데이터를 저장하기 위한 것이 아니라 데이터를 복구하기 위한 것입니다. [관련 추천사항: Redis 영상 튜토리얼]

RDB

RDB(Redis DataBase)는 Redis의 기본 저장 방식입니다. RDB 방식은 스냅샷을 통해 완성됩니다.

스냅샷을 트리거하는 방법

은 사용자 정의 구성된 스냅샷 규칙을 따릅니다

  • save 900 1 #은 15분(900초) 내에 키가 1개 이상 변경되면 스냅샷이 생성됨을 의미합니다. ).

  • save 300 10 # 5분(300초) 이내에 10개 이상의 키가 변경되면 스냅샷을 찍음을 나타냅니다.

  • save 60 10000 # 1분 이내에 10,000개 이상의 키가 변경되면 빠르게 진행함을 나타냅니다.

N秒内数据集至少有M个改动”这一条件被满足时,自动保存一次数据集。

save 또는 bgsave 명령을 실행합니다.

save 또는 bgsave 명령을 실행하여 덤프를 생성합니다. .rdb 파일, 매번 명령을 실행할 때마다 모든 redis 메모리의 스냅샷을 새 rdb 파일로 만들고 원본 rdb 스냅샷 파일을 덮어씁니다.

save와 bgsave 비교:

명령 save bgsave
IO 유형 synchronous asynchronous
redis 다른 명령 차단 여부 아니요( in 포크 기능을 호출하기 위해 하위 프로세스가 실행될 때 잠시 차단됩니다.)
Complexity O(n) O(n)
장점 추가 메모리를 소비하지 않습니다 클라이언트 명령을 차단하지 않습니다
단점 클라이언트 명령 차단 하위 프로세스를 포크하고 메모리를 소비해야 함

配置自动生成rdb文件后台使用的是bgsave方式。

flushall 명령 실행

flushall
로그인 후 복사

Redis를 지우기 전 현재 Redis 스냅샷을 저장하세요

마스터-슬레이브 복제 작업 수행(처음)

첫 번째 마스터-슬레이브 복제에서는 rdb 파일을 생성해야 합니다. 현재 Redis 스냅샷

RDB 실행 프로세스

Redis의 지속성 메커니즘에 대한 자세한 분석

  • 프로세스 분석

      1. Redis 상위 프로세스가 먼저 현재 save를 실행 중인지 bgsave/bgrewriteaof(aof 파일 재작성)를 실행 중인지 결정합니다. 명령) 하위 프로세스가 실행 중인 경우 bgsave 명령이 직접 반환됩니다.
      1. 상위 프로세스는 하위 프로세스를 생성하기 위해 포크(운영 체제 기능 호출) 작업을 실행합니다. 이 프로세스 중에 상위 프로세스는 차단되며 Redis는 클라이언트에서 어떤 명령도 실행할 수 없습니다. .
      1. 상위 프로세스가 분기된 후 bgsave 명령은 "백그라운드 저장 시작" 메시지를 반환하고 더 이상 상위 프로세스를 차단하지 않으며 다른 명령에 응답할 수 있습니다.
      1. 하위 프로세스는 RDB 파일을 생성하고 상위 프로세스의 메모리 스냅샷을 기반으로 임시 스냅샷 파일을 생성하며 완료 후 원본 파일을 원자적으로 대체합니다. (RDB는 항상 완료됩니다.)
      1. 자식 프로세스는 부모 프로세스에 완료를 알리는 신호를 보내고, 부모 프로세스는 통계를 업데이트합니다.
      1. 부모 프로세스가 자식 프로세스를 분기한 후에도 계속 작동합니다.

RDB 파일 구조

Redis의 지속성 메커니즘에 대한 자세한 분석

  • 1. 5바이트 ​​헤더는 "REDIS" 문자열
  • 2으로 고정됩니다. Redis 버전 번호)는 현재 9입니다.
  • 3. 키-값 형식의 보조 필드
  • 4. 사전 크기
  • 6. . Primary 데이터, 키-값
  • 8, 종료 플래그
  • 9, 체크섬 형식으로 저장되며 파일이 손상되었거나 수정되었는지 확인합니다
  • RDB의 장점과 단점

장점

RDB는 바이너리 압축 파일로 공간을 적게 차지하고 전송이 쉽습니다(슬레이브에 전달)

  • 메인 프로세스는 Redis 성능을 최대화하기 위해 하위 프로세스를 포크합니다. . 복사 프로세스 중에 기본 프로세스가 차단됩니다

  • 단점

데이터 무결성이 보장되지 않으며 마지막 스냅샷 이후 변경된 모든 데이터가 손실됩니다

  • AOF

AOF(추가만 가능) 파일)은 Redis의 또 다른 지속성 방법입니다. Redis는 기본적으로 활성화되어 있지 않습니다. AOF 지속성을 켠 후 Redis는 데이터베이스 상태를 기록하는 목적을 달성하기 위해 데이터베이스에 작성된 모든 명령(및 해당 매개변수)(RESP)을 AOF 파일에 기록합니다. 순서대로 재생됩니다. 이 명령은 원래 상태로 복원됩니다. AOF는 프로세스를 기록하고 RDB는 결과에만 관심이 있습니다

AOF 지속성 구현

Configure redis.conf

# 可以通过修改redis.conf配置文件中的appendonly参数开启 
appendonly yes

# AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的。 
dir ./

# 默认的文件名是appendonly.aof,可以通过appendfilename参数修改 
appendfilename appendonly.aof
로그인 후 복사
AOF 원칙

AOF 파일은 redis 명령을 저장하고 명령을 다음과 동기화합니다. AOF 파일 전체 프로세스는 세 단계로 나눌 수 있습니다: 명령 전파: Redis는 실행된 명령, 명령 매개 변수, 명령 매개 변수 번호 및 기타 정보를 AOF 프로그램으로 보냅니다.

    캐시 추가: AOF 프로그램은 수신된 명령 데이터를 기반으로 명령을 네트워크 통신 프로토콜 형식으로 변환한 다음 프로토콜 내용을 서버의 AOF 캐시에 추가합니다.
  • 파일 쓰기 및 저장: AOF 캐시에 있는 내용을 AOF 파일 끝에 씁니다. 설정된 AOF 저장 조건이 충족되면 fsync 함수 또는 fdatasync 함수가 호출되어 작성된 내용을 실제로 씁니다. 디스크에 저장합니다.
  • 명령 전파

Redis의 지속성 메커니즘에 대한 자세한 분석Redis 클라이언트는 명령을 실행해야 할 때 네트워크 연결을 통해 프로토콜 텍스트를 Redis 서버로 보냅니다. 서버는 클라이언트의 요청을 받은 후 프로토콜 텍스트의 내용을 기반으로 적절한 명령 기능을 선택하고 각 매개변수를 문자열 텍스트에서 Redis 문자열 개체(StringObject)로 변환합니다. 명령 기능이 성공적으로 실행될 때마다 명령 매개변수가 AOF 프로그램에 전파됩니다.

Cache Append

명령이 AOF 프로그램에 전파되면 프로그램은 명령과 명령의 매개변수를 기반으로 문자열 개체의 명령을 원래 프로토콜 텍스트로 다시 변환합니다. 프로토콜 텍스트가 생성된 후 redis.h/redisServer 구조의 aof_buf 끝에 추가됩니다.

redisServer 구조는 Redis 서버의 상태를 유지하며, aof_buf 필드에는 AOF 파일에 쓰기를 기다리는 모든 프로토콜 텍스트(RESP)가 저장됩니다.

파일 쓰기 및 저장

每当服务器常规任务函数被执行、或者事件处理器被执行时,aof.c/flushAppendOnlyFile 函数都会被调用,这个函数执行以下两个工作:

  • WRITE:根据条件将aof_buf中的缓存写入到AOF文件。

  • SAVE:根据条件调用fsync或 fdatasync函数将AOF文件保存到磁盘中。

AOF保存模式

Redis 目前支持三种 AOF 保存模式,它们分别是:

  • AOF_FSYNC_NO :不保存。

  • AOF_FSYNC_EVERYSEC :每一秒钟保存一次。(默认)

  • AOF_FSYNC_ALWAYS :每执行一个命令保存一次。(不推荐)

AOF_FSYNC_NO

从不fsync,将数据交给操作系统来处理。更快,也更不安全的选择。

SAVE只会在以下任意一种情况中被执行:

  • Redis被关闭

  • AOF功能被关闭

  • 系统的写缓存被刷新(可能是缓存已经被写满,或者定期保存操作被执行)

这三种情况下的SAVE操作都会引起Redis主进程阻塞。

AOF_FSYNC_EVERYSEC

SAVE原则上每隔一秒钟就会执行一次,因为SAVE操作是由后台子线程(fork)调用的, 所以它不会引起服务器主进程阻塞,并且在故障时只会丢失1秒钟的数据。

AOF_FSYNC_ALWAYS

每次执行完一个命令之后,WRITE和SAVE都会被执行。每次有新命令追加到AOF文件时就执行一次fsync,非常慢,也非常安全。

因为SAVE是由Redis主进程执行的,所以在SAVE执行期间,主进程会被阻塞,不能接受命令请求。

AOF保存模式对性能和安全性的影响

三种模式的比较

Redis의 지속성 메커니즘에 대한 자세한 분석

AOF重写

AOF记录数据的变化过程,越来越大,需要重写“瘦身”

Redis可以在AOF体积变得过大时,自动地在后台(Fork子进程)对AOF进行重写。

重写后的新AOF文件包含了恢复当前数据集所需的最小命令集合。

所谓的“重写”其实是一个有歧义的词语,实际上,AOF重写并不需要对原有的AOF文件进行任何写入和读取,它针对的是数据库中键的当前值。

举例说明

set s1 11
set s1 22
set s1 33

lpush list1 1 2 3
lpush list1 4 5 6
로그인 후 복사

AOF重写后

set s1 33

lpush list1 1 2 3 4 5 6
로그인 후 복사

Redis不希望AOF重写造成服务器无法处理请求,所以Redis决定将AOF重写程序放到(后台)子进程里执行,

  • 1、子进程进行AOF重写期间,主进程可以继续处理命令请求。

  • 2、子进程带有主进程的数据副本,使用子进程而不是线程,可以在避免锁的情况下,保证数据的安全性。

不过,使用子进程也有一个问题需要解决:因为子进程在进行AOF重写期间,主进程还需要继续处理命令,而新的命令可能对现有的数据进行修改,这会让当前数据库的数据和重写后的AOF文件中的数据不一致。

为了解决这个问题,Redis增加了一个AOF重写缓存,这个缓存在fork出子进程之后开始启用,Redis主进程在接到新的写命令之后,除了会将这个写命令的协议内容追加到现有的AOF文件之外,还会追加到这个缓存中。

重写过程分析

Redis의 지속성 메커니즘에 대한 자세한 분석

Redis在创建新AOF文件的过程中,会继续将命令追加到现有的AOF文件里面,即使重写过程中发生停机,现有的AOF文件也不会丢失。而一旦新AOF文件创建完毕,Redis就会从旧AOF文件切换到新AOF文件,并开始对新AOF文件进行追加操作。

当子进程在执行AOF重写时,主进程需要执行以下三个工作:

  • 处理命令请求。
  • 将写命令追加到现有的AOF文件中。
  • 将写命令追加到AOF重写缓存中

。这样一来可以保证:现有的AOF功能会继续执行,即使在AOF重写期间发生停机,也不会有任何数据丢失。所有对数据库进行修改的命令都会被记录到AOF重写缓存中。

当子进程完成AOF重写之后,它会向父进程发送一个完成信号,父进程在接到完成信号之后,会调用一个信号处理函数,并完成以下工作:

  • 将AOF重写缓存中的内容全部写入到新AOF文件中。
  • 对新的AOF文件进行改名,覆盖原有的AOF文件。

Redis数据库里的+AOF重写过程中的命令------->新的AOF文件---->覆盖老的当步骤1执行完毕之后,现有AOF文件、新AOF文件和数据库三者的状态就完全一致了。

当步骤2执行完毕之后,程序就完成了新旧两个AOF文件的交替。这个信号处理函数执行完毕之后,主进程就可以继续像往常一样接受命令请求了

。在整个AOF后台重写过程中,只有最后的写入缓存和改名操作会造成主进程阻塞,在其他时候,AOF后台重写都不会对主进程造成阻塞,这将AOF重写对性能造成的影响降到了最低。

AOF重写触发方式

  • 1、配置触发
#表示当前aof文件大小超过上一次aof文件大小的百分之多少的时候会进行重写。如果之前没有重写过,以启动时aof文件大小为准
auto-aof-rewrite-percentage 100

#限制允许重写最小aof文件大小,也就是文件大小小于64mb的时候,不需要进行优化
auto-aof-rewrite-min-size 64mb
로그인 후 복사
  • 2、执行bgrewriteaof命令
127.0.0.1:6379>bgrewriteaof‘
Backgroundappendonlyfilerewritingstarted
로그인 후 복사

AOF重写总结

Redis의 지속성 메커니즘에 대한 자세한 분석

混合持久化

RDB和AOF各有优缺点,Redis 4.0开始支持rdb和aof的混合持久化。

如果把混合持久化打开,aofrewrite的时候就直接把rdb的内容写到aof文件开头。

RDB的头+AOF的身体---->appendonly.aof

开启混合持久化

aof-use-rdb-preambleyes
로그인 후 복사

AOF文件的载入与数据还原

如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。

于是在Redis重启的时候,可以先加载RDB的内容,然后再重放增量AOF日志就可以完全替代之前的AOF全量文件重放,因此重启效率大幅得到提升。

  • 1、创建一个不带网络连接的伪客户端(fake client)

因为Redis的命令只能在客户端上下文中执行,而载入AOF文件时所使用的命令直接来源于AOF文件而不是网络连接,所以服务器使用了一个没有网络连接的伪客户端来执行AOF文件保存的写命令,伪客户端执行命令的效果和带网络连接的客户端执行命令的效果完全一样

  • 2、从AOF文件中分析并读取出一条写命令

  • 3、使用伪客户端执行被读出的写命令

  • 4、一直执行步骤2和步骤3,直到AOF文件中的所有写命令都被处理完毕为止

Redis의 지속성 메커니즘에 대한 자세한 분석

Redis数据备份策略

  • 1.写crontab定时调度脚本,每小时都copy一份rdb或aof的备份到一个目录中去,仅仅保留最近48小时的备份

  • 2.每天都保留一份当日的数据备份到一个目录中去,可以保留最近1个月的备份

  • 3.每次copy备份的时候,都把太旧的备份给删了

  • 4.每天晚上将当前机器上的备份复制一份到其他机器上,以防机器损坏

RDB和AOF对比

  • 1、RDB存某个时刻的数据快照,采用二进制压缩存储,AOF存操作命令,采用文本存储(混合)

  • 2、RDB性能高、AOF性能较低

  • 3、RDB在配置触发状态会丢失最后一次快照以后更改的所有数据,AOF设置为每秒保存一次,则最多丢2秒的数据

  • 4、Redis以主服务器模式运行,RDB不会保存过期键值对数据,Redis以从服务器模式运行,RDB会保存过期键值对,当主服务器向从服务器同步时,再清空过期键值对。AOF写入文件时,对过期的key会追加一条del命令,当执行AOF重写时,会忽略过期key和del命令。

更多编程相关知识,请访问:编程视频!!

위 내용은 Redis의 지속성 메커니즘에 대한 자세한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:juejin.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!