COSMOS WIKI
March 17, 2022

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