Git Sync для сред с высокой доступностью

Сценарий «основной — реплика»

Используйте основной экземпляр 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/)
              ↕                           ↕
┌────────────────────┐          ┌────────────────────┐
│  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

В представлении Dashboards в Grafana (оба экземпляра):

Dashboards
└── 📁 grafana-manifests/
    ├── Metrics Dashboard
    ├── Alerts Dashboard
    └── Logs Dashboard
  • Основной экземпляр и реплика показывают идентичную структуру папок.
  • Оба синхронизируются из одного и того же пути 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. При отказе основного экземпляра прокси переключается на реплику.

Особенности отработки отказа

  • Проверки работоспособности и мониторинг.
  • Непрерывная синхронизация для минимизации потери данных.
  • Планирование обратного переключения (автоматического или ручного).

Сценарий с балансировщиком нагрузки

Запустите несколько активных экземпляров 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

В представлении Dashboards в 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. При отказе одного экземпляра балансировщик нагрузки перестаёт направлять на него трафик, а остальные экземпляры продолжают обслуживание.

Важные особенности

  • Согласованность в конечном счёте: из-за интервалов синхронизации экземпляры могут на короткое время иметь разные версии дашбордов.
  • Одновременное редактирование: когда несколько пользователей редактируют один и тот же дашборд на разных экземплярах, могут возникать конфликты.
  • Общая база данных: экземпляры должны использовать одну и ту же серверную базу данных для пользовательских сессий, настроек и аннотаций.
  • Дизайн без сохранения состояния: по возможности проектируйте систему без сохранения состояния, чтобы максимально повысить эффективность балансировки нагрузки.