August 25, 2024

Горячий переезд  SOLANA с одного сервера на другой без потери аптайма

Подкидываем на резерв свои ключи.

mainnet-validator-keypair.json
vote-account-keypair.json

Ставим ноду по ГАЙДУ, но используем сервисник такой на двух нодах, он обязателен или Вы можете использовать свой сервисник, но нужно изменить в нем ключ --identity $HOME/mainnet-validator-keypair.json на --identity $HOME/identity.json, а также добавить ключ --authorized-voter $HOME/mainnet-validator-keypair, а то нода не будет голосовать.

Подкидываем на резерв свои ключи.

Я использую данный сервисник.

cat > /etc/systemd/system/solana.service<<EOF
[Unit]
Description=Solana MB node
After=network.target syslog.target
StartLimitIntervalSec=0
[Service]
User=$USER
Type=simple
Restart=always
RestartSec=1
LimitNOFILE=1024000
Environment="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password"
ExecStart=$HOME/.local/share/solana/install/active_release/bin/solana-validator \\
--entrypoint entrypoint.mainnet-beta.solana.com:8001 \\
--entrypoint entrypoint2.mainnet-beta.solana.com:8001 \\
--entrypoint entrypoint3.mainnet-beta.solana.com:8001 \\
--entrypoint entrypoint4.mainnet-beta.solana.com:8001 \\
--entrypoint entrypoint5.mainnet-beta.solana.com:8001 \\
--known-validator 7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2 \\
--known-validator GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ \\
--known-validator DE1bawNcRJB9rVm3buyMVfr8mBEoyyu73NBovf2oXJsJ \\
--known-validator CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S \\
--expected-genesis-hash 5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d \\
--only-known-rpc \\
--wal-recovery-mode skip_any_corrupted_record \\
--identity $HOME/identity.json \\
--vote-account $HOME/vote-account-keypair.json \\
--ledger $HOME/ledger \\
--limit-ledger-size 50000000 \\
--dynamic-port-range 8000-8020 \\
--log $HOME/solana.log \\
--incremental-snapshots \\
--full-snapshot-interval-slots 0 \\
--incremental-snapshot-interval-slots 0 \\
--maximum-full-snapshots-to-retain 1 \\
--maximum-incremental-snapshots-to-retain 1 \\
--maximum-local-snapshot-age 6500 \\
--no-snapshot-fetch \\
--full-rpc-api \\
--private-rpc \\
--use-snapshot-archives-at-startup when-newest \\
--tip-payment-program-pubkey T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt \\
--tip-distribution-program-pubkey 4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7 \\
--merkle-root-upload-authority GZctHpWXmsZC1YHACTGGcHhYxjdRqQvTpYkb9LMvxDib \\
--commission-bps 10000 \\
--relayer-url http://127.0.0.1:11226 \\
--block-engine-url https://frankfurt.mainnet.block-engine.jito.wtf \\
--shred-receiver-address 145.40.93.84:1002 \\
--authorized-voter $HOME/mainnet-validator-keypair.json \\
--accounts-hash-cache-path /mnt/ramdisk/accounts_hash_cache \\
--accounts-index-path /mnt/ramdisk/accounts-index-path \\
--rpc-port 8899
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
[Install]
WantedBy=multi-user.target
EOF

На обоих нодах создаем второстепенные ключ на которые нода будет переходить.

solana-keygen new -s --no-bip39-passphrase -o unstaked-identity.json

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

На основе:

ln -sf /root/mainnet-validator-keypair.json /root/identity.json

На резерве:

ln -sf /root/unstaked-identity.json /root/identity.json

Убедитесь, что символические ссылки созданы правильно:

ls -l /root/identity.json

Создаем в нано скрипты для перехода. Подставляем IP резерва в скрипт. У меня доступ к нему по ключу SSH.

Этот скрипт делаем на основе.

nano primary-transition.sh

#!/bin/bash
# Ожидание окна перезапуска
solana-validator -l /root/ledger wait-for-restart-window --min-idle-time 2 --skip-new-snapshot-check
# Установка временного идентификатора
solana-validator -l /root/ledger set-identity /root/unstaked-identity.json
# Обновление символической ссылки
ln -sf /root/unstaked-identity.json /root/identity.json
# Копирование файла башни на резервный валидатор (измените IP на правильный)
scp -i /root/.ssh/id_rsa /root/ledger/tower-1_9-$(solana-keygen pubkey /root/mainnet-validator-keypair.json).bin root@АЙПИШНИК_РЕЗЕРВА:/root/ledger
# Убедитесь, что основной идентификатор больше не голосует
echo "Primary identity is no longer voting"
solana catchup --our-localhost 8899

Сделайте скрипт исполняемым:

chmod +x primary-transition.sh

Этот скрипт создаем на резерве

nano secondary-transition.sh

#!/bin/bash
# Установка основного идентификатора с требованием башни
solana-validator -l /root/ledger set-identity --require-tower /root/mainnet-validator-keypair.json
# Обновление символической ссылки
ln -sf /root/mainnet-validator-keypair.json /root/identity.json
# Убедитесь в успешности перехода
solana catchup --our-localhost 8899

Сделайте скрипт исполняемым:

chmod +x secondary-transition.sh

Теперь запускаем скрипт на основе

./primary-transition.sh

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

./secondary-transition.sh

По всем вопросам, можете не стесняться и мне писать https://t.me/toha_crypto буду рад помочь, помогу поставить или объясню.