RDB 및 AOF 지속성에 대한 간략한 분석, 장점과 단점은 무엇입니까? 선택하는 방법?

青灯夜游
풀어 주다: 2022-03-11 10:30:02
앞으로
3669명이 탐색했습니다.

이 기사에서는redis의 RDB 및 AOF 지속성 원칙에 대해 설명합니다. 이들의 장점과 단점은 무엇인가요? 어떤 것을 사용해야 하는지 분석해 보세요. 모두에게 도움이 되기를 바랍니다!

RDB 및 AOF 지속성에 대한 간략한 분석, 장점과 단점은 무엇입니까? 선택하는 방법?

Redis는 RDB와 AOF라는 두 가지 지속성 솔루션을 제공합니다.

  • RDB: 지정된 시간 간격 내에 Redis 메모리에 데이터의 스냅샷을 생성합니다. 이는 바이너리 파일 dumpr.rdb

  • AOF입니다. Record Redis는 쿼리를 제외한 모든 명령을 작성하고 Redis 서비스가 시작될 때 이러한 명령을 다시 실행하여 데이터를 복원합니다.

RDB 지속성

기본적으로 Redis는 RDB 스냅샷 형식으로 일정 기간 동안 데이터를 하드 디스크에 유지하고 이를dumpr.rdb바이너리 파일로 저장합니다. [관련 권장 사항:dumpr.rdb二进制 文件。【相关推荐:Redis视频教程

工作原理简单介绍一下

当 Redis 需要做持久化时,Redis 会 fork 一个子进程,子进程将数据写到磁盘上一个临时 RDB 文件中。当子进程完成写临时文件后,将原来的 RDB 替换掉,这样的好处就是可以copy-on-write

当然我们也可以手动执行save或者bgsave(异步)生成 RDB 文件。

redis.conf 默认配置

save 900 1 save 300 10 save 60 10000
로그인 후 복사
  • 900秒之内,如果超过1个key被修改,则发起快照保存;
  • 300秒之内,如果超过10个key被修改,则发起快照保存;
  • 60秒之内,如果1万个key被修改,则发起快照保存;

RDB 快照命令

在默认情况下, Redis 将数据库快照保存在名字为 dump.rdb 的二进制文件中。

你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。

你也可以通过调用SAVE或者BGSAVE, 手动让 Redis 进行数据集保存操作。

比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集:

save 60 1000
로그인 후 복사

这种持久化方式被称为快照(snapshot)。

RDB 创建原理

当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作:

  • Redis 调用 fork() ,同时拥有父进程和子进程。
  • 子进程将数据集写入到一个临时 RDB 文件中。
  • 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益。

RDB 的优点

RDB 是一个比较紧凑的文件,它保存了 Redis 在某个时间点的数据,这种数据比较适合做备份和用于灾难恢复。

比如说,你可以在最近的 24 小时内,每小时备份一次 RDB 文件,并且在每个月的每一天,也备份一个 RDB 文件。 这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。

RDB 的缺点

如果你需要尽量避免在服务器故障时丢失数据,那么 RDB 不适合你。 虽然 Redis 允许你设置不同的保存点来控制保存 RDB 文件的频率, 但是, 因为 RDB 文件需要保存整个数据集的状态, 所以它并不是一个轻松的操作。 因此你可能会至少 5 分钟才保存一次 RDB 文件。 在这种情况下, 一旦发生故障停机, 你就可能会丢失好几分钟的数据。

AOF 持久化

使用 AOF 做持久化,每一个写命令都通过write函数追加到appendonly.aof文件中。

AOF 就可以做到全程持久化,只需要在配置文件中开启(默认是 no ),appendfsync yesRedis 동영상 튜토리얼

]

작동 원리에 대한 간략한 소개:

Redis가 지속되어야 할 때 Redis는 하위 프로세스를 포크하고 하위 프로세스는 데이터를 임시 RDB에 기록합니다. 디스크에 있는 파일입니다. 하위 프로세스가 임시 파일 쓰기를 마치면 원본 RDB를 교체합니다. 이 방법의 장점은 쓰기 시 복사가 가능하다는 것입니다.

물론 save또는 bgsave(비동기식)를 수동으로 실행하여 RDB 파일을 생성할 수도 있습니다.

redis.conf 기본 구성

appendfsync yes appendfsync always #每次有数据修改发生时都会写入AOF文件。 appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
로그인 후 복사
    900초 내에 2개 이상의 키가 수정되면 스냅샷 저장이 시작됩니다. 300초 내에 10개 이상의 키가 수정되면 스냅샷 저장이 시작됩니다. ; 60초 내에 10,000개의 키가 수정되면 스냅샷 저장이 시작됩니다.RDB 스냅샷 명령기본적으로 Redis는 데이터베이스 스냅샷을 바이너리 파일의 dump.rdb라는 이름으로 저장합니다. "데이터 세트에 N초 내에 최소 M개의 변경 사항이 있음"이라는 조건이 충족되면 데이터 세트를 자동으로 저장하도록 Redis를 설정할 수 있습니다. SAVE또는 BGSAVE를 호출하여 Redis가 데이터 세트를 수동으로 저장하도록 할 수도 있습니다. 예를 들어 다음 설정을 사용하면 Redis가 "60초 내에 최소 1000개의 키가 변경되었습니다"라는 조건을 충족할 때 데이터 세트를 자동으로 저장하게 됩니다. rrreee이 지속성 방법을 스냅샷이라고 합니다. RDB 생성 원리Redis가 dump.rdb 파일을 저장해야 할 때 서버는 다음 작업을 수행합니다.
      Redis는 fork()를 호출하고 상위 프로세스와 하위 프로세스를 모두 갖습니다. 하위 프로세스는 데이터 세트를 임시 RDB 파일에 씁니다. 하위 프로세스가 새 RDB 파일에 쓰기를 완료하면 Redis는 원본 RDB 파일을 새 RDB 파일로 바꾸고 이전 RDB 파일을 삭제합니다. 이러한 작업 방식을 통해 Redis는 쓰기 중 복사 메커니즘의 이점을 누릴 수 있습니다. RDB의 장점RDB는 특정 시점의 Redis 데이터를 저장하는 비교적 컴팩트한 파일입니다. 이러한 종류의 데이터는 백업 및 재해 복구에 더 적합합니다. 예를 들어 지난 24시간 동안 매시간 RDB 파일을 백업할 수도 있고 매월 매일 RDB 파일을 백업할 수도 있습니다. 이렇게 하면 문제가 발생하더라도 언제든지 데이터 세트를 다른 버전으로 복원할 수 있습니다. RDB의 단점서버 장애 시 데이터 손실을 최소화해야 한다면 RDB는 적합하지 않습니다. Redis를 사용하면 RDB 파일 저장 빈도를 제어하기 위해 다양한 저장 지점을 설정할 수 있지만 RDB 파일은 전체 데이터 세트의 상태를 저장해야 하기 때문에 쉬운 작업이 아닙니다. 따라서 적어도 5분마다 한 번씩 RDB 파일을 저장할 수 있습니다. 이 경우 가동 중단이 발생하면 몇 분 동안의 데이터가 손실될 수 있습니다. AOF 지속성지속성을 위해 AOF를 사용하세요. 각 쓰기 명령은 write함수를 통해 appendonly.aof파일에 추가됩니다. AOF는 구성 파일에서만 활성화하면 됩니다(기본값은 no). appendfsync yesAOF를 활성화한 후 Redis는 명령을 실행할 때마다 이를 추가합니다. Redis가 다시 시작되면 AOF 파일을 읽고 "재생"하여 Redis가 종료되기 전의 마지막 순간을 복원합니다. AOF 구성Redis fsync가 데이터를 디스크에 동기화하는 빈도를 구성할 수 있습니다. redis.conf 기본 구성rrreee에는 세 가지 옵션이 있습니다.

      1. AOF 파일에 새 명령이 추가될 때마다 fsync를 실행하세요.: 매우 느리고 매우 안전합니다.
      2, 초당 한 번 fsync: 충분히 빠르며(RDB 지속성을 사용하는 것과 거의 동일), 오류 발생 시 1초의 데이터만 손실됩니다.
      3, 절대 fsync: 처리를 위해 데이터를 운영 체제에 맡깁니다. 더 빠르고 덜 안전한 옵션입니다.

      권장(및 기본) 조치는 초당 한 번씩 fsync하는 것입니다. 이 fsync 전략은 속도와 보안의 균형을 맞출 수 있습니다.

      AOF 생성 원리

      AOF 재작성은 RDB가 스냅샷을 생성하는 것과 동일하며, 둘 다 쓰기 중 복사 메커니즘을 교묘하게 활용합니다.

      다음은 AOF 재작성의 실행 단계입니다.

      Redis는 fork()를 실행하고 이제 상위 프로세스와 하위 프로세스를 모두 갖습니다.

      하위 프로세스는 새 AOF 파일의 내용을 임시 파일에 쓰기 시작합니다.

      새로 실행된 모든 쓰기 명령에 대해 상위 프로세스는 해당 명령을 메모리 캐시에 축적하고 이러한 변경 사항을 기존 AOF 파일 끝에 추가합니다. 이러한 방식으로 다시 쓰기 도중에 종료가 발생하더라도 기존 AOF는 파일은 아직 안전합니다.

      하위 프로세스가 다시 쓰기 작업을 완료하면 상위 프로세스에 신호를 보냅니다. 신호를 받은 후 상위 프로세스는 메모리 캐시의 모든 데이터를 새 AOF 파일 끝에 추가합니다.

      완료! 이제 Redis는 이전 파일을 새 파일로 원자적으로 대체하고 이후의 모든 명령은 새 AOF 파일 끝에 직접 추가됩니다.

      AOF

      1. 지속성을 위해 AOF를 사용하면 fsync 없음, 초당 한 번 fsync 또는 쓰기 명령이 실행될 때마다 fsync와 같은 다양한 fsync 전략을 설정할 수 있습니다.

      AOF의 기본 정책은 초당 한 번씩 fsync하는 것입니다. 이 구성에서 Redis는 여전히 좋은 성능을 유지할 수 있으며, 오류가 발생하더라도 최대 1초의 데이터만 손실됩니다.

      fsync는 백그라운드 스레드에서 실행되므로 메인 스레드가 계속해서 명령 요청을 열심히 처리할 수 있습니다.

      2. AOF 파일은 추가 작업만 수행하는 로그 파일입니다. 로그에 어떤 이유로(예: 디스크가 꽉 찼을 때) 불완전한 명령이 포함된 경우에도 교체되는 로그 파일은 아닙니다. 작성할 때 redis-check-aof 도구를 사용하면 이 문제를 쉽게 해결할 수도 있습니다.

      3. Redis는 AOF 파일 크기가 너무 커지면 백그라운드에서 자동으로 AOF를 다시 작성할 수 있습니다. 다시 작성한 후의 새 AOF 파일에는 현재 데이터 세트를 복원하는 데 필요한 최소 명령 세트가 포함되어 있습니다.

      Redis 재작성은 새로운 AOF 파일을 생성하기 때문에 전체 재작성 작업은 절대적으로 안전합니다. 재작성 프로세스 중에 종료가 발생하더라도 기존 AOF 파일에 명령이 계속 추가됩니다. 오래된 AOF 파일도 손실되지 않습니다. 새 AOF 파일이 생성되면 Redis는 이전 AOF 파일에서 새 AOF 파일로 전환하고 새 AOF 파일에 추가하기 시작합니다.

      4. AOF 파일은 데이터베이스에서 수행되는 모든 쓰기 작업을 Redis 프로토콜 형식으로 저장하므로 AOF 파일의 내용을 매우 쉽게 읽고 분석할 수 있습니다. 분석). 또한 매우 편안합니다. AOF 파일 내보내기도 매우 간단합니다. 예를 들어 실수로 _FLUSH ALL_(전체 Redis 서버의 데이터 지우기(모든 데이터베이스의 모든 키 삭제)) 명령을 실행했지만 AOF 파일을 덮어쓰지 않은 경우 그런 다음 서버를 중지하고 AOF 파일 끝에 있는FLUSHALL명령을 제거하고 Redis를 다시 시작하면FLUSHALL이 실행되기 전의 상태로 데이터 세트를 복원할 수 있습니다.

      AOF의 단점

      동일한 데이터 세트의 경우 일반적으로 AOF 파일의 크기가 RDB 파일의 크기보다 큽니다.

      사용된 fsync 전략에 따라 AOF는 RDB보다 느릴 수 있습니다. 일반적인 상황에서 초당 fsync 성능은 여전히 매우 높으며, fsync를 끄면 로드가 심한 경우에도 AOF가 RDB만큼 빨라질 수 있습니다.

      그러나 막대한 쓰기 로드를 처리할 때 RDB는 보다 보장된 최대 지연 시간을 제공할 수 있습니다.

      RDB와 AOF의 차이점

      RDB 지속성은 지정된 시간 간격 내에 메모리에 있는 데이터 세트의 스냅샷을 디스크에 쓰는 것을 의미합니다. 실제 작업 프로세스는 하위 프로세스를 포크한 후 먼저 데이터 세트를 쓰는 것입니다. 임시 파일이 성공적으로 기록되면 이전 파일이 바이너리 압축을 사용하여 교체 및 저장됩니다.

      AOF 지속성은 서버에서 처리되는 모든 쓰기 및 삭제 작업을 로그 형식으로 기록합니다. 기록은 텍스트 형식으로 추가됩니다. 파일을 열어 자세한 작업 기록을 볼 수 있습니다.

      RDB와 AOF 중 어느 것을 사용해야 하나요?

      데이터에 많은 관심을 갖고 있지만 여전히 몇 분 안에 데이터 손실을 감당할 수 있다면 RDB 지속성을 사용할 수 있습니다.

      AOF는 Redis가 실행하는 모든 명령을 디스크에 추가합니다. 대규모 쓰기를 처리하면 Redis의 성능이 저하됩니다.

      데이터베이스 백업 및 재해 복구:

      RDB 스냅샷을 정기적으로 생성하는 것은 데이터베이스 백업에 매우 편리하며 RDB는 AOF보다 빠르게 데이터 세트를 복원합니다.

      Redis는 RDB와 AOF를 동시에 열 수 있도록 지원합니다. 시스템이 다시 시작된 후 Redis는 AOF를 사용하여 데이터를 복구하는 데 우선순위를 부여하므로 데이터 손실이 최소화됩니다.

      AOF BGREWRITEAOF rewriting

      AOF는 파일 끝에 명령을 계속해서 추가하는 방식으로 작동하기 때문에 쓰기 명령의 개수가 계속 늘어나면 AOF 파일의 크기도 점점 커지게 됩니다.

      예를 들어

      카운터에서 INCR을 100번 호출한 경우 카운터의 현재 값만 저장하려면 AOF 파일에서 100개의 레코드(항목)를 사용해야 합니다.

      그러나 실제로는 SET 명령 하나만 사용해도 카운터의 현재 값을 저장하기에 충분하며 나머지 99개 레코드는 실제로 중복됩니다.

      이런 상황을 처리하기 위해 Redis는 흥미로운 기능을 지원합니다: 서비스 클라이언트를 중단하지 않고 AOF 파일을 재구성할 수 있습니다.

      BG REWRITE AOF명령을 실행하면 Redis는 현재 데이터 세트를 재구성하는 데 필요한 최소 명령이 포함된 새 AOF 파일을 생성합니다.BG REWRITE AOF命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的最少命令。

      Redis 2.2 需要自己手动执行BGREWRITEAOF

      Redis 2.2에서는 BGREWRITEAOF명령을 수동으로 실행해야 합니다. Redis 2.4에서는 자동으로 AOF 재작성을 트리거할 수 있으므로 2.4의 샘플 구성 파일을 참조하세요.

      Redis 데이터 백업

      디스크 오류, 노드 오류 및 기타 문제로 인해 데이터가 사라질 수 있으므로 백업하지 않는 것은 매우 위험합니다.

      Redis는 서버가 실행되는 동안 RDB 파일을 복사할 수 있기 때문에 데이터 백업에 매우 친숙합니다. RDB 파일이 생성되면 수정이 이루어지지 않습니다. 서버가 새 RDB 파일을 생성하려고 하면 먼저 파일 내용을 임시 파일에 저장합니다. 임시 파일이 작성되면 프로그램은 rename(2)을 사용하여 원본 RDB 파일을 임시 파일로 자동으로 바꿉니다.

      이는 언제든지 RDB 파일을 복사하는 것이 절대적으로 안전하다는 것을 의미합니다.

      다음은 제안 사항입니다

      :

      1. RDB 파일을 매시간 폴더에 백업하고 매일 RDB 파일을 다른 폴더에 백업하는 일반 작업(cron 작업)을 만듭니다.

      2. 스냅샷 백업에 해당 날짜 및 시간 정보가 있는지 확인하세요. 일반 작업 스크립트를 실행할 때마다 find 명령을 사용하여 만료된 스냅샷을 삭제하세요. 예를 들어 지난 48시간 동안의 시간별 스냅샷을 보관할 수 있습니다. 지난 한두 달 동안의 일일 스냅샷을 보관할 수도 있습니다.

      3. 적어도 하루에 한 번 데이터 센터 외부 또는 적어도 Redis 서버를 실행하는 물리적 머신 외부에 RDB를 백업하세요.

      더 많은 프로그래밍 관련 지식을 보려면프로그래밍 비디오

      를 방문하세요! !

위 내용은 RDB 및 AOF 지속성에 대한 간략한 분석, 장점과 단점은 무엇입니까? 선택하는 방법?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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