Serverlast verteilen?

Status
Für weitere Antworten geschlossen.

MacGyver77

Benutzer
Mal eine technische Frage:

Wer hat denn mal eine gescheite idee, wie man die Hörer auf mehrere Server verteilen kann...

also sagen wir mal ich habe 3 server (2 Relay), die jeweils alle ein limit von 200 Hörern haben...

der erste server hat nun 100 User... die anderen sind noch leer...

wie könnte man nun hingehen und zb. diese 100 hörer dynamisch verteilen...

also wenn der "nächste" kommt den auf den server 2 leiten, bis der auch knapp 100 hat und dann wieder den 3ten...

na? versteht mich einer?

Meine Eigene lösung wäre...
dort wo ich auf der HomePage die Verlinkung mache einfach vorher abfragen:

if user auf server 1 >= 100 then link auf server 2... usw...

---
Ob das nun sinn macht ist ja nicht das thema..aber hat da jemand ne idee= !=?
 
AW: Serverlast verteilen !?

Ist es Shoutcast? Da gabs im Shoutcast Forum mal ein PHP Script zu, ich glaub das hier. Hab nicht gross drüber geguckt, hab ja keine Ahnung vom Programmieren.

<?
##Settings##

//Define all servers here (add more if needed)
$server_address[0]='65.75.186.30';
$server_port[0]=8400;
$server_title[0]='fuseRADIO 24/7 Mix';

$server_address[1]='67.19.102.78';
$server_port[1]=8010;
$server_title[1]='fuseRADIO 24/7 Mix';

$server_address[2]='67.19.102.78';
$server_port[2]=8012;
$server_title[2]='fuseRADIO 24/7 Mix';

//Set mode (either load_balancing, random, or new_random)
// $mode='load_balancing';
// $mode='random';
$mode='load_balancing';

##Settings complete##

if($mode=='random'){
mt_srand((double) microtime() * 1000000);
for($i=0; $i<count($server_address); $i++){
$server[$i]=mt_rand(0, count($server_address)-1);
for($j=0; $j<$i; $j++){
if($server[$j]==$server[$i]){
$i--;
break;
}
}
}

}
elseif($mode=='load_balancing'){
//This is really not a good way to do this since each request will
//query all the servers. It would be better to have a cache that is updated
//periodically (file or database) and just grab the current numbers from there,
//but since this is just something to go off of I will do it by contacting each
//server.
for($i=0; $i<count($server_address); $i++){
$fp = fsockopen($server_address[$i], $server_port[$i], $errnum, $errstr, 2);
if ($fp){
$buffer='';
fwrite($fp, "GET /7.html HTTP/1.0\r\nUser-Agent: Playlist Generator(Mozilla)\r\n\r\n");
while(!feof($fp)){
$buffer.=fread($fp, 1024);
}
fclose($fp);
$data=eregi_replace(".*<body>(.*)</body>.*", '\1', $buffer);

$numbers=explode(",", $data);

$lnr[$i]=$numbers[0];
$mx[$i]=$numbers[3];
$percent_filled[$i][0]=$numbers[0]/$numbers[3];
$percent_filled[$i][1]=$i;
}
else{
$lnr[$i]=$listen;
$mx[$i]=$max;
$percent_filled[$i][0]=1.1;
$percent_filled[$i][1]=$i;
}

}
sort($percent_filled);
reset($percent_filled);
for($i=0; $i<count($server_address); $i++){
$server[$i]=$percent_filled[$i][1];

}
}
elseif($mode=='new_random'){
//Doubt it is useful for this, but if you had a LARGE number of servers this would
//be faster since in the other random there are only as many random numbers as servers
//and technically you could get stuck in a for loop for a long time trying to get an unused
//random number. This method uses 1000 times the number of servers so the probability
//of getting repeats is much less meaning less time in the for loop that makes sure the
//random numbers are unique.
mt_srand((double) microtime() * 1000000);
for($i=0; $i<count($server_address); $i++){
$rand[$i][0]=mt_rand(0, (1000*count($server_address)));
$rand[$i][1]=$i;
for($j=0; $j<$i; $j++){
if($rand[$j][0]==$rand[$i][0]){
$i--;
break;
}
}
}
sort($rand);
reset($rand);
for($i=0; $i<count($server_address); $i++){
$server[$i]=$rand[$i][1];
}

}
else{
for($i=0; $i<count($server_address); $i++){
$server[$i]=$i;
}
}
$totall=$lnr[$server[0]]+$lnr[$server[1]]+$lnr[$server[2]];
$totalm=$mx[$server[0]]+$mx[$server[1]]+$mx[$server[2]];
$total_entries=count($server_address)+1;


header("Content-Type: audio/x-scpls");

echo("[playlist]\n");
for($i=0; $i<count($server_address); $i++){
$file=$i+1;
echo('File'.$file.'=http://'.$server_address[$server[$i]].':'.$server_port[$server[$i]].'/');
echo("\n");
echo('Title'.$file.'=(#'.$file.' '.$lnr[$server[$i]].'/'.$mx[$server[$i]].') '.$server_title[$server[$i]].'');
echo("\n");
echo("Length$file=-1\n");
}
echo("File4=http://hmmm:8743/");
echo("\n");
echo("Title4=Current total listeners (".$totall."/".$totalm.")");
echo("\n");
echo("Length4=-1\n");
echo("NumberOfEntries=$total_entries\n
Version=2\n");

?>
 
AW: Serverlast verteilen?

Sprich mal Deinen Provider an. Es besteht die Möglichkeit über ein sogenanntes Lost-Balance das ganze zu verteilen, somit sicherst Du gleich mehere Faktoren. Zum einen wird der einzelne Server nicht überlastet, zum anderen ist bei einem Ausfall meist nur ein Teil weg.
 
AW: Serverlast verteilen?

Nur kleine Korrektur. Es heisst Load-Balancer, nicht Lost-Balancer.
Nein, kein Klugscheissen, ich will vermeiden, das der Op was falsches frägt ;)

Ich würde, bei entsprechenden Hörerzahlen, auch zu einem Loadbalancer raten, was allerdings ganz schön ins Geld gehen kann. Billige Arten von Loadbalancing arbeiten, wie der Shoutcast, wenn der Stream voll ist, wird der nächste Server genommen. Bei dynamischer Lastverteilung ist eigene Hardwäre nötig, die die Lastvertilung in Echtzeit berechnet. Kostet von Cisco für bis zu 8 Server ca. 18.000 €, wenn man das Teil kauft ;) Hab kürzlich so ein Gerät eingebaut, daher kenn ich den Preis.
 
AW: Serverlast verteilen?

Stimmt Pegasus, sorry.....

Naja ich denke kaum das er kaufen möchte, aber wie gesagt man kann sich ja Informationen einholen von diversen Anbietern was die verlangen. Ich habe Angebote für 3 Server mit Load-Balancing zwischen 1000 und 1500 Euro im Monat, ausgelegt auf 1200 Hörer maximal incl. der anfallenden Traffic.

Das einmal als Info in welcher Größenordnung man schon Rechnen sollte.
 
AW: Serverlast verteilen?

Dann hast du aber ein durchaus günstiges Angebot, wenn ich vorrausetze, das der Service und die Qualität stimmt.
Sag doch einfach mal den Anbieter, das dürfte dem OP evtl. auch helfen und mich interessierts auch ;)
Wäre also völlig OnTopic und mehrfach Hilfreich, wenn jemand die Suche benutzt.
 
AW: Serverlast verteilen?

Sorry, da bestimmte Angebote auch exclusive Angebote waren, kann ich Dir gerne mal eine Info per PM zukommen lassen, dies aber hier nicht öffentlich stellen. Ich kann jedoch gerne mal die Anbieter anregen sich hier selber mal einzubringen, ob die dies tun steht auf einem anderen Blatt.
 
AW: Serverlast verteilen?

Schicks mir mal bitte per PM, da sowas evtl. interessant wird. Zwar nicht als Streamserver, aber für nen Webauftritt, der viele Zugriffe verkraften muss.
 
AW: Serverlast verteilen?

Pegasus: ich bin da zwar länger nicht mehr aktiv, aber mir war so als würde zumindest der apache "round-robin" konfigurierbar sein. Ist zwar dann keine super load-balancing Lösung aber günstiger wenn es rein um die Aufteilung der Last geht.
 
AW: Serverlast verteilen?

Ja, die Lösung kenn ich, ist aber nicht Lastbasiert. Ich brauch ne 100%ig skalierbare Lösung, und das geht leider nur mit nem externen Loadbalancer auf Hardwarebasis. Kostet zwar ne Menge geriebenes, aber, wie ich immer sage, mann kann nur erfolgreich sein, wenn man ein Konzept konsequent umsetzt ;)
 
AW: Serverlast verteilen?

Für die Streamlastverteilung gibt es viele Lösungen.

Ich war an der Realisierung einer Lösung beteiligt die neben der reinen Lastverteilung vorallem auch eine Ausfallabsicherung zum Ziel hatte, also fällt ein Server aus kommen die Hörer auf die anderen Server und ist der Server wieder da, wird dieser bevorzugt mit Hörern bestückt.
Diese Lösung wurde für Icecast realisiert. Die Verteilung erfolgt dabei durch einen ASP-Script der in die Webseite integriert ist. Er sorgt dafür das alle Server entsprechend ihrer Kapazität exakt gleich ausgelastet sind. Verschiedene echte Internet-Störungen konnten damit bereits abgefangen werden. Der Hörer hat dabei meist nur einen Streamabbuch von unter 1-2 Sekunden. Mehr dazu gerne, falls interesse besteht.

Eine ganz einfache Lösung ist z.B. im DNS-Server für die Sub-Domain die zur Adressierung des Streamservers verwendet wird (z.B. live.xyz-radio.de) zwei oder mehr IP-Adressen einzutragen. Normalerweise erhält dann der Player/PC des Hörer eine dieser IPs. Ist primitiv, funktioniert aber evtl. nicht mit jedem DNS-Server. Muss man also testen.
 
AW: Serverlast verteilen?

Ich würde das so machen wie von Thomas67 vorgeschlagen - "Load Balancing" via DNS-Eintrag. Glaube das ist unter dem Begriff "Round Robin" in der Bind-Doku zu finden.

Beim Bind DNS-Server geht das - grob gesagt - so:

Für einen bestimmten Hostnamen, zB "stream.meinwebradio.com" werden mehrere IP-Adressen in das Zonefile eingetragen. Der DNS-Server gibt für jede Anfrage eine dieser IP-Adressen zurück, so dass sich die Last relativ gleichmäßig auf alle Maschinen verteilen sollte.

Mit Shoutcast sollte das von Haus aus zusammen funktionieren, iirc stellt Shoutcast sowieso alle Streams mit der gleichen Quelle u. der gleichen Bitrate als "Cluster" dar.

Ein Nachteil dieser Lösung ist aber, dass ein evtl ausgefallener Server trotzdem weiterhin Anfragen bekommt. Ist aber mE bei sowas zu verschmerzen, der User würde noch mal eine Verbindung probieren u. würde dann mit großer Wahrscheinlichkeit auf eine andere Maschine kommen.

Grüße
 
AW: Serverlast verteilen?

Wie verteilt ihr dann das Audio? Direkt von einem Encoder auf alle Maschinen, nehme ich an, weil Clustering auf Relaybasis des Shoutcasts würde ja nicht gehen, bricht ein Server zusammen, ist auch bei den anderen Feierabend?!
 
AW: Serverlast verteilen?

Wer ein Loadbalancing auf DNS-Basis macht, kann es sich gleich sparen. Damit erreicht man weder eine redundanz noch eine effektive Lastverteilung, da lediglich nach Anfragen und nicht nach effektiver Serverlast routet.

Da ist Relaying effektiver, da dabei wenigstens ausfallende Relays keine Anfragen mehr erhalten.

Also wenn schon Loadbalancing, dann bitte richtig oder besser gar nicht. Wer ein solches nötig hat, und auf solche Spielzeuglösungen zurückgreift, sollte besser gleich mit Radio aufhören, da am völlig falschen Ende gespart wird.
 
AW: Serverlast verteilen?

Die Verteilung per DNS ist natürlich nur eine primitive Lösung.

@Hinztriller:
Bei dem von mir betreuten Projekt werden die Streams zunächst an einem im LAN installierten lokalen Icecast-Server geschickt, der als Quelle für alle anderen Streaming-Server dient. Grund ist vorallem der Encoder Oddcast, der einen Stream nur an einen Server/IP schicken kann. Oddcast ist leider so dumm, dass wenn man zwei gleichartige Streams konfiguriert es die Daten nicht einfach einmal encodiert und zweimal verschickt, sondern es braucht dann auch die doppelte CPU-Zeit. Deshalb vorallem der lokale Icecast-Server.

Genauers dazu schreibe ich hier in einigen Tagen.
 
AW: Serverlast verteilen?

Und was soll dir das jetzt bringen? Dir ist klar, das jede Instanz eines Shoutcast Ressourcen braucht und du damit die Last nicht verteilst, sondern erhöhst?
 
AW: Serverlast verteilen?

Ich möchte die Last nicht verteilen, ich habe 2 webradios und die wollte ich jetzt zu einem stream verbinden.. Falsch gemacht?
 
AW: Serverlast verteilen?

Mal ne Frage zu dem Script von Hinztriller, wie und wo muss man das einsetzen das es funktioniert? Kann mir da jemand mal bitte eine Info zukommen lassen?

Danke!

Gruß
 
AW: Serverlast verteilen?

Das Script muss als Playlist aufgerufen werden. Dann prüft es, auf welchen Server die wneigsten Leute sind und generiert eine Playliste mit der entsprechenden URL/IP.
Zumindest beim kurzren überfliegen würde ich das so behaupten ;)

Ich würde ds ganze als .pls speichern und dem Server verklickern, das er .pls-Files durch PHP jagen soll, denn es ist denkbar, das einige Player ein problem damit haben, PHP-Files zu öffnen.
 
AW: Serverlast verteilen?

Ok, sehe schon bis ich meinem Server verklicker was er machen soll, verklickert er mir etwas anderes :D oder kannst Du mir erklären wie ich es Ihm verklicker?

Andere Frage, Shoutcast hat doch so ne Funktion, das er auf einen anderen Server weiterleitet, wenn er voll ist, welchen Teil der Config muss ich mir denn da anschauen?

Danke für die Infos!

Gruß
 
AW: Serverlast verteilen?

Mensch Pferdchen, wenn Du weißt wies geht, dann lass mich mal an Deinem Wissen schnüffeln, denn ich habe keinerlei Ahnung davon und würde es gerne haben. Also wäre ich Dir dankbar wenn Du das kurz schreibst, weil Andere brauchen das vielleicht auch!

Danke!

Gruß
 
AW: Serverlast verteilen?

Dir ist klar, das ich jetzt extra in die COnfig schaun muss, weil ich die Optionen auch nicht auswendig weiss?

Für das Relay, also den "zweiten" Server

; RelayPort and RelayServer specify that you want to be a relay server.
; Relay servers act as clients to another server, and rebroadcast.
; Set RelayPort to 0, RelayServer to empty, or just leave these commented
; out to disable relay mode.
RelayPort=8000
RelayServer=192.168.1.58

Für die Quelle, also Server 1

; AllowRelay determines whether or not other SHOUTcast servers will be
; permitted to relay this server. The default is Yes.
AllowRelay=Yes

; AllowPublicRelay, when set to No, will tell any relaying servers not
; to list the server in the SHOUTcast directory (non-public), provided
; the relaying server's Public flag is set to default. The default is
; Yes.
AllowPublicRelay=Yes

Die IP des Relais sollte man möglichst aus der Statistik ausgrenzen, da sonst die average listen time nicht stimmt, wie das geht, weiss ich jetzt aber nicht, sollte aber rauszufinden sein.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben