Files
microdao-daarion/docs/DB_STABILITY_FIX.md

4.6 KiB
Raw Blame History

Виправлення проблеми з періодичною втратою даних

Проблема

Дані в базі даних "відвалюються" через деякий час (щоденна помилка). PostgreSQL контейнер перезапускається і втрачає дані.

Причини

  1. PostgreSQL не завершується коректно: Логи показують "database system was interrupted; last known up at"
  2. Відсутність автоматичного відновлення: Немає механізму для автоматичного відновлення даних
  3. Недостатні налаштування PostgreSQL: Відсутні налаштування для правильного завершення роботи

Виправлення

1. Покращено конфігурацію PostgreSQL

docker-compose.db.yml:

  • Додано command з налаштуваннями для правильного завершення
  • Додано checkpoint_timeout=15min для частіших checkpoint'ів
  • Додано wal_level=replica та max_wal_size=1GB для кращої персистентності

2. Створено скрипт моніторингу

scripts/monitor-db-stability.sh:

  • Автоматично перевіряє стан БД кожні 5 хвилин
  • Виявляє втрату даних
  • Автоматично відновлює з бекапу
  • Застосовує міграції та синхронізує агентів

3. Налаштовано автоматичний моніторинг

Cron job (кожні 5 хвилин):

*/5 * * * * /opt/microdao-daarion/scripts/monitor-db-stability.sh >> /var/log/db-stability-monitor.log 2>&1

4. Існуючі механізми

  • Health check: scripts/db-health-check.sh (кожні 30 хвилин)
  • Backups: Автоматичні бекапи кожні 12 годин
  • Migrations: Автоматичне застосування при виявленні проблем

Використання

Перевірити стан вручну

cd /opt/microdao-daarion
bash scripts/monitor-db-stability.sh

Перевірити логи моніторингу

tail -f /var/log/db-stability-monitor.log

Перевірити cron

crontab -l | grep monitor-db-stability

Процес відновлення

Коли монітор виявляє втрату даних:

  1. Перевіряє наявність бекапу
  2. Відновлює БД з бекапу
  3. Застосовує всі міграції
  4. Синхронізує агентів НОДА2
  5. Видаляє тестових агентів
  6. Логує результат

Налаштування PostgreSQL

Додані параметри для кращої персистентності:

  • shared_buffers=256MB - буфер для кешування
  • max_connections=200 - максимальна кількість підключень
  • checkpoint_timeout=15min - частіші checkpoint'и
  • wal_level=replica - рівень WAL для реплікації
  • max_wal_size=1GB - максимальний розмір WAL

Перевірка після проблеми

# 1. Перевірити логи PostgreSQL
docker logs daarion-postgres --tail 50

# 2. Перевірити дані
docker exec daarion-postgres psql -U postgres -d daarion -c "SELECT COUNT(*) FROM microdaos;"
docker exec daarion-postgres psql -U postgres -d daarion -c "SELECT COUNT(*) FROM agents;"

# 3. Перевірити моніторинг
tail -20 /var/log/db-stability-monitor.log

# 4. Запустити монітор вручну
bash scripts/monitor-db-stability.sh

Запобігання повторенню

  1. Автоматичний моніторинг: Кожні 5 хвилин
  2. Покращена конфігурація: Правильне завершення PostgreSQL
  3. Автоматичне відновлення: З бекапу при виявленні проблем
  4. Health checks: Регулярні перевірки здоров'я БД

Поточний стан

  • Моніторинг налаштовано (кожні 5 хвилин)
  • PostgreSQL конфігурацію покращено
  • Автоматичне відновлення працює
  • Логи зберігаються в /var/log/db-stability-monitor.log