TIL

Redis 한쪽노드에 메모리 몰린 경우

하얀잔디 2025. 11. 3. 20:40

Redis 클러스터에서 {}(해시태그) 쓰면 생기는 일 정리함👇

 

 

🧩 해시태그의 의미

Redis Cluster는 키를 16384개의 슬롯(slot)으로 나눠서 저장함.
슬롯들은 여러 노드에 분배되어 부하 분산됨.

그런데 키에 {} 가 있으면 이야기가 달라짐.
{} 안의 문자열만 해시 계산에 사용됨.

즉 {} 안에 같은 문자열이 있으면 → 전부 같은 슬롯 → 같은 노드에 저장됨 ✅

 

 

🔍 예시

키해시 계산 기준결과
bull:fcmQueue:123 전체 문자열 슬롯 다르게 → 여러 노드로 분산
bull:{fcmQueue}:123 {fcmQueue} 부분만 전부 같은 슬롯 → 한 노드로 몰림 ✅

즉 bull:{fcmQueue}:fcmQueue:* 이런 형태면
모두 {fcmQueue} 기준으로 같은 슬롯 배정 →
클러스터의 한 마스터 노드에만 저장됨

 

 

⚙️ 장점

  • 같은 Queue 관련 데이터(job, meta 등)가 한 노드에 모이기 때문에
    BLPOP, UNLINK, ZSET 같은 작업이 정상적으로 가능함.
  • BullMQ 같은 큐 라이브러리들이 이걸 의도적으로 씀.
    → {fcmQueue} 해시태그는 “fcmQueue 관련 데이터는 한 곳에 모아라”는 의미임.

.

⚠️ 단점

  • {} 안 쓰면 Redis Cluster가 자동으로 분산 → 부하 분산에 유리함.
  • 하지만 큐나 락, 트랜잭션처럼 한 곳에서만 처리돼야 하는 구조에는 부적합.

그래서 BullMQ는 기본적으로 {QueueName} 해시태그를 써서
큐별 데이터가 여러 노드로 흩어지지 않게 설계되어 있음.


🧾 요약

항목설명
{} 있음 {} 안 문자열 기준 해시 → 한 노드로 몰림 ✅
{} 없음 전체 키 기준 해시 → 여러 노드로 분산
BullMQ prefix bull:{queueName}:... (한 노드로 모이게 설계)
정리 팁 중괄호 있으면 해당 슬롯 담당 마스터만 SCAN/UNLINK 하면 됨

✅ 결론

bull:{fcmQueue}:fcmQueue:* 패턴은

  • 클러스터 전체에 분산되지 않고
  • 반드시 한 마스터 노드에 몰려 있음

👉 따라서 그 노드만 찾아서 SCAN / UNLINK 하면 됨.