본문 바로가기

server/system design

[redash] 주말마다 죽는 서비스 관찰하기

매주 토/일요일마다 redash가 죽어서 airflow로 쿼리가 실행되는지 확인하는 만들었었다. (healthcheck로는 정상으로 나와서 쿼리 실행으로 확인했다)

저번주말에도 서버가 다운되어 pod도 두배로 늘려줬었다. 하지만

이번주말에도 사망..

대체 왜?!

 

 

스케쥴과 큐에는 별다른 로그가 없어서, 또 알수 없는건가.. 하는 찰나

redis 에 로그가 남아 있었다. 

 

 

2025-11-08T18:52:39Z : k8s.node.name : gke-devops-prd-clust-devops-prd-node--c1f89cf3-uh42
2025-11-08T19:00:04Z : k8s.node.name : gke-devops-prd-clust-devops-prd-node--67b71628-y4z9

??????? 노드의 이름이 달라졌다. -> 노드가 바뀌었다.

아마도 리소스 부족이거나 업데이트로 노드가 바뀐것으로 추측된다.

 

 

노드가 강제 업데이트되어 모든 파드가 옮겨 갔었다...

확인해보니 매일 새벽 3시에 업데이트 내용이 있다면 업데이트가 실행되도록 설정했었다..ㅜㅡㅜ

 

 

신기한게 노드가 변경되어 pod가 정상적으로 떠도 스케쥴러에서 redis를 접근 못하고 있다. 

노드가 변경된 후에 스케쥴러들이 pod이름이나 ip로 접근하는지 helm을 봤지만, 

SVC로 정상적으로 접근하는데도 신기하게 접근을 못하고 있다. (그래서 job이 Queue에만 쌓이고 해소가 안되던거였다)

근데 왜???????????????????????????????????????????????????

 

 


추가 (2025.11.23)

 

redash에서는 각각의 실행을 여러 pod 정확히는 큐를 나눠서 관리한다. (스케쥴 / 실행 / 알림 등등)

해당 큐에 맞게 pod도 나눠서 실행되는데, 문제는 해당 pod들이 redis를 처음에만 잡고, redis가 다른 노드로 이동시에는 재연결을 하지 않는다!! (같은 노드에서 redis가 죽었다가 살아나면 잘 잡는다...)

아마도 해당 pod들의 내부에선 실행시의 redis 경로로 지정되서 한번 셋팅되면 재실행까지는 계속 같은 곳만 바라보다가, 모든 실행이 안되는 것으로 파악되었다 (redash git에 issue에도 등록되었지만 3년이 지나도록 해결 안된걸 보니...)

 

쨌든 helm에는  livenessProbe / readinessProbe 를 추가해서 계속 redis를 바라보게 했고, 

만일 redis의 노드가 변경되면 해당 probe에서 감지해서 연결이 안되면 죽은다음에 재실행되면 정상적으로 실행되도록 만들었다.

workers:  
  livenessProbe:
    exec: 
      command:
        - sh
        - -lc
        - |
          python - <<'PY'
          import os, sys
          try:
              import redis
              r = redis.from_url(os.environ['REDASH_REDIS_URL'],
                                 socket_connect_timeout=3, socket_timeout=3, health_check_interval=15)
              sys.exit(0 if r.ping() else 1)
          except Exception:
              sys.exit(1)
          PY      
    initialDelaySeconds: 15
    periodSeconds: 10
    timeoutSeconds: 3
    failureThreshold: 6  

  readinessProbe:
    exec:
      command:
        - sh
        - -lc
        - |
          python - <<'PY'
          import os, sys
          try:
              import redis
              r = redis.from_url(os.environ['REDASH_REDIS_URL'],
                                 socket_connect_timeout=3, socket_timeout=3, health_check_interval=15)
              sys.exit(0 if r.ping() else 1)
          except Exception:
              sys.exit(1)
          PY  
    initialDelaySeconds: 5
    periodSeconds: 5
    timeoutSeconds: 3
    failureThreshold: 3

 

-_- 흠 해결보다 원인이 빡셌던 이슈였다.