Redis 이모저모 (1) Expire
잊혀질 권리
들어가기 전에
레디스의 라이센스가 BSD 3-Clause에서 RSALv2, SSPLv.1로 변경되었다는 소식을 들었다(dual license). 레디스 공식 홈페이지에서 설명하기로 새로이 생긴 차이점은 레디스를 managed service로서 상업적 목적으로 사용할 수 없으며, 라이센스나 저작권 등의 표시를 제거할 수 없다는 것이다. 사실 이 dual licensing은 2022년부터 시행되고 있었고, 이번에 모든 무료 제품으로 확대하게 된 것이라고 한다.
대부분의 사용자들에게 영향은 없지만, 레디스와 직접적인 경쟁관계에 있는 서비스를 제공하는 경우 새로운 버전의 레디스 코드를 사용하는 것에 제약이 생긴다는 것 같다. 경쟁적 제공이란, 레디스 코드 기반으로 파생되어 레디스와 주요 기능이 겹치는 제품 혹은 서비스를 의미한다. 여기까지만 들어도 아, 클라우드 서비스 때문이구나 싶은 생각이 든다. 이전에 elasticsearch vs opensearch 사례에서도 볼 수 있듯이 결국 오픈 소스의 수익 모델이 문제가 되는 것 같다. 이제 더 이상 엄밀한 기준에서 오픈소스가 아니게 되긴 했지만, 공식 보도자료에서 이전 버전의 레디스를 사용하는 경우 여전히 BSD 3-Clause 라이센스로 사용할 수 있고, 수익화보다 기술의 발전에 이바지하고자 한다고 명시한 걸 보면 오픈 소스의 근본은 유지하려고 노력하는 것 같다.
궁금한 점은 보통 클라우드 서비스가 제공하는 레디스와 같은 in memory db는 레디스 코드를 사용하면서도 사용료를 지불하지 않고 사용하는 걸까? 아니면 내부 구현 자체가 아예 다른 것인지 궁금하다. memcached나 redis와 seamless하게 연동되는 걸 보면 코드 베이스 자체가 아주 다를 것 같진 않은데..
Expire
넋두리가 길었다. 아무튼 레디스 문서 이것저것 찾아보다 Expire를 어떻게 다루는가 궁금해져서 찾아봤다. 잡다한 설명을 뛰어넘고 궁금했던 것, 그러니까 어떻게 expire 하나 찾아보면 크게 두 가지 방법으로 수행한다.
- 수동적 방법 (passive way)
- 어떤 클라이언트가 expire 설정된 키에 접근하면, 그 때 만료 여부를 판단하고 만료시 삭제한다.
- 만료 설정된 키에 두 번 다시 접근을 하지 않는 경우, 메모리만 차지하는 키가 된다.
- 능동적 방법 (active way)
- expire set에 속한 키들을 상대로 아래의 과정을 주기적으로 반복한다 (대략 1초에 10번)
- 20개의 랜덤한 키를 골라 만료 여부를 판단한다.
- 만료된 키를 제거한다.
- 만약 선택한 키의 25% 이상이 만료처리 되면, 맨 위로 돌아가 반복한다.
- 미만이라면 더 이상 반복하지 않는다.
- 확률 알고리즘에 기반한 단순한 처리로, 기본적으로 선택된 샘플이 충분히 전체 키의 대표성을 가지고 있다고 가정한다.
- 이 방법을 사용하면 만료되었지만 아직 메모리에 올라와있는 키의 최대 크기가 초당 쓰기 명령의 최대 25% 정도라는 것을 보장할 수 있다.
- expire set에 속한 키들을 상대로 아래의 과정을 주기적으로 반복한다 (대략 1초에 10번)
뱀다리
- 키가 Expire 되면, AOF 파일을 포함해 연결된 모든 레플리카에 DEL 명령이 추가된다고 한다. 즉, 위의 만료 프로세스는 마스터 인스턴스에서만 돌아가고 레플리카는 마스터의 DEL 명령을 기다리는 꼴이 된다.
- 마이그레이션 하는 경우 두 컴퓨터(원본, 대상)의 time clock을 맞추는 것이 중요하다고 한다.