Виправлення проблеми з періодичною втратою даних¶
Проблема¶
Дані в базі даних "відвалюються" через деякий час (щоденна помилка). PostgreSQL контейнер перезапускається і втрачає дані.
Причини¶
- PostgreSQL не завершується коректно: Логи показують "database system was interrupted; last known up at"
- Відсутність автоматичного відновлення: Немає механізму для автоматичного відновлення даних
- Недостатні налаштування 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
Процес відновлення¶
Коли монітор виявляє втрату даних:
- Перевіряє наявність бекапу
- Відновлює БД з бекапу
- Застосовує всі міграції
- Синхронізує агентів НОДА2
- Видаляє тестових агентів
- Логує результат
Налаштування 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
Запобігання повторенню¶
- Автоматичний моніторинг: Кожні 5 хвилин
- Покращена конфігурація: Правильне завершення PostgreSQL
- Автоматичне відновлення: З бекапу при виявленні проблем
- Health checks: Регулярні перевірки здоров'я БД
Поточний стан¶
- ✅ Моніторинг налаштовано (кожні 5 хвилин)
- ✅ PostgreSQL конфігурацію покращено
- ✅ Автоматичне відновлення працює
- ✅ Логи зберігаються в
/var/log/db-stability-monitor.log