Redis는 데이터를 메모리에 저장하며 프로세스가 종료되면 데이터가 손실됩니다. Redis의 지속성 메커니즘을 통해 메모리의 데이터를 디스크에 저장할 수 있으며, 디스크 파일에서 데이터를 로드하여 다시 시작한 후 메모리를 다시 채울 수 있습니다.
Redis는 전체 미러 RDB와 증분 지속성 AOF라는 두 가지 지속성 메커니즘을 지원합니다.
RDB는 만료되지 않은 모든 키-값 쌍을 Redis에 저장하는 Redis의 스냅샷입니다.
redis.conf
에서 RDB를 구성하세요:redis.conf
中配置RDB:
dbfilename dump.rdb dir /var/lib/redis save 900 1 save 300 10 save 60 10000 save "" stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes
每次redis进程启动时会先检查rdb文件是否存在,若存在则将文件中的内容加载到内存中。
redis自动更新RDB文件时会fork一个子进程执行快照保存工作,在保存期间主进程可以正常的提供服务。
我们同样可以通过指令保存快照:
save
: 以阻塞的方式保存快照,保存期间redis不能处理其它请求
bgsave
: fork一个子进程完成保存工作,保存期间不会影响redis的正常服务。
lastsave
命令可以得到最新的RDB文件创建时间戳,可以用来检查保存是否成功。
RDB作为数据库快照,每次创建都需要将整个数据库写入到文件。这是一个非常耗时的操作,因此也难以频繁进行,在出现异常时可能丢失大量数据。
Redis提供了增量式持久化工具AOF(Append Only ile), AOF通过记录Redis数据库中所有写指令进行持久化。AOF文件中以Redis通信协议的格式存储指令。
当Redis进程启动时会检查AOF文件是否存在,若存在则依次执行AOF中的指令恢复数据。
Redis每次执行写指令时都会向AOF文件中添加一条日志,但新的记录不会立即写入磁盘(fsync)而是缓存在写入缓冲区中。
我们可以配置将缓冲区中的数据写入磁盘的策略,避免数据丢失。
将缓冲区中数据写入磁盘是一个耗时操作,频繁写磁盘会对性能造成影响但是Redis崩溃丢失数据也较少,因此我们需要根据应用场景进行权衡。
AOF中可能会记录多余的指令,若我们对同一个key执行了100次set指令, AOF文件中就会有100条记录但只仅保留最后一条set指令即可恢复数据。AOF重写会整理AOF文件清理不必要的指令日志(如删除被覆盖的set指令),减少AOF文件大小。
redis 采用后台重写的策略,即 fork 一个子进程把整理后的 AOF 写入到临时文件中。使用BGREWRITEAOF
可以手动触发后台重写操作。
实际上AOF重写不会读取原来的AOF文件,子进程会带有一份当前数据的副本,并根据该副本直接生成新的AOF文件。
主进程在重写期间将新增的写操作写入原来的 AOF文件 和 AOF重写缓存 中,即使重写失败原来的AOF文件仍保存了完整的数据。当子进程完成AOF重写后会向主进程发送信号,主进程收到该信号后会将AOF重写缓存中的内容写入新的AOF文件,然后用新的AOF文件覆盖原有文件。
在redis.conf
appendonly yes appendfilename appendonly.aof appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
save
: 스냅샷을 차단 방식으로 저장합니다. Redis는 다른 것을 처리할 수 없습니다. 요청 중 저장 🎜bgsave
: 저장 작업을 완료하기 위해 하위 프로세스를 포크합니다. Redis의 일반적인 서비스는 저장 기간 동안 영향을 받지 않습니다. 🎜lastsave
명령은 저장 성공 여부를 확인하는 데 사용할 수 있는 최신 RDB 파일 생성 타임스탬프를 가져올 수 있습니다. 🎜🎜RDB는 데이터베이스 스냅샷이며, 생성될 때마다 전체 데이터베이스를 파일에 작성해야 합니다. 이는 시간이 많이 걸리는 작업이므로 자주 수행하기 어렵고, 예외가 발생하면 많은 양의 데이터가 손실될 수 있습니다. 🎜🎜Redis는 증분 지속성 도구 AOF(Append Only ile)를 제공합니다. AOF는 Redis 데이터베이스에 모든 쓰기 명령을 기록하여 지속성을 수행합니다. 지침은 Redis 통신 프로토콜 형식으로 AOF 파일에 저장됩니다. 🎜🎜Redis 프로세스가 시작되면 AOF 파일이 있는지 확인하고, 존재하는 경우 AOF의 명령을 순차적으로 실행하여 데이터를 복원합니다. 🎜🎜Redis는 쓰기 명령을 실행할 때마다 AOF 파일에 로그를 추가하지만 새 레코드는 디스크에 즉시 기록되지 않고(fsync) 쓰기 버퍼에 캐시됩니다. 🎜🎜데이터 손실을 방지하기 위해 버퍼의 데이터를 디스크에 쓰는 전략을 구성할 수 있습니다. 🎜🎜버퍼의 데이터를 디스크에 쓰는 작업은 시간이 많이 걸리는 작업입니다. 디스크에 자주 쓰면 성능에 영향을 주지만 Redis는 충돌하고 데이터 손실이 적으므로 애플리케이션 시나리오에 따라 절충해야 합니다. 🎜🎜중복된 명령이 AOF에 기록될 수 있습니다. 동일한 키에 대해 설정 명령을 100번 실행하면 AOF 파일에 100개의 레코드가 있지만 데이터를 복구하기 위해 마지막 설정 명령만 유지됩니다. AOF 재작성은 AOF 파일을 구성하고 불필요한 명령 로그를 정리하며(예: 덮어쓴 설정 명령 삭제) AOF 파일 크기를 줄입니다. 🎜🎜redis는 백그라운드 재작성 전략을 채택합니다. 즉, 정렬된 AOF를 임시 파일에 쓰기 위해 하위 프로세스를 포크하는 것입니다. 백그라운드 재작성 작업을 수동으로 트리거하려면 BGREWRITEAOF
를 사용하세요. 🎜🎜실제로 AOF 재작성은 원본 AOF 파일을 읽지 않습니다. 하위 프로세스는 현재 데이터의 복사본을 가지며 복사본을 기반으로 새 AOF 파일을 직접 생성합니다. 🎜🎜기본 프로세스는 다시 쓰기 기간 동안 원본 AOF 파일과 AOF 다시 쓰기 캐시에 새 쓰기 작업을 씁니다. 다시 쓰기가 실패하더라도 원본 AOF 파일은 여전히 전체 데이터를 저장합니다. 하위 프로세스가 AOF 재작성을 완료하면 메인 프로세스에 신호를 보냅니다. 신호를 받은 후 메인 프로세스는 AOF 재작성 캐시의 내용을 새 AOF 파일에 쓴 다음 원본 파일을 새 파일로 덮어씁니다. AOF 파일. 🎜🎜redis.conf
에서 AOF 구성:🎜rrreee🎜Redis는 시작 시 또는 마지막 재작성 후 AOF 파일의 크기를 기록합니다. 새 데이터의 크기가 원래 크기의 100%에 도달합니다. (auto -aof-rewrite-percentage 구성)은 재작성을 트리거합니다. 🎜🎜다시 쓰기 작업은 현재 AOF 파일 크기가 auto-aof-rewrite-min-size보다 큰 경우에만 수행됩니다. 그렇지 않으면 새 데이터의 양이 지정된 비율을 초과하더라도 다시 쓰기가 수행되지 않습니다. 이렇게 하면 원본 파일이 너무 작아서 초기에 자주 다시 쓰는 문제를 피할 수 있습니다. 🎜위 내용은 Redis 지속성 메커니즘 분석 예시의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!