Redis Cluster
chronos-go는 별도 설정 없이 Redis Cluster에서 동작합니다: 큐에 속한
모든 키는 {queue} 해시 태그로 감싸져 있어서, 한 큐의 모든 키가 하나의
슬롯에 놓입니다 — enqueue, retry, completion을 구동하는 멀티키 Lua
스크립트가 원자성을 유지합니다 — 반면 서로 다른 큐는 클러스터 전체에
분산되어 수평 확장을 얻습니다.
레시피: 서버를 클러스터에 연결하기
redis.NewClient 대신 redis.NewClusterClient를 쓰면 됩니다. NewServer는
어느 쪽이든 동일한 redis.UniversalClient 인터페이스를 받으므로 그 외에는
아무것도 바뀌지 않습니다.
rdb := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{"node1:6379", "node2:6379", "node3:6379"},
})
srv := chronos.NewServer(rdb, chronos.ServerConfig{ /* ... */ })
레시피: 클러스터를 상대로 CLI 사용하기
chronos CLI도 동일한 방식으로 연결합니다. --cluster와 쉼표로 구분한
시드 노드 목록을 넘기면 됩니다(하나만 있어도 충분합니다 — 클라이언트가
나머지를 알아서 찾습니다).
chronos --cluster --redis node1:6379,node2:6379 queue ls
주의: DB, 전역 키, 그리고 Sentinel
- Redis Cluster는 논리 데이터베이스 0만 가지고 있습니다 —
--db는 standalone 전용 플래그이며, CLI는--cluster와--db를 함께 쓰면 거부합니다. - 전역 키(
chronos:queues, 스케줄러 리더 락)는 싱글키 커맨드 또는 싱글키 Lua 스크립트로만 접근하므로, 별도의 해시 태그 없이도 클러스터에서 안전합니다. - Sentinel:
redis.NewFailoverClient를 주입하는 것도 가능합니다 — 동일한redis.UniversalClient인터페이스를 만족합니다 — 다만 Sentinel은 아직 chronos-go의 테스트 매트릭스에 포함되어 있지 않습니다.
실제 클러스터로 검증하기
라이브러리 저장소는 즉석에서 띄울 수 있는 6노드 클러스터와, 스크립트 전체를 커버하는 통합 테스트 스위트(모든 Lua 스크립트와 커맨드 패턴이 클러스터에서 최소 한 번씩 실행됨)를 함께 제공합니다. 이 문서 사이트가 아니라 라이브러리 저장소에서 실행합니다.
cd deploy/redis-cluster && docker compose up -d && cd ../..
make test-cluster
전체 시그니처는 pkg.go.dev에 문서화되어 있습니다.