Восстановление работы n8n в случае 100% загрузки базы данных

Сервер n8n не отвечает. Надо разбираться.  Ответ от демона сразу после перезагрузку натолкнул на мысль что сценарий проблемный не один, а их много

Active: active (running)

Memory: 3.2G

CPU: 3min 25s за 2min 54s

Решение нашел и хочу его описать, потому что может пригодится и другим.

Остановил n8n
systemctl stop n8n; sleep 5; pkill -u n8n_5ha_ru_usr -f ‘/usr/bin/n8n’ || true; ps aux | grep ‘[n]8n’

Сделал бэкап поля “активные сценарии”

bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -c «DROP TABLE IF EXISTS workflow_active_backup_before_crash; CREATE TABLE workflow_active_backup_before_crash AS SELECT id, name, active FROM workflow_entity;»‘

 

Отключил активные сценарии
bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -c «UPDATE workflow_entity SET active=false WHERE active=true;»‘

 

Посмотрел статусы запусков
bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -c «SELECT status, count(*) FROM execution_entity GROUP BY status ORDER BY count(*) DESC;»‘

Там было 21000+ сценариев со статусом new: фантомные запуски. В реальности они завершены, но n8n после перезагрузки пробовал продолжить с ними работу и уходил в 100% загрузку.

 

status | count 

———-+——— 

success | 262854

 error | 151400

 crashed | 25330

 new | 21617 

canceled | 2070 

(5 rows)

 

Посмотрел имена сценариев, которые создают проблемы.

bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -c «SELECT e.id, e.status, e.mode, e.\»workflowId\», w.name, e.\»startedAt\», e.\»stoppedAt\» FROM execution_entity e LEFT JOIN workflow_entity w ON w.id=e.\»workflowId\» WHERE e.\»stoppedAt\» IS NULL OR e.status IN (‘\»running’\»,’\»new’\»,’\»waiting’\») ORDER BY e.\»startedAt\» DESC LIMIT 100;»‘

 

Прибил все фантомные запуски

bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -c «UPDATE execution_entity SET status=’\»crashed’\», \»stoppedAt\»=NOW() WHERE \»stoppedAt\» IS NULL OR status IN (‘\»running’\»,’\»new’\»);»‘

Запуск заново

systemctl start n8n; sleep 15; systemctl status n8n —no-pager -l; ss -lntp | grep -E ‘:5678|:443|:80’; curl -I http://127.0.0.1:5678

 

Проверил все и вернул обратно статус “активен” тем сценариям что выключил.

 

Проверка не копятся ли новые new

bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -c «SELECT status, count(*) FROM execution_entity WHERE \»startedAt\» > NOW() — INTERVAL ‘\»10 minutes’\» GROUP BY status ORDER BY count(*) DESC;»‘

 

Удаление canceled, crashed, crushed пачками по 5000

bash -lc ‘set -a; source /var/www/n8n_5ha_ru_usr/data/.n8n/.env; set +a; while true; do deleted=$(PGPASSWORD=»$DB_POSTGRESDB_PASSWORD» psql -h «$DB_POSTGRESDB_HOST» -p «${DB_POSTGRESDB_PORT:-5432}» -U «$DB_POSTGRESDB_USER» -d «$DB_POSTGRESDB_DATABASE» -t -A -c «WITH del AS (SELECT id FROM execution_entity WHERE status IN (‘\»canceled’\»,’\»crashed’\»,’\»crushed’\») LIMIT 5000), del_ann AS (SELECT id FROM execution_annotations WHERE \»executionId\» IN (SELECT id FROM del)), d_tags AS (DELETE FROM execution_annotation_tags WHERE \»annotationId\» IN (SELECT id FROM del_ann)), d_ann AS (DELETE FROM execution_annotations WHERE id IN (SELECT id FROM del_ann)), d_meta AS (DELETE FROM execution_metadata WHERE \»executionId\» IN (SELECT id FROM del)), d_data AS (DELETE FROM execution_data WHERE \»executionId\» IN (SELECT id FROM del)), d_entity AS (DELETE FROM execution_entity WHERE id IN (SELECT id FROM del) RETURNING id) SELECT COUNT(*) FROM d_entity;»); echo «deleted=$deleted»; [ «$deleted» = «0» ] && break; sleep 1; done’

###########################################################################                                                                                             

        id        |                     name                     | active                                                                                               

——————+———————————————-+———                                                                                              

 Be0NnZfN4ltrCpGQ | Контроллер рутин Регулярность                | f                                                                                                    

 C8SEFHuRPhoOese2 | Обработчик ошибок Сафина                     | f                                                                                                    

 S06KJnLaaCXqQG03 | Контроллер рутин                             | f                                                                                                    

 ndiM2A2FzDedUrqR | Execute Запуск задачи из НФ. Проверка правил | f                                                                                                    

 ai0LgsH9kH4H7so8 | Проверка правила Не требуется если           | f                                                                                                    

 U9NckfZkaqjb6TC5 | НФ Правило Моментальный запуск child ▫       | f                                                                                                    

(6 rows)                                                                                                                                                                

        

 

0 Shares:
Возможно вам будет это интересно