Подрезка (pruning) базы данных для Geth валидатора Ethereum. Освобождение места на SSD

обрезка базы данных GETH ethereumДля POS майнинга криптовалюты Ethereum используется специальное программное обеспечение под общим названием Валидатор. Валидатор в свою очередь состоит из двух компонентов Исполняемого слоя и Консенсус слоя. Где консенсус слой это и есть сам POS майнинг, а исполняемый слой это бывшая блокчейн POW сеть Ethereum, которая работала с 2015 года до слияния в 2022 году. Все данные накопленные за это время полностью перенесены в новую POS сеть.

Т.к. существует несколько вариантов программного обеспечения для работы валидатора, поэтому дальнейшие рассуждения будут применимы для клиента GETH, как самого популярного.

Для работы каждого слоя используется своя база данных, так для исполняемого слоя эта база данных увеличивается на 14Gb каждую неделю, а полностью база данных уже сейчас занимает почти 2 Tb данных. Для архивного валидатора (используется для различных сервисов Etherscan и beacoincha.in) требования для свободного места на SSD еще выше и составляют более 14TB при использованиb клиента GETH.

Что бы сократить требования к размеру SSD для полной ноды (стандартный валидатор), разработчики придумали процедуру подрезки базы данных (Pruning) до последних 128 блоков для каждой транзакции.

полная нода ethereum валидатор

С помощью этой процедуры теоретически можно использовать SSD размером 1 TB, но процедуру подрезки придется делать каждый месяц. Поэтому лучше купить для валидатора SSD размером 2TB и делать уменьшение базы данных раз в год.  Тем более что данная процедура занимает по времени около 6-7 часов, в течении которых Ваш валидатор будет оффлайн и получать штрафы. 

Консенсус слой так же имеет свою базу данных, но увеличивается в размерах она не так быстро, как база для исполняемого слоя, поэтому основное внимание уделяется именно уменьшению базы данных для исполняемого слоя.

Важно: С версии 1.13.0 клиент GETH поддерживает новый флаг --state.scheme=path а так же новый тип базы данных Pebble, если Вы уже используете --state.scheme=path или только собираетесь устанавливать ETH валидатор с новым типом базы данных, то подрезку базы данных делать уже не нужно. Для всех остальных клиентов, которые хоть и обновились до версии 1.13.0 или выше, продолжает работать старая версия базы. Что бы перейти на новую базу данных нужно полностью удалить базу данных клиента Geth (команда geth removedb), в настройках GETH указать флаг  --state.scheme=path и --db.engine pebble, и ждать полной синхронизации ноды в течении 1 дня или более, при условии что у Вас быстрый SSD, мощный современный CPU и быстрый интернет.

Теперь непосредственно перейдем к инструкции как сделать эту самую подрезку базы данных для GETH клиента.

Подрезка (Pruning) базы данных GETH

Важно: Сделать подрезку базы данных можно только если на SSD диске осталось не менее 40Gb свободного места. Если У вас уже меньше места на SSD, то можно увеличить место за счет уменьшения SWAP файла или расширения размера логического диска. Временного переноса базы данных консенсус слоя на другой диск или как последний вариант сделать новую синхронизацию с нуля, но уже с базой данных Pebble.

Команда Linux проверить свободное место не диске:

df -h

Второй момент: Ваш клиент GETH должен быть полностью синхронизирован и проработать после запуска не менее 35 минут для набора необходимых данных. 

Первое что нужно сделать это остановить процесс GETH

sudo systemctl stop geth

Так же можно остановить работу консенсус слоя. Команды остановки работы для клиента PRYSM

sudo systemctl stop prysmvalidator
sudo systemctl stop prysmbeacon

Подождать 3 минуты перед тем как приступить к следующему шагу.

Перед дальнейшим действиями рекомендуется запустить терминальный мультиплексор TMUX и все дальнейшие действия выполнять в нем

tmux

Это необходимо для тех случаев, когда по каким либо причинам вы потеряет доступ к удаленному терминалу управления сервером. В этом случае процесс обрезки базы данных не прервется вместе с вашей сессией.

Далее можно начать уменьшение самой базы данных

Команда для обрезания базы данных:

 geth snapshot prune-state

Если Вы устанавливали валидатора с помощью инструкции Somer Esat на Medium, т.е. запуск GETH происходит с помощью systemd, то команда для запуска будет совсем другая:

sudo -u <user> geth --datadir <path> snapshot prune-state

пример команды: sudo -u geth geth --datadir /var/lib/geth snapshot prune-state

или sudo -u goeth geth --datadir /var/lib/goethereum snapshot prune-state

выбор команды зависит от того где у Вас на сервере хранится база данных GETH.

Узнать путь к базе данных можно в файле geth.service

sudo nano /etc/systemd/system/geth.service

путь к базе данных указан под флагом --datadir

Если Вы все сделали правильно то начнется процесс уменьшения базы данных, который разделен на 3 этапа:

Первый этап составление фильтра Bloom, что на моем компьютере заняло чуть более 2 часов

уменьшение базы данных валидатора эфира

,где

elapsed- сколько уже времени прошло

eta - прогнозируемое время до окончания процесса

Далее начнется сама подрезка базы, на что уйдет еще около 4 часов. 

pruning state data eth geth

После Pruning, база данных будет еще какое-то время архивироваться, в консоль этот процесс будет записан как Compacting database. Этот процесс может занять еще около часа.

О успешном выполнении задачи по уменьшению базы данных ethereum валидатора сообщит надпись State pruning successful

 

Выключаем TMUX

tmux kill-server

Далее запускаем клиент GETH и валидатор, если он тоже был выключен

sudo systemctl start geth

sudo systemctl start prysmbeacon

sudo systemctl start prysmvalidator

 

Ошибка "Snapshot not old enough yet: need 128 more blocks"

Данная ошибка возникает если ваш валидатор недостаточно долго работал перед тем как Вы решили уменьшить базу данных. В рекомендациях сказано, что GETH должен проработать не менее 35 минут перед тем, как Вы сможете приступить к обрезке.

Так же это ошибка возникает если Вы выбрали неправильную команду для Pruning database клиента GETH. Укажите другой путь или используете другой формат команды.

Второй вариант как запустить обрезку базы данных GETH Ethereum

Отредактируйте существующий файл geth.service

sudo nano /etc/systemd/system/geth.service

добавьте в самый конец ExecStart:

snapshot prune-state

Все остальные параметры должны остаться без изменений.


Перезагрузить systemd

sudo systemctl daemon-reload

Запустите службу Geth

sudo systemctl start geth

Смотреть за ходом обрезки базы данных можно через команду

journalctl -fu geth

После завершения обрезки базы данных GETH, удалить в файле geth.service строку snapshot prune-state

sudo nano /etc/systemd/system/geth.service

Перезагрузить systemd

sudo systemctl daemon-reload

Запустите службу Geth

sudo systemctl start geth


Весь процесс уменьшения базы данных клиента GETH занял около 7 часов на сервере с процессором Ryzen 1700X, 32Gb ОЗУ  и 2TB SSD ADATA XPG GAMMIX S11 Pro.

Если Ваша конфигурация сервера значительно слабее, то и общее время затраченное на уменьшение базы данных будет больше. И наоборот при более мощном компьютере Pruning может занять меньше времени.

Вывод: Pruning или подрезка базы данных валидатора ETH, работающего на клиенте GETH очень полезная функция, т.к. позволяет использовать SSD гораздо меньшего объема, чем требовалось бы на самом деле. Что так же избавляет от проблем, если Вашего 2Tb SSD уже не хватает для поддержания работы валидатора Ethereum. Можно всего за несколько часов уменьшить базу данных и не думать о полной синхронизации GETH в течении нескольких дней для перехода на новый тип базы данных, где уменьшение базы данных происходит автоматически. 

Если Вы все таки решили не переходить на Pebble, то не забывайте периодически выполнять команду  snapshot prune-state вовремя, пока на вашем SSD еще есть 40Gb свободного места.