컴퓨터 지식 네트워크 - 컴퓨터 구성 - Redis 메모리가 가득 차면 어떡하죠?

Redis 메모리가 가득 차면 어떡하죠?

오랫동안 Redis 를 캐시하면 언젠가는 Redis 의 메모리가 가득 찰 것이다. 어떻게 처리할까요?

-응?

Redis 구성 파일 redis.conf 파일에서 maxmemory 의 크기 매개 변수는 다음과 같이 구성됩니다.

-응?

-응?

실제 스토리지가 Redis 의 구성 매개변수 크기를 초과하는 경우 Redis 에는 제거해야 할 키를 제거하고 새 키 값에 대한 깨끗한 메모리를 정리하는 제거 정책이 있습니다.

-응?

Redis 는 6 가지 제거 정책을 제공합니다. 그 중 기본값은 noeviction 입니다. 이 6 가지 정책 중 제거 정책은 다음과 같습니다.

-응?

-응?

-응?

LRU (최근 가장 적게 사용됨) 는 최근에 가장 적게 사용된 키, 즉 최근에 가장 적게 액세스된 키를 나타냅니다. 이 알고리즘은 데이터의 기록 액세스 기록을 기준으로 데이터를 삭제합니다.

-응?

핵심 아이디어는 키 값이 최근에 거의 사용되지 않으면 앞으로도 거의 액세스되지 않는다는 것입니다.

-응?

사실 Redis 가 구현한 LRU 는 실제 LRU 알고리즘이 아닙니다. 즉, 명목상 LRU 알고리즘을 사용하여 키를 제거하지만 실제로 제거된 키가 반드시 가장 긴 것은 아닙니다.

-응?

Redis 는 대략적인 LRU 알고리즘을 사용하여 무작위로 수집되는 방식으로 키를 제거하고 한 번에 5 개의 키를 임의로 선택한 다음 가장 최근에 가장 적게 사용된 키를 제거합니다.

-응?

여기서 5 개의 키는 기본 숫자일 뿐, 다음 그림과 같이 구성 파일에서도 구성할 수 있습니다.

-응?

-응?

근사치 LRU 알고리즘이 크면 실제 LRU 알고리즘에 더 가까워집니다. 값이 클수록 데이터가 완전하며 제거된 데이터는 최근에 가장 적게 사용된 데이터에 더 가깝다는 것을 알 수 있습니다.

-응?

그런 다음 시간별 LRU 알고리즘을 구현하기 위해 Redis 는 키당 3 바이트의 시간을 저장하기 위해 키당 추가 메모리 공간을 추가해야 합니다.

-응?

Redis 3.0 에서는 대략적인 LRU 알고리즘이 최적화되어 16 크기의 후보 풀 메모리를 Redis 에서 유지합니다.

-응?

처음으로 무작위로 샘플링 데이터를 추출하면 데이터가 후보 풀에 배치되고 후보 풀의 데이터는 시간순으로 정렬됩니다.

-응?

데이터를 두 번째로 선택하면 후보 풀에서 최소 시간 미만의 데이터만 후보 풀에 배치됩니다.

-응?

어느 시점에서 후보 풀의 데이터가 가득 차면 가장 긴 키가 후보 풀에서 돌출됩니다. 퇴출 시 후보 풀에서 가장 최근 방문 시간이 가장 짧은 키를 직접 선택하여 탈락한다.

-응?

무작위로 선택된 샘플의 최소 시간이 실제 최소 시간이 아닐 수 있으므로 가장 최근에 가장 적게 액세스된 것처럼 보이는 키 값을 선택하여 올바르게 제거하는 것이 목적입니다.

-응?

그러나 LRU 알고리즘에는 한 가지 단점이 있습니다. 키 값은 이전에 액세스되지 않았지만 최근에 액세스되면 열 데이터로 간주되어 제거되지 않습니다.

-응?

그러나 일부 데이터는 이전에 자주 액세스되었지만 최근에는 이러한 데이터가 제거되어 핫스팟 데이터의 오판과 제거가 발생할 수 있습니다.

-응?

Redis 4.0 에서 LRU 알고리즘 외에 새로운 LFU 알고리즘이 추가된다면 LFU 알고리즘은 무엇입니까?

-응?

-응?

LFU(Least frequency Used) 는 최근 자주 사용된 키워드, 즉 최근 기간 동안 자주 액세스되는 키워드로, 최근 기간 동안 액세스된 횟수를 기준으로 합니다.

-응?

핵심 아이디어는 최근 키 방문 빈도에 따라 방문 횟수가 적은 키를 먼저 제거하고 그 반대의 경우도 마찬가지라는 것이다.

-응?

LFU 알고리즘은 키의 인기도를 반영하며, LRU 알고리즘이 가끔 한 번 액세스되기 때문에 인기 있는 데이터로 간주되지 않습니다.

-응?

LFU 알고리즘은 가변성 -LFU 정책 및 allkeys-lfu 정책을 지원합니다.

-응?

-응?

Redis 에는 세 가지 삭제 작업이 있습니다. 이 전략은 다음과 같습니다.

-응?

-응?

Redis 를 고수하는 방법에는 RDB 와 AOF 의 두 가지가 있습니다.

-응?

RDB 에서 메모리에 있는 특정 시점의 데이터 복제본은 스냅샷으로 획득됩니다. RDB 파일을 작성할 때 save 및 bgsave 명령을 사용하여 RDB 파일을 작성할 수 있습니다.

-응?

두 명령 모두 만료된 키를 RDB 파일에 저장하지 않으므로 만료된 키를 삭제하는 효과를 얻을 수 있습니다.

-응?

Redis 를 시작할 때 RDB 파일을 로드하면 마스터 서버는 만료된 키를 로드하지 않고 슬레이브 서버는 만료된 키를 로드합니다.

-응?

AOF 모드에서 Redis 는 재작성을 위한 최적화 조치를 제공하며, 각각 REWRITEAOF 및 BGREWRITEAOF 명령을 실행합니다. 두 명령 모두 AOF 파일에 만료된 키를 쓰지 않으며 만료된 키를 삭제할 수 있습니다.

-응?

-응?

RDB 는 특정 시점의 Redis 메모리 데이터를 하드 디스크의 파일에 저장하는 스냅샷 저장 지속성 방법입니다. 기본적으로 저장된 파일 이름은 dump.rdb 이며 Redis 서버가 시작될 때 dump.rdb 파일의 데이터가 메모리로 다시 로드되어 데이터를 복원합니다.

-응?

RBD 지속 모드 켜기

-응?

Rdb 지속성을 시작하는 방법은 간단합니다. 클라이언트는 Redis 서버에 save 또는 bgsave 명령을 전송하여 서버에서 RDB 파일을 생성하거나 서버 구성 파일을 통해 RDB 트리거 조건을 지정할 수 있습니다.

-응?

-응?

저장 명령은 동기화 작업입니다.

-응?

-응?

-응?

클라이언트가 영구 유지를 위해 서버에 저장 명령을 보내면 서버는 데이터 동기화가 완료될 때까지 명령을 저장한 후 다른 클라이언트의 요청을 차단합니다.

-응?

-응?

Save 명령과 달리 bgsave 명령은 비동기 작업입니다.

-응?

-응?

-응?

-응?

-응?

-응?

-응?

클라이언트 전송 서비스가 bgsave 명령을 실행하면 Redis 서버의 주 프로세스가 하위 프로세스를 분할하여 데이터 동기화 문제를 해결합니다. 데이터를 RDB 파일에 저장하면 하위 프로세스가 종료됩니다.

-응?

따라서 Redis 서버는 bgsave 를 처리할 때 save 명령과 비교할 때 하위 스레드 쓰기 IO 를 사용합니다. 기본 프로세스는 여전히 추가 요청을 수신할 수 있지만 forks 하위 프로세스는 동기화되므로 forks 하위 프로세스는 추가 요청을 수신할 수 없습니다. 즉, fork 하위 프로세스에 시간이 오래 걸리면 (일반적으로 매우 빠름) bgsave 가 발생합니다

-응?

-응?

클라이언트를 통해 명령을 보내는 것 외에도 RDB 지속성을 트리거하는 조건을 Redis 구성 파일에 저장할 수 있습니다 (예: 몇 초 이내에 최소한 몇 개의 쓰기 작업에 도달할 때 RDB 데이터 동기화 시작).

-응?

예를 들어 구성 파일 redis.conf 에 다음 옵션을 지정할 수 있습니다.

-응?

-응?

그런 다음 서버 시작 시 구성 파일을 로드합니다.

-응?

-응?

서버 구성 파일을 통해 RDB 를 트리거하는 이 방법은 bgsave 명령과 유사합니다. 트리거 조건이 충족되면 forks 의 하위 프로세스가 데이터를 동기화합니다. 하지만 이렇게 RDB 지속성을 트리거하지 않는 것이 좋습니다. 트리거 시간이 너무 짧으면 RDB 파일을 자주 쓰기 쉽고 서버 성능에 영향을 미치며 시간 설정이 너무 길면 데이터 손실이 발생할 수 있기 때문입니다.

-응?

-응?

이 문서에서는 서버가 RDB 파일을 생성하는 세 가지 방법 (기본 프로세스 생성 또는 하위 프로세스 생성) 에 대해 설명합니다. 프로세스는 다음과 같습니다.

-응?

-응?

-응?

-응?

-응?

Redis 의 또 다른 영구 방법인 AOF (첨부 파일만).

-응?

RDB 가 특정 시점의 스냅샷을 저장하는 것과 달리 aof 는 클라이언트에서 서버로 모든 쓰기 명령을 영구적으로 기록하고 Redis 프로토콜의 접미사가 있는 aof 파일 끝에 저장합니다. Redis 서버가 재시작되면 AOF 파일 명령을 로드하고 실행하여 데이터를 복구합니다.

-응?

-응?

Redis 는 기본적으로 AOF 지속성을 사용하지 않습니다. 구성 파일에서 이 기능을 활성화하고 다음 redis.conf 파일과 같이 보다 상세하게 구성할 수 있습니다.

-응?

-응?

-응?

위 프로필에서는 appendfsync 옵션을 통해 쓰기 정책을 지정할 수 있으며 세 가지 옵션이 있습니다.

-응?

-응?

-응?

이 정책은 클라이언트의 각 쓰기 작업이 aof 파일에 저장될 때 안전하지만 각 쓰기 요청에는 입출력 작업이 있어 속도가 느립니다.

-응?

-응?

Appendfsync 의 기본 쓰기 정책은 1 초에 한 번 aof 파일을 쓰는 것이므로 최대 1 의 데이터가 손실될 수 있습니다.

-응?

-응?

Redis 서버는 aof 에 쓸 책임이 없지만 운영 체제는 aof 파일에 쓸 시기를 처리합니다. 더 빠르지만 가장 안전하지 않은 선택이니 추천하지 않습니다.

-응?

-응?

Aof 는 클라이언트의 각 쓰기를 AOF 파일의 끝에 추가합니다 (예: 키를 여러 번 실행하는 incr 명령). 이때 aof 는 aof 파일의 각 명령을 저장하고 aof 파일은 매우 커집니다.

-응?

-응?

Aof 파일이 너무 커서 aof 파일을 로드하여 데이터를 복구할 때 속도가 매우 느립니다. 이 문제를 해결하기 위해 Redis 는 aof 파일 재작성을 지원합니다. Aof 를 다시 작성하면 이전 예제의 많은 명령과 같이 현재 데이터를 복구하는 데 사용되는 최소 명령 세트를 생성할 수 있습니다. 이 명령은 다음과 같이 다시 쓸 수 있습니다.

-응?

-응?

-응?

Redis.conf 구성 파일의 no-appendfsync-on-rewrite 옵션을 통해 덮어쓰기 설정 여부를 설정할 수 있습니다. 이 방법은 매번 fsync 를 다시 작성하여 서버 성능에 영향을 주므로 기본값은 no 이므로 권장하지 않습니다.

-응?

-응?

클라이언트가 서버에 bgrewriteaof 명령을 보내거나 서버에서 aof 를 다시 작성할 수 있습니다.

-응?

-응?

Aof 재작성은 비동기 작업이기도 합니다. 즉, AOF 파일을 작성하려는 경우 다음과 같이 Redis 주 프로세스가 forks 하위 프로세스에 의해 처리됩니다.

-응?

-응?

-응?

-응?

-응?

-응?

Aof 로그 파일을 쓸 때 Redis 서버가 종료되면 aof 로그 파일에 형식 오류가 발생합니다. Redis 서버가 재시작되면 Redis 서버는 이 aof 파일 로드를 거부합니다. 다음 단계를 수행하여 aof 를 복구하고 데이터를 복원할 수 있습니다.

-응?

-응?

-응?

AOF 는 로그 파일만 추가하므로 서버 성능에 미치는 영향이 적고 RDB 보다 빠르며 메모리 소모가 적습니다.

-응?

-응?

-응?

우리는 여러 방면에서 RDB 와 AOF 를 비교할 수 있다. 응용 프로그램에서는 실제 필요에 따라 RDB 또는 AOF 를 선택해야 합니다. 사실, 데이터가 충분히 안전하기를 원한다면 두 가지 방법을 모두 열 수 있지만, 두 가지 영구적인 방식 모두 IO 작업이 서버 성능에 심각한 영향을 미칠 수 있기 때문에 때때로 선택을 해야 할 때가 있습니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), 안전명언)

-응?

-응?

RDB 와 AOF 가 모두 열리면 Redis 는 AOF 로그를 사용하여 데이터를 복구합니다. AOF 는 RDB 파일보다 더 완전한 파일을 저장하기 때문입니다.

上篇: oppo 휴대폰의 헤드셋 설정은 어디에 있나요? 下篇: UC 브라우저 동영상을 iOS 시스템에서 볼 수 없습니다
관련 내용