ВНИМАНИЕ!
После 7 дней тестов словил несколько missed-блоков и оказалось, что при определенном стечении обстоятельств, схема может не сработать.
Как я понял, скрипт сработал как раз в тот момент, когда настала моя очередь генерации блока. И что-то пошло не так.
Если следить за очередью и менять ноду в безопасное время, то всё пройдет успешно.
Задача
Необходимо, чтоб backup-сервер следил за появлением новых missed-блоков вашего делегата. Если появляется missed-блок, то backup-сервер автоматически переключает генерацию на себя.
Проверка теории
После успешного эксперимента и консультации с @litvintech, оказалось, что схема рабочая. Осталось автоматизировать.
Подготовка backup-сервера
Для парсинга json-ответов от API в скрипте используется утилита jq. Устанавливаем командой:
sudo apt-get install jq
Запускаем golosd. После синхронизации с сетью запускаем cli_wallet и импортируем приватный ACTIVE ключ вашего аккаунта.
После этого генерируем новый набор ключей с помощью команды suggest_brain_key.
В config.ini вколачиваем
rpc-endpoint=127.0.0.1:9090
witness = "nickname"
private-key = private_brain_key
Перезапускаем golosd командой:
./golosd --replay-blockchain
cli_wallet запускаем со следующими параметрами:
./cli_wallet --server-rpc-endpoint="ws://127.0.0.1:9090" --rpc-http-endpoint 127.0.0.1:8093 --rpc-http-allowip 127.0.0.1
В результате у вас получится нода, которая постоянно выдает
Not producing block for nickname because I don't have the private key for GLS6rfMKdTTd...
Так и должно быть. Т.к. вы сгенерировали новые brain ключи. Теперь, если в cli_wallet выполнить команду
update_witness ...
с новым публичным brain ключем, то генерация блоков переключится на этот сервер.
Я решил автоматизировать этот процесс и написать скрипт, который сам будет следить за увеличением missed-блоков и выполнять команду update_witness.
Подготовка скрипта
Скачать скрипт можно из github.
Но прежде чем его запускать, отредактируйте значения переменных.
# cli_wallet --rpc-http-endpoint url
WALLET=http://127.0.0.1:8093
# cli_wallet unlock password
PASSWORD="PASSWORD"
# update_witness params:
NICKNAME="xtar" #your witness nickname
BACKUPKEY="PUBKEY" # backup server brain pub_key
URL="https://golos.io/ru--delegaty/@xtar/kandidat-delegat-xtar-razrabotchik-steemul-ru" # post url
FEE="3.000 GOLOS" # account_creation_fee
BLOCKSIZE=65536 # maximum_block_size
RATE=1000 # sbd_interest_rate
Теперь, когда все переменные вы заполнили, можете выполнить скрипт командой
chmod +x check.sh && ./check.sh
Алгоритм работы
Выполнение скрипта необходимо засунуть в crontab для ежеминутного выполнения. Для этого в файл /etc/crontab добавляем строку:
* * * * * /path/to/sh/check.sh
- скрипт подключается к API cli_wallet
- если кошелек заблокирован - разблокирует паролем, указанным в переменной PASSWORD
- смотрит (командой get_witness nickname) текущее количество missed-блоков вашего делегата и записывает в файл
- после повторного запуска скрипт сравнивает старое и новое количество missed-блоков
- если количество missed-блоков изменилось, то выполняет команду update_witness с параметрами из переменных.
- тем самым, если все переменные заполнены верно, скрипт переключает генерацию блоков на backup-сервер.
Вопросы, предложения?
Вопросы и свежие идеи приветствуются в комментариях!
Если вы готовы поддержать новые мои разработки (идей много), поддержите моего делегата, ник @xtar вот тут https://golos.id/~witnesses .
Заранее благодарю! =)
Ты не уточнил какова вероятность того, что в момент переноса обе ноды найдут один блок одновременно? чисто теоретически...
@litvintech схему вроде одобрил.
Но все же если есть хотя бы одна десятитысячная доля такого исхода, я бы хотел знать)
Сегодня попробую у себя на резервном сервере настроить =)
Что можно добавить? Некий вызов-нотификацию что-бы сообщить о том произошло переключение - например в телеграмм или емейл или просто вызовом какого-либо url.
Продуманна ли логика после первого переключения? Скрипт по идее должен еще отслеживать (если еще не) не его ли ключ сейчас активен и если активен его - ничего не делать (только увеличивать счетчик миссед), но писать это в выводе.
Интересное решение! :) спасибо!
тестировал?
Должно сработать, так скажем) Тестировал частями, все части отрабатывают как положено. Но спецом missed не делал пока. Может завтра пожертвую статистикой и проверю в боевых условиях, так сказать.