2013-04-15 2 views
0

Я бы хотел использовать HAproxy для проверки, находятся ли мои серверы db в сети, без фактической маршрутизации запросов через поле HAproxy. Есть ли способ подключиться к HAproxy и вернуть ему IP-адрес хоста?Как получить HAproxy для возврата следующего IP-адреса db-сервера?

например: с веб-сервера # 1 Я подключаюсь к HAproxy на порту 3306. HAproxy прослушивает 3306 и echos DB Host # 1 из списка узлов db (round robin). Затем из webserver # 1 я подключаюсь непосредственно к узлу DB # 1.

+0

Если это часть приложения реального мира, тогда ИМХО, приобретение БД-соединения должно выполняться прозрачно с помощью прокси-сервера. Каковы ваши рассуждения для этого? – rdlowrey

ответ

2

Вы можете сделать это непосредственно в PHP.

попробовать что-то вроде этого:

function get_connectable_host(array $hosts, $port, $timeout = 3) 
{ 
    // Optionally randomise the order of the input array 
    // This should help to ensure a relatively even distribution over time 
    shuffle($hosts); 

    // Create some vars 
    $socks = $w = array(); 
    $r = $e = null; 
    $flags = STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT; 

    // Loop over the list of host addresses and send connect attempts to them 
    // Store the host address with the created socket resource 
    foreach ($hosts as $host) { 
     $address = "tcp://$host:$port"; 
     $sock = stream_socket_client($address, $n, $s, $timeout, $flags); 
     $socks[(int) $sock] = array($host, $sock); 
     $w[] = $sock; 
    } 

    // Wait for at least one of the sockets to connect 
    if (!stream_select($r, $w, $e, $timeout)) { 
     return false; // Nothing connected successfully after the timeout 
    } 

    // Get the ID of the first socket that connected 
    $result = (int) current($w); 

    // Loop over the sockets and disconnect them all 
    foreach ($socks as $sock) { 
     stream_set_blocking($sock[1], 0); // set non-blocking or FIN will block 
     stream_socket_shutdown($sock[1], STREAM_SHUT_RDWR); 
     fclose($sock[1]); 
    } 

    // Return the successfully connected host address 
    return $socks[$result][0]; 
} 

$hosts = array(
    '192.168.0.1', 
    '192.168.0.2', 
    '192.168.0.3' 
); 
$port = 3306; 
$timeout = 3; // Max number of seconds to wait for a connection 

$hostToUse = get_connectable_host($hosts, $port, $timeout); 

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

По существу, это именно то, что вы хотите, чтобы HAproxy сделал для вас прямо на PHP.

Действительно важными битами, которые делают эту работу, являются stream_socket_client() с STREAM_CLIENT_ASYNC_CONNECT и stream_select().

+0

Я читал руководство stream_select() ... Из того, что я понимаю, stream_select() возвращается после того, как все носки ответили или время ожидания. Я думаю, что вы подразумеваете, что функция вернется после того, как 1 носок ответит (это то, что я хочу) ... Я не вижу этого на странице руководства. –

+0

@FrancisSnipe Из-за 'STREAM_SOCKET_ASYNC_CONNECT' это будет работать, как ожидалось. http://codepad.viper-7.com/uaVuOn <- обратите внимание, что для возврата не требуется 3 секунды, это происходит, как только один хост подключается – DaveRandom

+0

Хорошо, я вижу это сейчас. –

Смежные вопросы