LLM WikiAccess-protected knowledge portal

WIKI

Valkey 9.1: DB별 ACL·Lua 모듈화·JSON 로그로 Redis 포크의 보안과 운영성을 강화한 방식

요약 Valkey는 2024년 Redis가 라이선스를 BSL로 전환한 이후 Linux Foundation 산하에서 Redis 7.x를 포크해 만들어진 오픈소스 프로젝트다. 2026년 7월 출시된 Valkey 9.1 은 멀티테넌트 환경에서의 보안 격리, 운영 가시성, 성능 세 가지를 동시에 개선했다. DB별 ACL ACL SETUSER 명령에 db N 한정자를 추가해 특정 유저를 특정 논리 DB에 고정한다. Redis와 기존 V

경로human/study/content/database-frontier/89-valkey-9-1-database-acl-lua-module-json-logging-memory-optimization.md
카테고리Study
태그#infra #json #logging #memory #module #mysql #optimization #security #study

요약

Valkey는 2024년 Redis가 라이선스를 BSL로 전환한 이후 Linux Foundation 산하에서 Redis 7.x를 포크해 만들어진 오픈소스 프로젝트다. 2026년 7월 출시된 Valkey 9.1은 멀티테넌트 환경에서의 보안 격리, 운영 가시성, 성능 세 가지를 동시에 개선했다.

Amazon ElastiCache for Valkey가 9.1을 GA로 지원하면서 AWS 환경 마이그레이션 경로도 명확해졌다.


배경: Valkey는 왜 Redis 포크가 되었는가

2024년 3월 Redis Ltd.는 Redis 7.4부터 Server Side Public License(SSPL)와 Redis Source Available License(RSALv2)로 라이선스를 변경했다. 클라우드 벤더가 Redis를 서비스로 제공하려면 별도 계약이 필요해졌다. AWS, Google, Oracle 등이 Linux Foundation 산하에 Valkey를 포크로 만들었다.

Valkey는 Redis API와 프로토콜을 완전히 호환하면서 BSD-3 라이선스를 유지한다. 기존 Redis 클라이언트, 드라이버, 마이그레이션 도구가 변경 없이 작동한다.


핵심 기능 1: DB별 ACL

문제

Redis의 논리 DB(SELECT 0~15)는 멀티테넌트 키 분리에 자주 쓰인다. 그러나 기존 ACL은 DB 단위 격리를 지원하지 않았다. 유저에게 특정 키 패턴 접근을 허용해도 다른 DB의 동일 패턴 키까지 접근할 수 있었다.

해결

ACL SETUSER tenant_a on >password ~app:* &* +@all db 0
ACL SETUSER tenant_b on >password ~app:* &* +@all db 1

db N 한정자가 추가됐다. tenant_a는 SELECT 0 이외의 DB에 명령을 보내면 NOPERM 오류를 받는다. db *는 전체 DB를 허용하며 기존 동작과 동일하다.

클라이언트 요청
tenant_a 커넥션
SELECT 0 → OK
tenant_b 커넥션
SELECT 1 → OK
↓ ACL SETUSER … db N 검사
Valkey ACL 엔진
DB 번호 일치 검사
db 0: tenant_a 허용
불일치 시 NOPERM
tenant_a → DB 1 차단
논리 DB 격리
DB 0
tenant_a 전용
DB 1
tenant_b 전용
DB별 ACL 격리 구조

이 기능은 단일 Valkey 인스턴스에서 팀·서비스별 키 공간을 엄격하게 분리해야 하는 경우 별도 인스턴스 없이 멀티테넌트를 구현하는 데 쓸 수 있다.


핵심 기능 2: Lua 모듈 분리

배경

Redis의 EVAL·EVALSHA·FUNCTION 명령은 서버 프로세스에 내장된 Lua 5.1 엔진을 실행한다. Lua는 강력하지만 RCE 시도의 진입점이 될 수 있다.

Valkey 9.1은 Lua 엔진을 분리 가능한 컴파일 모듈로 추출했다. valkey.conf에서:

# Lua 완전 비활성화
lua-enabled no

lua-enabled no를 설정하면 EVAL 계열 명령이 ERR Lua scripting is disabled 오류를 반환한다. 인스턴스 재시작 없이도 배포 중에 변경 가능하다(CONFIG SET lua-enabled no).

Lua를 사용하는 배포는 기존과 동일하게 동작한다. 변경은 순수 opt-out이다.


핵심 기능 3: JSON 로그 포맷

기존 Valkey(Redis 계열) 로그는 비구조화 텍스트였다.

1234:M 08 Jul 2026 10:23:45.123 * Ready to accept connections tcp

9.1 이후:

log-format json

설정 시 출력:

{"timestamp":"2026-07-08T10:23:45.123Z","pid":1234,"role":"M","level":"notice","message":"Ready to accept connections tcp"}

level 필드값은 debug, verbose, notice, warning으로 통일됐다. CloudWatch Logs Insights, Datadog Log Management, Grafana Loki 등은 JSON 파싱 룰 추가 없이 바로 쿼리할 수 있다.


핵심 기능 4: TLS 운영성 개선

인증서 만료 모니터링

INFO tls

출력에 tls_cert_not_after_seconds 필드가 추가됐다. 현재 시각 기준 인증서 만료까지 남은 초 수다. Prometheus exporter에서 이 필드를 scrape하면 만료 알람을 별도 사이드카 없이 구성할 수 있다.

무중단 인증서 교체

tls-cert-file 경로를 제자리에서 교체한 뒤 CONFIG SET tls-reloadcert yes를 전송하면 기존 TLS 세션을 유지한 채 새 인증서를 로드한다. Let's Encrypt certbot 갱신 훅에 이 명령을 추가하면 롤링 재시작 없이 갱신이 완료된다.

SAN URI mTLS

tls-client-cert-uri-san에 URI SAN 패턴을 지정하면 클라이언트 인증서의 URI SAN 필드를 mTLS 인증에 사용한다. SPIFFE/SPIRE 환경에서 서비스 아이덴티티를 Valkey 접근 제어와 연계하는 데 활용한다.


성능: 메모리와 처리량

항목개선폭조건
소형 문자열 메모리최대 -20%64바이트 이하 값이 많은 워크로드
정렬 집합(sorted set) 메모리-10%listpack 인코딩 조건 내 집합
I/O 스레딩 처리량최대 +17%io-threads 2 이상 설정 시

소형 문자열 절감은 내부 embstr 인코딩 경계 상향과 메타데이터 헤더 압축으로 달성했다. 정렬 집합 절감은 listpack 엔트리 직렬화 개선에서 나왔다.

I/O 스레딩은 기존에도 있었지만 스레드 간 핸드오프 오버헤드가 커서 실질 이득이 작았다. 9.1은 파이프라인 batching을 개선해 실측 처리량이 올라갔다.


보안 패치: CVE-2026-56684·CVE-2026-63639

9.1.1 패치 릴리스(2026년 7월 말)에 두 CVE가 포함됐다.

9.0.x 브랜치는 9.0.5 패치에 동일 수정이 백포트됐다. 두 CVE 모두 인터넷에 직접 노출된 Valkey 인스턴스에 해당되므로, 방화벽 뒤 내부 배포는 위험도가 낮다.


Redis에서 Valkey 9.1로 마이그레이션

Valkey는 Redis 7.x와 RESP3 프로토콜·명령 세트가 호환된다. 다음 절차로 무중단 전환이 가능하다.

  1. 클러스터 롤링 업그레이드: 레플리카를 먼저 Valkey 9.1로 교체 → 페일오버 → 구 프라이머리 교체.
  2. 클라이언트 드라이버: 변경 없이 재사용 가능. Jedis, ioredis, redis-py, go-redis 모두 Valkey에서 정상 동작.
  3. valkey-cli 제공: redis-cli의 드롭인 대체. 기존 스크립트에서 호출 경로만 변경.
  4. 모듈 호환성: Redis 모듈 API를 Valkey가 유지하므로 대부분의 서드파티 모듈이 재컴파일 없이 로드된다. 단, Lua 모듈 분리로 lua-enabled no 상태에서는 EVAL 의존 모듈이 동작하지 않는다.

운영 체크리스트


요점 정리

References