ОсновноеRadiotalkПользовательское
Общие вопросы по интернет радио вещанию
6   •   Посмотреть все темы

Master-Slave Relay с автоматическим переключением на резервный

 

21
serg_amigo @serg_amigo
Добрый день!
Имею сервер балансировки и два слайв сервера.
Пытаюсь настроить Master-Slave Relay с автоматическим переключением если мастер не доступен на его резервный.
Могу с помощью скрипта переключать ip адрес домена это даст то что по домену потоки с кодеровщика пойдут на другой ип резервный сервер. С сайта все будут подключаться тоже через другой сервер на слэйв сервера. Однако если на слэйв сервере вместо ip вписать доменное то получаю ошибку что серевр не резолвится. Но если пингануть с консоли то сервер по домену вполне доступен.
Вопрос можно ли как то настроить в скрипте что бы вписать доменное имя вместо ip-шника?
Вопрос номер два: есть ли еще вариант реализации автоматического переключения мастер сервера на резервный?

21
serg_amigo @serg_amigo
Поясняю
Если написать так
<master-server>13.99.131.222</master-server>
<master-server-port>8001</master-server-port>
<master-update-interval>120</master-update-interval>
то все хорошо подключается и все потоки есть на слейв сервере

Но если указать так
<master-server>online.ru</master-server>
<master-server-port>8001</master-server-port>
<master-update-interval>120</master-update-interval>

то потоков уже нет а в логах пишет
WARN slave/streamlist_thread Failed URL access "**********" (Could not resolve host: online.ru; Unknown error)

Отредактировано serg_amigo - 07.05.2019
419
gyurgin_ @gyurgin_
Интересно, а если master будет недоступен, что будет переадресовывать слушателей? А по вопросу: не видит он Ваш домен, вот и все. Вобще методы резерва и балансировки есть и другие, но главное условие: входной поток в любом случае доступен.

21
serg_amigo @serg_amigo
gyurgin_ пишет:

Интересно, а если master будет недоступен, что будет переадресовывать слушателей? А по вопросу: не видит он Ваш домен, вот и все. Вобще методы резерва и балансировки есть и другие, но главное условие: входной поток в любом случае доступен.


я о том и написал, что требуется указать два мастер сервера на случай если первый (основной) по любой из причин вдруг будет не доступен. Что значит не видет мой домен вот и все... Если с хоста делать пинг то сервер виден. Почему же icecast не видит? Может icecat - а фича такая не работать с DNS ??? Какие методы балансировки есть еще поясните пожалуйста?

419
gyurgin_ @gyurgin_
Может и не принимать Ваш DNS, ну или провайдера, да это и не надо, все стараются работать по ip, ну или через чето жесткое типа яндекса, Мир же слушает, абы как тут не сделаешь. Вобще мне схема работы непонятна, можно иметь копии серверов хоть сто и имея один входной стабильный тупо их раскидывать куда удобно банальным перманентом.

21
serg_amigo @serg_amigo
Я написал скрипты. Первый на винде через 2 минуты проверяет доступен ли основной балансировщик. Если не доступен то меняет ip адрес домена на резервный сервер балансировщика. Второй скрипт с помощью крона запускается на релеях и проверяет доступен ли через ip айскаст еcли нет то перезагружает с конфигурацией 2 где прописан ip резервного балансира... как то так. Всем спасибо за помощь и советы... Честно думал на данном форуме как то больше специалистов

Отредактировано serg_amigo - 14.05.2019
419
gyurgin_ @gyurgin_
Да я даже сейчас не понял что за зверскую схему Вы придумали. Балансировщик нужен и проверка доступности? Так на веб сервере написали бы php скрипт который приверит ну например количество слушателей и там и там (нет ответа - сервер сдох) и отправит слушателя в нужное место таким вот банальным способом: header('Location: ********** true, 307);. Не, ну разумеется костыль с кронами куда интересней))

21
serg_amigo @serg_amigo
gyurgin_ пишет:

Да я даже сейчас не понял что за зверскую схему Вы придумали. Балансировщик нужен и проверка доступности? Так на веб сервере написали бы php скрипт который приверит ну например количество слушателей и там и там (нет ответа - сервер сдох) и отправит слушателя в нужное место таким вот банальным способом: header('Location: ********** true, 307);. Не, ну разумеется костыль с кронами куда интересней))


Я вроде описал схему, что зачем и куда нужно. Нужно иметь сервер балансировки и два сервера релея. Если релей отвалился, например хостер обнолвет сервер то балансировщик на него клиентов не будет слать. Но вот, если хостер где установлен балансировщик затеит ремонтные работы то уже не один релей потоков иметь не будет. Что тогда? Вот и пришлось придумать второй резервный сервер с этими же потоками, а что бы переключался на второй организовать скрипт переключения на второй конфиг где указан второй сервер балансировки. Как то так )

Кстати может уже существует скрипт парсер статистики с этих двух релеев. Задача проста как мир. Нужно собирать в базу через определенный интервал статистику по маунтам. Потом через веб браузер можно выбрать дату время и посмотреть количество слушателей... ну или что бы за сутки можно было построить график с количеством слушателей... так даже прикольней
Есть у кого в загашнике нечто такое готовое чтобы перепелить под себя?

419
gyurgin_ @gyurgin_
Да как то все не так. Конкретной задачи я так и не понял, зачем master-slave при таком раскладе, может просто сделать два одинаковых или энкодить на два нет ресурсов? И входная точка для слушателей должна быть доступна при любом раскладе, а то это совсем колхоз. Ну есть же возможность вменяемого провайдера найти, облачное что-то, ну google appengine например, я только что проверил, прекрасно справляется.
А по поводу статистики, да даже схему с YP никто не даст, тут слишком все индивидуально. А есть кого считать? Ничего ж я так понимаю толком еще не работает...

21
serg_amigo @serg_amigo
gyurgin_ пишет:

Да как то все не так. Конкретной задачи я так и не понял, зачем master-slave при таком раскладе, может просто сделать два одинаковых или энкодить на два нет ресурсов? И входная точка для слушателей должна быть доступна при любом раскладе, а то это совсем колхоз. Ну есть же возможность вменяемого провайдера найти, облачное что-то, ну google appengine например, я только что проверил, прекрасно справляется.
А по поводу статистики, да даже схему с YP никто не даст, тут слишком все индивидуально. А есть кого считать? Ничего ж я так понимаю толком еще не работает...

Толком уже давно все работает. На одном из ресурсов уже 1500 слушателей в день в пике днем. Стало потреблять 30 Тб в месяц провайдеры стали жаловаться на трафик. Пришлось раскидать на две виртуальные машины через балансир. Теже облака начнут считать трафик...я прикинул у яндекса получится более 30 т.р. в месяц. Можно взять конечно СДН профессиональный но это будет в 10 раз дороже если использовать виртуальные машины свои со своим "колхозом" как вы выразились... Как итог я имею свой CDN за низкую стоимость с автоматическим переключением на резервный балансировщик в случае проблем на основном. Организовать конечно можно было и плеер на два потока но подключается же не только сайт но и партнерские сайт где тупо прописана ссылка на доменное имя с потоком

419
gyurgin_ @gyurgin_
Да я не предлагаю гонять поток через облака. Внешний сервер тупо служит гарантом доступности и делает редирект, исходящего трафика практически не будет.

21
serg_amigo @serg_amigo
gyurgin_ пишет:

Да я не предлагаю гонять поток через облака. Внешний сервер тупо служит гарантом доступности и делает редирект, исходящего трафика практически не будет.

не знаю как у гугла но яндекс балансировщик может подключить только купленные у них же виртуальные сервера. Это и остановило от реализации на их облаке.
А гугл и амазон облака это тоже в зоне риска. Завтра их заблочит роскомнадзор шо делать тогда...

419
gyurgin_ @gyurgin_
Я вобще не предлагал никаких балансировщиков. Ничего Вы в общем не поняли. Просто где угодно php скрипт принимает запрос на прослушивание и делает редирект, это сработает и никакого колхоза не надо.

21
serg_amigo @serg_amigo
gyurgin_ пишет:

Я вобще не предлагал никаких балансировщиков. Ничего Вы в общем не поняли. Просто где угодно php скрипт принимает запрос на прослушивание и делает редирект, это сработает и никакого колхоза не надо.

Тогда поясните, пожалуйста, вашу идею более подробно.
PHP скрипт стоит где на сервере на сайте? Как он будет распределять слушателей по потокам что бы не нагружать один сервер?

419
gyurgin_ @gyurgin_
Ну вот примерный листинг:
<?php
/*
каждому серверу в вебрут добавляем файл listeners.xsl, вот такой:

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="yes" method="text" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="no" encoding="UTF-8" /><xsl:strip-space elements="*"/>
<xsl:template match = "/icestats" >
<xsl:for-each select="source">
<xsl:value-of select="listeners" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

к скрипту обращаемся вот так: script.php?mount=stream.mp3
можно имитировать обращение как к icecast, вот пример для nginx (часть секции)

listen 8001;
root /var/www/html/;
index script.php;
rewrite ^/(.*)$ /script.php?mount=$1 last;
*/
$server1 = 'http://<первый сервер>:8000/';
$server2 = 'http://<второй сервер>:8000/';
if (isset($_REQUEST['mount'])) {
$listeners1 = $listeners2 = false;
set_error_handler(function($severity, $message, $file, $line)
{
throw new ErrorException($message, $severity, $severity, $file, $line);
});
try {
$listeners1 = (int) file_get_contents($server1 . '/listeners.xsl?mount=/' . $_REQUEST['mount']);
}
catch (Exception $e) {
}
try {
$listeners2 = (int) file_get_contents($server2 . '/listeners.xsl?mount=/' . $_REQUEST['mount']);
}
catch (Exception $e) {
}
restore_error_handler();
if (!$listeners2 && !$listeners1) {
header('Refresh:0'); // оба сервера недоступны тут я не доктор, например пробуем снова
} elseif (!$listeners1 && $listeners2) {
header('Location: ' . $server2 . $_REQUEST['mount'], true, 307); // недоступен первый, отправляем слушателя на второй
} elseif (!$listeners2 && $listeners1) {
header('Location: ' . $server1 . $_REQUEST['mount'], true, 307); // недоступен второй, отправляем слушателя на первый
} else {
if ($listeners1 > $listeners2) { // доступны оба сервера, отправляем туда, где меньше слушателей, если одинаково на первый
header('Location: ' . $server2 . $_REQUEST['mount'], true, 307);
} else {
header('Location: ' . $server1 . $_REQUEST['mount'], true, 307);
}
}
}
?>

21
serg_amigo @serg_amigo
gyurgin_ пишет:

Ну вот примерный листинг:
<?php
/*
каждому серверу в вебрут добавляем файл listeners.xsl, вот такой:

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="yes" method="text" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="no" encoding="UTF-8" /><xsl:strip-space elements="*"/>
<xsl:template match = "/icestats" >
<xsl:for-each select="source">
<xsl:value-of select="listeners" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

к скрипту обращаемся вот так: script.php?mount=stream.mp3
можно имитировать обращение как к icecast, вот пример для nginx (часть секции)

listen 8001;
root /var/www/html/;
index script.php;
rewrite ^/(.*)$ /script.php?mount=$1 last;
*/
$server1 = 'http://<первый сервер>:8000/';
$server2 = 'http://<второй сервер>:8000/';
if (isset($_REQUEST['mount'])) {
$listeners1 = $listeners2 = false;
set_error_handler(function($severity, $message, $file, $line)
{
throw new ErrorException($message, $severity, $severity, $file, $line);
});
try {
$listeners1 = (int) file_get_contents($server1 . '/listeners.xsl?mount=/' . $_REQUEST['mount']);
}
catch (Exception $e) {
}
try {
$listeners2 = (int) file_get_contents($server2 . '/listeners.xsl?mount=/' . $_REQUEST['mount']);
}
catch (Exception $e) {
}
restore_error_handler();
if (!$listeners2 && !$listeners1) {
header('Refresh:0'); // оба сервера недоступны тут я не доктор, например пробуем снова
} elseif (!$listeners1 && $listeners2) {
header('Location: ' . $server2 . $_REQUEST['mount'], true, 307); // недоступен первый, отправляем слушателя на второй
} elseif (!$listeners2 && $listeners1) {
header('Location: ' . $server1 . $_REQUEST['mount'], true, 307); // недоступен второй, отправляем слушателя на первый
} else {
if ($listeners1 > $listeners2) { // доступны оба сервера, отправляем туда, где меньше слушателей, если одинаково на первый
header('Location: ' . $server2 . $_REQUEST['mount'], true, 307);
} else {
header('Location: ' . $server1 . $_REQUEST['mount'], true, 307);
}
}
}
?>



Не плохо. Хороший пример. Но как быть с слушателями которые слушают через плеер? И еще вопрос. Существует ли возможность авто переключения плеера если сервер 1 стал не доступен без обрыва вещания.... или с минимальным?

Отредактировано serg_amigo - 23.05.2019
419
gyurgin_ @gyurgin_
Приветствую, Да нормальный рабочий пример, как быть с слушателями... Да никак, ты сначала попробуй и потом пиши, нормально любой плеер схавает редирект, протокол то не мы выдумали, он общий для всех. Проброс слушателей если я правильно понял задачу невозможен просто тупо если сервер сдох то и некому это исполнить.

21
serg_amigo @serg_amigo
gyurgin_ пишет:

Приветствую, Да нормальный рабочий пример, как быть с слушателями... Да никак, ты сначала попробуй и потом пиши, нормально любой плеер схавает редирект, протокол то не мы выдумали, он общий для всех. Проброс слушателей если я правильно понял задачу невозможен просто тупо если сервер сдох то и некому это исполнить.

Подскажите еще плиз как вещать для ПК, андроид и ios Например в 10 айфоне работает m3u но такая ссылка не работает для андроид. Как организовать правильно вещание для всех типов устройств? Что использовать лучше для вставки в начале вещания своего джингла?

Отредактировано serg_amigo - 26.05.2019
419
gyurgin_ @gyurgin_
Да никак, я вобще не понимаю чем Вы там на ios играете m3u и кто вобще такой бред выдумал... Как организовать? Написать приложения, сделать сайт. Прероллы нужны, ну смотрите ********** <intro>/intro.ogg</intro>, только лучше не надо, не понравится это слушателям если будете им при каждом подключении проигрывать, а контроль Вы врядли осилите.

Отредактировано gyurgin_ - 27.05.2019
21
serg_amigo @serg_amigo
gyurgin_ пишет:

Да никак, я вобще не понимаю чем Вы там на ios играете m3u и кто вобще такой бред выдумал... Как организовать? Написать приложения, сделать сайт. Прероллы нужны, ну смотрите ********** <intro>/intro.ogg</intro>, только лучше не надо, не понравится это слушателям если будете им при каждом подключении проигрывать, а контроль Вы врядли осилите.

Подскажите, плиз, тогда вы какую ссылку играете для ios айфон 10 и выше ?