Cosmos - шпаргалка по snapshots
Благодаря снэпшотам можно быстро синхронизировать ноду до актуальной высоты и не ждать долгое время при синхронизации с нуля. Помимо этого снэпшоты позволяют также экономить место на ноде, не загружая события блокчейна до высоты снэпшота. Для того, чтобы подготовить снэпшот необходимо 2 сервера - синхронизированный сервер донор и новый сервер
Также стоит сразу отметить, что практикуется 2 вида синхронизации:
- State sync - когда синхронизация базы происходит через инструменты самой ноды. При этом экономится место на жестком диске, так как не копируется предыдущая база данных
- Перенос базы данных - когда с сервера донора копируется папка Data и переносится на новый сервер. Данный способ требует большого объема жесткого диска для распаковки архива и занимает больше времени
State sync
НА СЕРВЕРЕ ДОНОРЕ
Открываем доступ RPC nano /root/.defund/config/config.toml
laddr = "tcp://0.0.0.0:26657"
Открываем app.toml и настраиваем снэпшоты nano $HOME/.defund/config/app.toml
# при настроенном прунинге 100/1000/10 snapshot-interval ставим не меньше 1000 snapshot-interval = 1000 snapshot-keep-recent = 2
Собираем данные (ID ноды +ip +порт)
defundd status # id":"f7aa6ffae725764f473b0d5627a664d3e3cd6164","listen_addr":"65.144.108.99:26656" # Получаем примерно такое [email protected]:26656
Если нода работает перезагружаем ее
sudo systemctl restart defundd && sudo journalctl -u defundd -f -o cat
Смотрим свой IP echo http://$(wget -qO- eth0.me):26657/
В браузере проверяем открылся ли доступ http://65.144.108.99:26657/
НА НОВОМ СЕРВЕРЕ
Ставим ПО и начинаем настраиваем persistent_peers
$HOME/.defund/config/config.toml
peers="[email protected]:26656" sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" ~/.defund/config/config.toml # persistent_peers = "[email protected]:26656"
SNAP_RPC=65.144.108.99:26657
LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \ BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000)); \ TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash)
echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \ s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \ s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \ s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"| ; \ s|^(seeds[[:space:]]+=[[:space:]]+).*$|\1\"\"|" ~/.defund/config/config.toml
defundd tendermint unsafe-reset-all defundd start
# defundd unsafe-reset-all # defundd tendermint unsafe-reset-all
Если нода не видит снап и не цепляется с ошибкой err="auth failure: secret conn failed, то перезагружаем донора
После того, как нода синхронизировалась останавливаем ее, ставим сервисник и перезапускаем
Перенос базы данных
НА СЕРВЕРЕ ДОНОРЕ
Обязательное условие иметь дополнительное место на жестком диске для создание архива. В данном примере будет переноситься каталог data, но иногда необходимо перенести еще каталог wasm и т.д.
# проверить место на жестком диске df -h # проверить место занятое нодой du -h /root/.sei
Если места хватает, то идем дальше
Важно - не забываем временно остановить ноду
Важно - если копия делается с ноды, где запущен валидатор, то перед архивированием файл priv_validator_state.json необходимо привести к нулевому значению вручную или скачав его отсюда wget -O $HOME/.genesisd/data/priv_validator_state.json "https://raw.githubusercontent.com/lesnikutsa/lesnik_utsa/main/default%20files/priv_validator_state.json"
# открываем новое окно tmux tmux new-session -s archive-temp
# задаем переменные NAME_FOLDER=archive-temps NAME_ARCHIVE=seidata NAME_PATH=$HOME/.sei/data/
# после выполнения команд красным цветом будет подсвечиваться ссылка для скачивания # пока данное окно tmux будет активно будет возможность удаленного скачивания архива # для остановки нажмите CTRL+C # для закрытия окна tmux нажмите CTRL+B D mkdir -p $HOME/$NAME_FOLDER && \ cd $HOME/$NAME_FOLDER && \ tar -zcvf $NAME_ARCHIVE.tar.gz $NAME_PATH && \ echo -e "\033[0;31m wget http://$(wget -qO- eth0.me):8000/$NAME_ARCHIVE.tar.gz \033[0m" && \ python3 -m http.server 8000
# не забываем удалить архив, если он уже не нужен cd $HOME/archive-temps rm seidata.tar.gz
НА НОВОМ СЕРВЕРЕ
Устанавливаем ноду до момента запуска сервиса (здесь не использовал переменные)
# удаляем каталог .data и создаем пустой каталог rm -rf $HOME/.sei/data/ mkdir $HOME/.sei/data/ # скачиваем архив cd $HOME wget http://<ВАШ-IP>:8000/seidata.tar.gz # распаковываем архив без вложенной папки tar -C $HOME/ -zxvf seidata.tar.gz --strip-components 1 # ВАЖНО!!! - если валидатор был ранее создан, то обнуляем priv_validator_state.json wget -O $HOME/.sei/data/priv_validator_state.json "https://raw.githubusercontent.com/lesnikutsa/lesnik_utsa/main/default%20files/priv_validator_state.json" # проверяем, что состояние валидатора на начальном этапе cd && cat .sei/data/priv_validator_state.json { "height": "0", "round": 0, "step": 0 }
Убедившись, что состояние в priv_validator_state.json равно нулю можно запускать ноду
# не забываем удалить архвив для экономии места cd $HOME rm seidata.tar.gz