Технический пост - автоматическая перезагрузка убитых публинчых нод 😌
Вчера с обеда началась какая-то ерунда. Часть пользователей стали жаловаться на ошибки, которые не позволяли проголосовать за пост, или комментировать. У меня были догадки, поэтому рано утром занялся конкретно этой проблемой. И дело не в том, что сервак упал. Он был здоров, но вот одна из публичных нод давно отвалилась и прекратила синхронизироваться. В следствие чего юзеры, которые к ней подключались с лоад-балансера получали ошибки. Пришлось убивать ее ручками и отправлять в перезагрузку. А заодно придумать, как решать подобные проблемы автоматом. Пока публичных нод 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