고가용성 환경을 위한 Git Sync

고가용성 환경을 위한 Git Sync

이 문서에서는 고가용성(HA) 환경에서 Git Sync를 구성하는 두 가지 시나리오를 안내합니다. 기본-복제(primary–replica) 시나리오와 로드 밸런서 시나리오를 통해 장애 조치와 부하 분산을 구현하는 방법을 설명해요.

출처: 문서

본문

기본-복제(primary–replica) 시나리오

장애 조치를 가능하게 하려면 기본 Grafana 인스턴스와 같은 Git 위치에서 동기화되는 하나 이상의 복제본을 함께 사용하세요.

이런 경우에 사용하세요

  • 자동 장애 조치: 기본 인스턴스가 실패할 때 서비스 연속성이 필요해요.
  • 고가용성: 조직이 보장된 대시보드 가용성을 요구해요.
  • 간단한 HA 설정: 액티브-액티브(active–active)의 복잡성 없이 고가용성을 원해요.
  • 유지보수 창: 다른 인스턴스가 트래픽을 처리하는 동안 업데이트를 수행해요.
  • 비즈니스 연속성: 대시보드 접근이 다운타임을 견딜 수 없어요.

아키텍처

┌─────────────────────────────────────────────────────┐
│           GitHub Repository                         │
│   Repository: your-org/grafana-manifests          │
│   Branch: main                                      │
│                                                     │
│   grafana-manifests/                              │
│   └── shared/                                      │
│       ├── dashboard-metrics.json                   │
│       ├── dashboard-alerts.json                    │
│       └── dashboard-logs.json                      │
└─────────────────────────────────────────────────────┘
              ↕                           ↕
        Git Sync (shared/)        Git Sync (shared/)
              ↕                           ↕
┌────────────────────┐          ┌────────────────────┐
│  Master Grafana    │          │  Replica Grafana   │
│    (Active)        │          │    (Standby)       │
│                    │          │                    │
│  Repository:       │          │  Repository:       │
│  - path: shared/   │          │  - path: shared/   │
└────────────────────┘          └────────────────────┘
         │                               │
         └───────────┬───────────────────┘
                     ↓
          ┌──────────────────────┐
          │  Reverse Proxy       │
          │  (Failover)          │
          └──────────────────────┘

리포지토리 구조

Git에서:

your-org/grafana-manifests
└── shared/
    ├── dashboard-metrics.json
    ├── dashboard-alerts.json
    └── dashboard-logs.json

Grafana 대시보드 보기(두 인스턴스 모두):

Dashboards
└── 📁 grafana-manifests/
    ├── Metrics Dashboard
    ├── Alerts Dashboard
    └── Logs Dashboard
  • 기본(master) 인스턴스와 복제본 인스턴스가 동일한 폴더 구조를 보여줘요.
  • 둘 다 같은 shared/ 경로에서 동기화해요.
  • 리버스 프록시는 트래픽을 기본(활성) 인스턴스로 라우팅해요.
  • 기본 인스턴스가 실패하면 프록시가 자동으로 복제본(대기)으로 장애 조치해요.
  • 어떤 인스턴스가 트래픽을 서빙하든 사용자는 같은 대시보드를 봐요.

구성 매개변수

기본 인스턴스와 복제 인스턴스 모두 동일한 매개변수를 사용해요:

기본 인스턴스:

  • Repository: your-org/grafana-manifests
  • Branch: main
  • Path: shared/

복제 인스턴스:

  • Repository: your-org/grafana-manifests
  • Branch: main
  • Path: shared/

동작 방식

  1. 두 인스턴스 모두 Git을 통해 동기화된 상태를 유지해요.
  2. 리버스 프록시는 트래픽을 기본 인스턴스로 라우팅해요.
  3. 사용자는 기본 인스턴스에서 편집해요. Git Sync가 변경 사항을 커밋해요.
  4. 두 인스턴스 모두 최신 변경 사항을 가져와 복제본을 동기화된 상태로 유지해요.
  5. 기본 인스턴스가 실패하면 프록시가 복제본으로 장애 조치해요.

장애 조치 고려 사항

  • 상태 확인(health checks)과 모니터링.
  • 데이터 손실을 최소화하기 위한 지속적인 동기화.
  • 폴백(failback)(자동 또는 수동) 계획.

로드 밸런서 시나리오

로드 밸런서 뒤에서 여러 활성 Grafana 인스턴스를 실행하세요. 모든 인스턴스가 같은 Git 위치에서 동기화해요.

이런 경우에 사용하세요

  • 높은 트래픽: 배포가 상당한 사용자 부하를 처리해야 해요.
  • 부하 분산: 여러 인스턴스에 사용자 요청을 분산하고 싶어요.
  • 최대 가용성: 유지보수나 실패 중에도 서비스 연속성이 필요해요.
  • 확장성: 부하가 증가하면 인스턴스를 추가하고 싶어요.
  • 성능: 사용자가 높은 부하에서 빠른 응답 시간을 필요로 해요.

아키텍처

┌─────────────────────────────────────────────────────┐
│           GitHub Repository                         │
│   Repository: your-org/grafana-manifests          │
│   Branch: main                                      │
│                                                     │
│   grafana-manifests/                              │
│   └── shared/                                      │
│       ├── dashboard-metrics.json                   │
│       ├── dashboard-alerts.json                    │
│       └── dashboard-logs.json                      │
└─────────────────────────────────────────────────────┘
              ↕                           ↕
        Git Sync (shared/)        Git Sync (shared/)
              ↕                           ↕
┌────────────────────┐          ┌────────────────────┐
│  Grafana Instance 1│          │  Grafana Instance 2│
│    (Active)        │          │    (Active)        │
│                    │          │                    │
│  Repository:       │          │  Repository:       │
│  - path: shared/   │          │  - path: shared/   │
└────────────────────┘          └────────────────────┘
         │                               │
         └───────────┬───────────────────┘
                     ↓
          ┌──────────────────────┐
          │  Load Balancer       │
          │  (Round Robin)       │
          └──────────────────────┘

리포지토리 구조

Git에서:

your-org/grafana-manifests
└── shared/
    ├── dashboard-metrics.json
    ├── dashboard-alerts.json
    └── dashboard-logs.json

Grafana 대시보드 보기(모든 인스턴스):

Dashboards
└── 📁 grafana-manifests/
    ├── Metrics Dashboard
    ├── Alerts Dashboard
    └── Logs Dashboard
  • 모든 인스턴스가 동일한 폴더 구조를 보여줘요.
  • 모든 인스턴스가 같은 shared/ 경로에서 동기화해요.
  • 로드 밸런서가 모든 활성 인스턴스에 요청을 분산해요.
  • 어떤 인스턴스든 읽기 요청을 서빙할 수 있어요.
  • 어떤 인스턴스든 대시보드 수정을 수용할 수 있어요.
  • 변경 사항은 Git을 통해 모든 인스턴스에 전파돼요.

구성 매개변수

모든 인스턴스가 동일한 매개변수를 사용해요:

인스턴스 1:

  • Repository: your-org/grafana-manifests
  • Branch: main
  • Path: shared/

인스턴스 2:

  • Repository: your-org/grafana-manifests
  • Branch: main
  • Path: shared/

동작 방식

  1. 모든 인스턴스가 Git을 통해 동기화된 상태를 유지해요.
  2. 로드 밸런서가 모든 활성 인스턴스에 들어오는 트래픽을 분산해요.
  3. 사용자는 어떤 인스턴스에서든 대시보드를 볼 수 있어요.
  4. 사용자가 어떤 인스턴스에서든 대시보드를 수정하면 Git Sync가 변경 사항을 커밋해요.
  5. 다른 모든 인스턴스는 다음 동기화 주기에서 업데이트된 대시보드를 가져와요. 혹은 웹훅이 구성되어 있으면 즉시 가져와요.
  6. 인스턴스 하나가 실패하면 로드 밸런서가 그 인스턴스로의 트래픽 라우팅을 중단하고 나머지 인스턴스가 계속 서빙해요.

중요한 고려 사항

  • 결과적 일관성(Eventually consistent): 동기화 주기 때문에 인스턴스가 잠시 다른 대시보드 버전을 가질 수 있어요.
  • 동시 편집: 서로 다른 인스턴스에서 여러 사용자가 같은 대시보드를 편집하면 충돌이 발생할 수 있어요.
  • 데이터베이스 공유: 인스턴스는 사용자 세션, 기본 설정, 주석을 위해 같은 백엔드 데이터베이스를 공유해야 해요.
  • 무상태 설계: 로드 밸런싱 효과를 극대화하려면 가능한 한 무상태(stateless) 운영을 위해 설계하세요.

더 알아보기