Redis 6 RC1 is out today

Salvatore Sanfilippo

Redis 6 RC1이 오늘 출시됐습니다

또 일이 일어났습니다. 새 Redis 버전이 릴리스 후보 상태에 도달했고, 몇 달 뒤면 대부분의 슈퍼마켓 매대에 오르게 됩니다. 아마 이번 버전은 지금까지 나온 Redis 중 가장 “엔터프라이즈”다운 버전일 겁니다. 정작 “엔터프라이즈”가 대체 무슨 뜻인지 이해하는 데 꽤 오랜 시간이 걸렸다는 점이 재미있습니다. 진심으로 싫어하는 단어인데, 나름의 의미는 있습니다. 이제 Redis는 어디에나 있고, 여전히 상당히 “축소”해서 사용할 수 있습니다. 지금도 Redis를 내려받아 30초 만에 컴파일하고, 아무런 설정 없이 실행해 바로 이것저것 만들어 볼 수 있습니다. 하지만 어디에나 존재한다는 것은 암호화나 ACL처럼 반드시 필요한 기능이 요구되는 환경에도 들어간다는 뜻입니다. 그래서 Redis는 필연적으로, 그리고 제 극단적인 단순성 추구에도 불구하고 저보다는 다른 사람들의 덕을 더 많이 보면서 이에 맞춰 변화했습니다.

그런데 흥미로운 점은 기능을 추가하는 일조차 매우 주관적인 방식으로 할 수 있다는 것입니다. Redis ACL은 다른 시스템에서 보던 것과 거의 닮지 않았고, SSL 지원은 코어를 최대한 깔끔하게 유지한다는 관점에서 가장 그럴듯한 아이디어를 최종적으로 선택하기까지 몇 차례에 걸쳐 작성되었습니다. 결과가 꽤 만족스럽습니다.

Redis 6에 추가된 것은 ACL과 SSL만이 아닙니다. 제가 아는 한 이번 버전은 지금까지 나온 Redis 중 가장 규모가 큰 릴리스이며, 가장 많은 사람이 참여한 릴리스이기도 합니다. 그러니 먼저 기여자들에게 감사의 뜻을 전하겠습니다. Redis 6은 누가 만들었을까요? 아래는 커밋 수를 기준으로 정리한 기여자 목록입니다. 커밋이 두 개 이상인 사람만 포함했고, 병합 커밋은 제외했습니다. 커밋 수는 형편없는 지표지만 제가 쉽게 생성할 수 있는 지표이기도 합니다. 다만 제 경우에는 여기저기서 자잘한 문제를 계속 고치기 때문에 커밋 수가 실제보다 많이 부풀려졌을 수 있습니다.

   685  antirez
    81  zhaozhao.zz
    76  Oran Agra
    51  artix
    28  Madelyn Olson
    27  Yossi Gottlieb
    15  David Carlier
    14  Guy Benoish
    14  Guy Korland
    13  Itamar Haber
     9  Angus Pearson
     8  WuYunlong
     8  yongman
     7  vattezhang
     7  Chris Lamb
     5  Dvir Volk
     5  [email protected]
     5  chendianqiang
     5  John Sully
     4  dejun.xdj
     4  Daniel Dai
     4  Johannes Truschnigg
     4  swilly22
     3  Bruce Merry
     3  filipecosta90
     3  youjiali1995
     2  James Rouzier
     2  Andrey Bugaevskiy
     2  Brad Solomon
     2  Hamid Alaei
     2  Michael Chaten
     2  Steve Webster
     2  Wander Hillen
     2  Weiliang Li
     2  Yuan Zhou
     2  charsyam
     2  hujie
     2  jem
     2  shenlongxing
     2  valentino
     2  zhudacai 00228490
     2  喜欢兰花山丘

위의 모든 분께 감사드립니다. 여러분, 정말 훌륭한 팀워크였습니다. 변경 로그에 기록된 새로운 기능 목록은 다음과 같습니다.

  • 새로운 모듈 API 다수 추가
  • 만료 주기 개선
  • SSL
  • ACL
  • RESP3
  • 클라이언트 측 캐싱
  • 스레드 기반 I/O
  • 복제본에서 디스크리스 복제
  • Redis-benchmark 클러스터 지원 및 Redis-cli 개선
  • Systemd 지원을 다시 작성
  • Redis 6과 함께 Redis Cluster 프록시 출시(단, 별도 저장소)
  • Redis 6과 함께 Disque 모듈 출시(단, 별도 저장소)

보시다시피 큰 변화가 많습니다. 그중 몇 가지를 골라 간단히 이야기해 보겠습니다.

RESP3

10년이 지나 새 프로토콜이 필요해졌습니다. 이 글에서 자세히 이야기한 적이 있습니다(http://antirez.com/news/125). 하지만 이후 생각을 바꿨기 때문에 Redis 6의 RESP3 프로토콜은 “옵트인” 방식입니다. 연결은 RESP2 모드로 시작하고, 새로운 HELLO 명령으로 핸드셰이크를 수행한 경우에만 새 프로토콜 모드로 들어갑니다.

왜 새 프로토콜이 필요했을까요? 기존 프로토콜은 의미론이 충분히 풍부하지 않았기 때문입니다. RESP3에는 다른 기능들도 있지만, 핵심 아이디어는 Redis에서 복잡한 데이터 형식을 직접 반환할 수 있게 하는 것입니다. 클라이언트가 Redis가 반환하는 평면 배열을 어떤 형식으로 변환해야 하는지, 제대로 된 불리언 값 대신 반환된 숫자를 어떻게 처리해야 하는지 등을 알 필요가 없어집니다.

RESP3는 지원되는 유일한 프로토콜이 아니므로 도입 속도는 예상보다 느릴 것 같습니다. 하지만 어쩌면 결과적으로 나쁜 일은 아닐지도 모릅니다. 적응할 시간이 생길 테니까요.

ACL

Redis ACL을 소개하는 가장 좋은 방법은 ACL 문서 자체를 보여주는 것입니다(https://redis.io/topics/acl). 물론 막판에 변경된 내용을 반영하려면 문서를 조금 업데이트해야 할 것 같습니다. 그러니 여기서는 도입 동기를 이야기하는 편이 더 흥미롭겠습니다. 규모가 큰 환경에서는 어떤 클라이언트가 어떤 작업을 수행할 수 있는지 더 잘 제어해야 하므로 ACL이 필요합니다. 하지만 Redis에 ACL을 추가한 또 하나의 중요한 이유는 애플리케이션 버그로부터 데이터를 보호하기 위한 격리였습니다. 작업자가 BRPOPLPUSH만 실행할 수 있다면, 새로 들어온 개발자가 디버깅을 위해 추가한 FLUSHALL이 실수로 운영 코드에 남아 5시간 동안 악몽을 만들어 내는 일이 일어날 가능성은 줄어듭니다.

Redis의 ACL은 운영 측면에서도, 성능 측면에서도 비용이 들지 않습니다. ACL을 사용하지 않는다면 지원된다는 사실조차 알 필요가 없고, 성능 오버헤드도 측정할 수 없을 정도로 작습니다. ACL을 제공하는 것은 좋은 거래라고 생각합니다. 보너스로 이제 Redis 모듈 인터페이스에서도 ACL을 사용할 수 있으므로 사용자 지정 인증 방식을 작성할 수 있습니다.

SSL

2019년이고, 거의 2020년이며, 새로운 규정도 생겨나고 있습니다. 문제는 이를 제대로 구현하는 일이었습니다. 그리고 제대로 구현하려면 먼저 잘못 구현해 보고, 한계를 이해한 다음, Redis 연결을 추상화해야 했습니다. 이 작업은 전부 제 도움 없이 진행되었습니다. 최근 Redis 개발 프로세스가 얼마나 달라졌는지 보여주는 대목입니다.

클라이언트 측 캐싱

이 기능에 대해서는 여기에서 글을 쓴 적이 있습니다(http://antirez.com/news/130). 하지만 지금으로서는 Redis 6에서 가장 미숙한 기능이라고 생각합니다. 서버가 클라이언트 측 값 캐싱을 도와줄 수 있다는 점은 멋지지만, Redis 6 GA가 출시되기 전에 이 기능을 개선하고 싶습니다. 특히 서버가 클라이언트에 대한 상태를 전혀 유지하지 않거나 아주 조금만 유지하도록 하고, 대신 더 많은 메시지를 주고받는 새로운 모드를 추가하면 매우 좋을 것 같습니다. 게다가 현재는 특정 “캐시 슬롯”을 만료시키는 메시지들을 하나로 묶어 컴파일할 수도 없습니다. 1월에 이 기능과 관련해 더 작업해야 하지만, 좋은 기능이 될 것입니다.

모듈로 제공되는 Disque

드디어 해냈습니다 :-) https://github.com/antirez/disque-module 결과가 매우 만족스럽습니다. Disque를 모듈로 구현하면서 현재 Redis 모듈 시스템이 얼마나 강력한지 잘 드러났습니다. 클러스터 메시지 버스 API, 클라이언트를 차단하고 재개하는 기능, 타이머, 모듈 전용 데이터에 대한 AOF 및 RDB 제어까지 지원합니다. Disque가 무엇인지 모른다면 저장소를 확인해 보세요. README가 꽤 자세합니다.

Cluster Proxy

동료인 Fabio가 이 Redis Cluster 프록시를 몇 달 동안 작업했습니다. https://github.com/artix75/redis-cluster-proxy Redis Cluster 지원에 관해서는 클라이언트 생태계가 매우 파편화되어 있기 때문에, 저는 오래전부터 이런 프록시가 나오기를 바랐습니다. 이제 여러 흥미로운 작업을 수행할 수 있는 프록시가 생겼습니다. 아직 개발 중인 상태입니다. 가장 중요한 기능은 클라이언트가 단일 인스턴스와 통신하는 것처럼 Redis Cluster를 추상화하는 것입니다. 또 하나는 적어도 간단한 명령과 기능만 사용하는 클라이언트라면 멀티플렉싱을 수행하는 것입니다. 차단 작업이나 트랜잭션을 수행해야 할 때는 프록시가 해당 클라이언트를 위해 별도의 연결 집합을 할당합니다. 프록시는 완전히 스레드 기반이기도 하므로, CPU 시간을 대부분 I/O에 사용한다면 CPU 사용률을 극대화하는 좋은 방법이 될 수 있습니다. 상태는 프로젝트 README에서 확인하고 직접 사용해 보세요!

모듈

Redis 6에서 모듈 API는 완전히 새로운 수준에 도달했습니다. 모듈은 Redis 역사상 가장 빠르게 성숙한 부분 중 하나입니다. Redis Labs가 첫날부터 모듈 시스템을 사용해 단순한 예제가 아니라 매우 복잡한 기능을 개발해 왔기 때문입니다. 얼마 전 Disque 포팅을 시작했는데, 이 작업 역시 모듈 시스템에 새로운 기능을 추가하는 계기가 되었습니다. 그 결과 Redis는 모든 것을 처음부터 발명하지 않고도 시스템을 모듈로 작성할 수 있는 진정한 프레임워크가 되었습니다. BSD 라이선스를 사용하므로 시스템을 작성할 수 있는 개방형 플랫폼이기도 합니다.

내부 구현

Redis 내부 구현에도 수많은 개선이 이루어졌습니다. 명령을 복제하는 방식이 상당히 달라졌고, 만료 처리는 이제 더 빠르고 캐시 친화적인 새로운 알고리즘을 사용합니다.

현재 상태와 출시 예정일

오늘 RC1 단계에 들어갔고, 3월 말이나 늦어도 5월쯤에는 GA 버전이 준비되기를 바랍니다. 현재 Redis 6은 충분히 테스트할 수 있는 상태이며 버그를 만날 가능성도 매우 낮습니다. 하지만 코드가 크게 바뀌었고, 새로운 기능들은 아직 아무도 운영 환경에서 실행해 보지 않은 새 코드로 구성되어 있습니다. 그러니 문제가 발생하면 이슈 시스템에 보고해 주세요. 무슨 일이 일어났는지 최대한 자세히 설명해 주시기 바랍니다.

이번 릴리스를 가능하게 해 주신 모든 분께 감사드립니다. 앞으로 몇 달 동안 이 버전을 매우 안정적인 상태로 만들기 위해 함께 작업해 주실 분들께도 감사드립니다.

아, 거의 잊을 뻔했네요! 다음은 버전 6을 위한 LOLWUT 명령의 인터랙티브 아트입니다.

실행할 때마다 무작위로 생성된 서로 다른 풍경이 표시됩니다.

원문은 Salvatore Sanfilippo님이 에 게재했습니다.

이 글은 gpt-5.6-terra 모델을 사용해 번역했습니다.