4.6 KiB
4.6 KiB
Виправлення проблеми з періодичною втратою даних
Проблема
Дані в базі даних "відвалюються" через деякий час (щоденна помилка). 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