Redis 6 RC1 오늘 출시
원문은 Salvatore Sanfilippo님이 에 게재했습니다. 이 블로그 구독하기
또다시 그런 일이 일어났다. 새로운 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
- 개선된 expire 사이클
- SSL
- ACL
- RESP3
- 클라이언트 사이드 캐싱
- Threaded I/O
- 레플리카에서의 Diskless replication
- Redis-benchmark 클러스터 지원 + Redis-cli 개선
- Systemd 지원 재작성
- Redis Cluster proxy가 Redis 6와 함께 릴리스됨(별도 저장소)
- Disque 모듈이 Redis 6와 함께 릴리스됨(별도 저장소)
보시다시피 굵직한 기능들이 많다. 그중 몇 가지를 골라 간략히 이야기해 보겠다.
RESP3
10년 만에 새로운 프로토콜이 필요했다. 여기에 대해서는 http://antirez.com/news/125에서 길게 이야기한 적이 있는데, 이후 생각을 바꿨다. 그래서 Redis 6의 RESP3 프로토콜은 “opt-in” 방식이다. 연결은 RESP2 모드로 시작하고, 새로운 HELLO 명령으로 핸드셰이크를 해야만 새 프로토콜 모드로 진입한다.
왜 새로운 프로토콜이 필요한가? 기존 프로토콜은 의미론적으로 충분히 풍부하지 않았기 때문이다. RESP3에는 다른 기능들도 있지만, 핵심 아이디어는 평면적인 배열이나 제대로 된 불리언 값 대신 숫자로 반환되던 것들을 클라이언트가 어떤 타입으로 변환해야 할지 알 필요 없이, Redis에서 복잡한 데이터 타입을 직접 반환할 수 있게 하는 것이었다.
RESP3가 유일하게 지원되는 프로토콜이 아닌 만큼 도입 속도는 예상보다 느릴 것으로 보지만, 어쩌면 그게 나쁜 일만은 아닐지도 모른다. 적응할 시간이 생길 테니까.
ACL
Redis ACL에 대한 가장 좋은 입문서는 ACL 문서 자체다(https://redis.io/topics/acl). 물론 마지막 순간의 변경 사항을 반영하려면 약간의 업데이트가 필요할 수도 있다. 그래서 여기서는 동기에 대해 이야기하는 것이 더 흥미롭다. Redis에 ACL이 필요했던 이유는 더 큰 환경에서 사람들이 특정 작업을 수행할 수 있는 클라이언트를 더 잘 제어하기 위해 ACL이 필요했기 때문이다. 하지만 Redis에 ACL을 추가한 또 다른 핵심 이유는 애플리케이션 버그로부터 데이터를 보호하기 위한 격리였다. 워커가 BRPOPLPUSH만 수행할 수 있다면, 새로 온 개발자가 디버깅용으로 추가한 FLUSHALL이 실수로 프로덕션 코드에 들어가 5시간짜리 악몽을 만드는 일이 일어날 가능성은 낮아진다.
Redis의 ACL은 공짜다. 운영 측면에서는 사용하지 않는다면 지원 여부조차 알 필요 없이 넘어갈 수 있고, 성능 측면에서도 오버헤드가 측정 불가능할 정도이기 때문이다. 꽤 괜찮은 거래라고 생각한다. 보너스로 이제 ACL용 Redis 모듈 인터페이스가 있어서 커스텀 인증 방식을 직접 작성할 수도 있다.
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 proxy 작업을 했다: 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는 시스템을 작성하기 위한 진정한 개방형 플랫폼이다.
내부 구조
Redis 내부에도 수많은 개선이 있었다. 명령이 복제되는 방식이 상당히 바뀌었고, expire는 이제 더 빠르고 캐시 친화적인 다른 알고리즘을 사용한다.
현황 및 출시 일정
오늘 우리는 RC1을 냈고, 3월 말에서 늦어도 5월 사이에는 GA를 보게 되길 바란다. 지금 Redis 6는 충분히 테스트 가능하며 버그를 마주칠 가능성은 매우 낮다. 하지만 엄청난 양의 코드 변경을 포함하고 있고, 새로운 기능들은 아직 아무도 프로덕션에서 실행해 본 적 없는 새로운 코드로 이루어져 있다. 그러니 문제가 발견되면 이슈 시스템에 무엇을 겪었는지 최대한 자세히 설명해 제보해 달라.
이번 릴리스를 가능하게 해 준 모든 분들, 그리고 앞으로 몇 달간 이를 매우 안정적인 상태로 만들기 위해 함께할 분들께 감사드린다.
아, 깜빡할 뻔했다! 버전 6을 위한 LOLWUT 명령의 인터랙티브 아트는 이렇다:

실행할 때마다 무작위로 생성된 다른 풍경이 표시된다.
글을 무작위로 읽기
댓글
로그인하고 댓글 남기기