Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
goldvoice
6 лет назад

Технический пост - автоматическая перезагрузка убитых публинчых нод 😌

Вчера с обеда началась какая-то ерунда. Часть пользователей стали жаловаться на ошибки, которые не позволяли проголосовать за пост, или комментировать. У меня были догадки, поэтому рано утром занялся конкретно этой проблемой. И дело не в том, что сервак упал. Он был здоров, но вот одна из публичных нод давно отвалилась и прекратила синхронизироваться. В следствие чего юзеры, которые к ней подключались с лоад-балансера получали ошибки. Пришлось убивать ее ручками и отправлять в перезагрузку. А заодно придумать, как решать подобные проблемы автоматом. Пока публичных нод 5, можно и ручками, но при скалировании до 10 публичных нод начнется проблема с рандомным выпаданием раз в месяц 1-2 нод.

Итак, что нам нужно проверять? Здоровье ноды. А как ее проверить? По дате последнего блока. Благо, API-запрос get_dynamic_global_properties как раз возвращает последний блок и его timestamp.

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

Итак, вот что получилось, часть первая:

apt install npm -y
ln -s /usr/bin/nodejs /usr/bin/node
cd ~
mkdir check-ws
cd check-ws
cat >./package.json <<EOL
{
  "name": "check-ws",
  "version": "1.0.0",
  "description": "checking golos/steem node by ws ans restarting server when block time checks fails",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Anatoly Piskunov <anatoly.piskunov@gmail.com>",
  "license": "ISC",
  "dependencies": {
    "ws": "^3.3.1"
  }
}
EOL
touch index.js
npm i ws --save

Часть вторая, сам код скрипта в открытом коде (сохранить в файл index.js):

const WebSocket = require('ws');
const ws = new WebSocket('ws://localhost/');
ws.on('open', function open() {
        ws.send('{"id":1,"method":"get_dynamic_global_properties","params":[]}');
});
ws.on('message', function incoming(data) {
        json=JSON.parse(data);
        if(typeof json.result.time !== 'undefined'){
                var current_ts=new Date().getTime();
                console.log('current server timestamp: '+current_ts);
                var d=Date.parse(json.result.time);
                console.log('last block timestamp: '+d);
                var offset=current_ts-d;
                console.log('offset: '+offset);
                if(offset>600000){//10 min
                        require('child_process').exec('/sbin/reboot',function(msg){console.log(msg);});
                }
        }
        process.exit();
});

Добавляем его в крон и больше не вспоминаем про зависшие паблик ноды (эта прослужила около 38 дней под сильной нагрузкой). Посмотрим, как часто это будет происходить. Думаю, если расширить парк нод до 10-20 штук, то это будет очень редкое явление. Но пока в этом нет необходимости.

Всем спасибо за внимание, будем рады вашей постоянной поддержке 💌 Ставьте апвоуты, подписывайтесь на @goldvoice и переходите на GoldVoice.club

0
401.544 GOLOS
На Golos с July 2017
Комментарии (10)
Сортировать по:
Сначала старые