Язык
Контакты
GitHub
Поддержка
Регистрация
Войти
Логин: Пароль: Запомнить:
Пользователи
Голосование

    Какую CMS Вы предпочитаете

    AtomX
    Fapos CMS
    Drunya CMS
Последние комментарии
Топ пользователей
Drunya
Репутация: 110
Сообщений: 3527
Сашка_из_Шебекино
Репутация: 87
Сообщений: 1803
boriska
Репутация: 65
Сообщений: 846
ARMI
Репутация: 46
Сообщений: 1858
BAH0
Репутация: 26
Сообщений: 544
В прошлой статье я рассказал как можно балансировать нагрузку между серверами и обещал показать как теперь, вооружившись полученными знаниями, сделать продвинутую систему пинга и балансинга своих серверов. Вот решил выполнить обещанное.


Пинг своих серверов и балансировка нагрузки между ними могут экономить вам очень много времени и сил, а если скрипты будут написаны более менее правильно, то позволят еще и не совершать лишних движений. Поговорим о самой сути вопроса, а за тем я покажу примеры скриптов. Смысл в том что у нас есть много серверов и нам надо проверить работоспособность HTTP сервера на каждом из них и внести IP адреса работающих серверов в конфиги DNS, как описывалось в предыдущей статье. Правильный скрипт должен уметь фиксировать упавшие сервера и посылать отчеты по почте о их оффлайне. Но так же, правильный скрипт пинга, должен, при следующей проверке, если, бывший в оффе сервер, восстановился после збоя, сказать нам и об этом. Это позволит нам, читая отчеты, сразу определить, какие сервера надо смотреть и отлаживать а какие восстановились сами, таким образом, мы не тратим время на дурную работу.


 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
 44 
 45 
 46 
 47 
 48 
 49 
 50 
 51 
 52 
 53 
 54 
 55 
 56 
 57 
 58 
 59 
 60 
 61 
 62 
 63 
 64 
 65 
 66 
 67 
 68 
 69 
 70 
 71 
 72 
 73 
 74 
 75 
 76 
 77 
 78 
 79 
 80 
 81 
 82 
 83 
 84 
 85 
 86 
 87 
 88 
 89 
 90 
 91 
 92 
 93 
 94 
 95 
 96 
 97 
 98 
 99 
 100 
 101 
 102 
 103 
 104 
 105 
 106 
 107 
 108 
 109 
 110 
 111 
 112 
 113 
 114 
 115 
 116 
 117 
 118 
 119 
 120 
 121 
 122 
 123 
 124 
 125 
 126 
 127 
<?php // Список наших серверов
$Servers = array(
    
'11.11.11.11',
    
'11.11.11.12',
    
'11.11.11.13',
);

/**
 * Перебираем и отдаем на проверку все ИПы
 *
 * @retrun array
 */
function pingStorages() {
    global 
$Servers;

    foreach (
$Servers as $key => $ip) {
        
$check pingIp($ip);
        if (!
$checkregisterServerInstance($ip0);
        else 
registerServerInstance($ip1);
    }
    
    
    return 
$Servers;
}  


/**
 * Получаем тестовую страничку
 *
 * @param string $serverName
 * @retrun boolean
 */
function pingIp($ip) {
    
$data = @file_get_contents('http://' $ip '/test_monitoring.html');
    if (empty(
$data)) return false;
    return 
true;
}
 

/**
 * Запоминаем состояние серверов, для того чтобы могли
 * в будущем сообщить о подьеме.
 *
 * @param string $serverName
 * @param boolean $instance
 * @return none
 */
function registerServerInstance($ip$instance) {
    global 
$Servers;
    
$subject 'Content Server Info';
    
    if (
file_exists('file.dat')) {
        
$logData unserialize(file_get_contents('file.dat'));
    } else {
        
$logData = array();
    }
    
    
    if (
$instance) {
        if (!
array_key_exists($ip$logData)) return;
        else {
            unset(
$logData[$ip]);
            
$mess 'Server is online.' "\n";
            
$mess .= 'IP: ' $ip "\n";
            
$mess .= 'Date: ' date("Y-m-d H:i") . "\n";
            
$subject 'Content Server Info. Server is online' ;
        }
    } else {
        
$logData[$ip] = true;
        
$mess 'Server is offline.' "\n";
        
$mess .= 'IP: ' $ip "\n";
        
$mess .= 'Date: ' date("Y-m-d H:i") . "\n";
        
$subject 'Content Server Info. Server is offline' ;
    }
    
    
    
$headers "From: Content Servers Pingator \n";
    
$headers .= "Content-type: text/plain; charset=\"utf-8\"\n";
    
mail('admin@mail.ru'$subject$mess$headers);

    
    
    
file_put_contents('file.dat'serialize($logData));
    
writeLog($mess);
}



/**
 * Пишем лог
 *
 * @param string $message
 */
function writeLog($message) {
    
$f fopen(dirname(__FILE__) . '/log.dat''a+');
    
fwrite($f$message "\n\n");
    
fclose($f);
}



/**
 * Строим конфиг DNS
 *
 * @return string
 */
function buildConf() {
    
    
// Эта функция берет все сервера из конфига и проверяет каждый из них
    
$data pingStorages();
    
$output '';
    
    
// Просто формируем текст, который запишем в конфиг 
    // (Конфиг выйдет не полный, так как расчитан на инклуд)
    
foreach ($data as $key => $ip) {
        
$output .= 'domain.com        300    IN A   ' $ip "\n"
        
$output .= "\n";
    }
    

    
file_put_contents('/var/named/domen.com'$output);
    
exec("/usr/sbin/rndc reload"$a$status);
}



buildConf();?>

Код что я привел это тот скрипт что я когда то писал, только я выкинул из него много лишнего. Лишнего для статьи. Может в нем и закралась не объявленная переменная или что-то в таком духе, так я мог не заметить и не дочистить, но не в этом дело. Этот скрипт лишь наглядная иллюстрация принципа работы. Как вы могли догадаться, для работы всего этого счастья, необходимо наличие некоего проверочного файлика на проверяемых серверах. Обычный ping не подходит, так как мы проверяем именно веб сервер, который может быть упавшим, даже если сервер пингуется хорошо.

Так же хочу отметить, что файл, который формирует скрипт - конфиг DNS, сам по себе не является всем конфигом, а должен инклудиться в основной конфиг. Это сделано для безопасности. Так мы не боимся повредить рабочий конфиг. Инклуд делается так
Code:
$INCLUDE /var/named/domen.com

Ну вот и еще одна статья по теме, которая и для меня довольно свежа. Если что-то осталось не понятным, спрашивайте на форуме или в комментах.
Балансинг нагрузки и пинг серверов

Теги: Ping php ballansing распределение нагрузки на сервера;
Источник: Drunya
Автор: Drunya
Категория: Общие терки
Просмотров: 3812
Комментариев: 0

Сейчас online: 5. Зарегистрированных: 0. Гостей: 5.
-->