Ik vraag me iets af. Stel ik maak een website en op die website kan ik fotoalbums plaatsen. Nu is de server waar die website op staat slechts 10 mb (dit is slechts even als voorbeeld). Nu is na een paar albums die server dus al vol.
Ik kan nu (grofweg) 2 dingen doen. Ik vergroot de capaciteit op de server naar 20 mb, maar dan heb ik over een tijdje hetzelfde probleem. Nu vraag ik me af of het mogelijk is om servers "bij te prikken". Dus stel, de eerste 10 mb zijn vol, dan hang ik er een nieuwe server bij, waardoor ik dus 20 mb heb. Maar nu komt het. Ik heb maar 1 website url, en die kan niet bij 2 servers terecht komen. De servers moeten dus met elkaar "praten". Server 1 moet dus tegen server 2 zeggen dat hij een fotoalbum nodig heeft wat op server 2 staat. Volgens mij zijn hier hardwarematige oplossingen voor, maar wat ik me vooral afvraag is of je hier in je code op de een of andere manier rekening mee moet houden. Of gaat dat allemaal hardwarematig en merk je er eigenlijk helemaal niks van dat je met 2 servers werkt?
Zoiets is te doen onder php als dit, het is een afgeleide van het Linux/Unix verhaal genaamd df -h of diskfree human readable;
<?php
// $df contains the number of bytes available on "/"
$df = disk_free_space("/");
// On Windows:
$df_c = disk_free_space("C:");
$df_d = disk_free_space("D:");
?>
Thanks Yoop, maar is dat ook noodzakelijk om in je code te regelen? Dat is eigenlijk mijn vraag. Of regelt de hardware dit automatisch? Laat ik het anders vragen: kan hardware simuleren dat er maar 1 server is, terwijl het er in werkelijkheid honderden zijn? Kan je met hardware "faken" dat die honderden afzonderlijke servers als 1 server worden behandeld? Dus stel je wilt foto's ophalen uit het mapje yoopovermaat/pictures, dat die hardware dan automatisch ziet, aha ... dat mapje staat op server 68 in het serverpark in Los Angeles.
Thanks Ward, nogal technisch allemaal terwijl ik eigenlijk maar 1 vraag heb, en dat is of je er in de code rekening mee moet houden, of is alles via de hardware te regelen?
Laat ik de vraag nog eens wat interessanter stellen. Stel je begint met een hele kleine website, en die website wordt dusdanig groot dat je met meerdere servers wilt gaan werken. Moet je dan al je PHP code gaan aanpassen?
==>> De servers moeten dus met elkaar "praten". Server 1 moet dus tegen server 2 zeggen dat hij een fotoalbum nodig heeft wat op server 2 staat.
In geval van Linux of Unix servers kan je storage op NFS protocol koppelen. Hier al eerder genoemd, mounten van de storage van server B op server A. Je moet dan wel root rechten hebben op beide servers. Heb je dat niet dan beland je in andere meer knullige oplossingen die feitelijk geen oplossing zijn. Het Network File System, of kortweg NFS, is een netwerkbestandssysteem dat oorspronkelijk werd ontworpen door Sun Microsystems in 1984 voor hun eigen Unix-werkstations. NFS maakt het mogelijk om bestanden op te vragen over het netwerk op dezelfde manier als men dit zou doen voor bestanden op de lokale schijf. NFS bestaat enkel uit een bestandssysteem en heeft niets te maken met procesbeheer of geheugenbeheer.
==>>Laat ik de vraag nog eens wat interessanter stellen. Stel je begint met een hele kleine website, en die website wordt dusdanig groot dat je met meerdere servers wilt gaan werken. Moet je dan al je PHP code gaan aanpassen?
In dit geval moet je echt gaan load balancen en met de juiste load balancing hoef je GEEN code aan te passen. Hierbij kan je denken aan een hardware loadbalancer op poort 80/433 die de load naar verschillende apache servers delegeert. De onderliggende storage kan via NFS lopen maar ook op andere redundante manieren zoals Business Continuity and Data Protection van EMC. Hetzelfde geldt grofweg voor MySQL maar komt iets meer bij kijken qua beheer.
Thanks Yoop, maar is dat ook noodzakelijk om in je code te regelen? Dat is eigenlijk mijn vraag. Of regelt de hardware dit automatisch? Laat ik het anders vragen: kan hardware simuleren dat er maar 1 server is, terwijl het er in werkelijkheid honderden zijn? Kan je met hardware "faken" dat die honderden afzonderlijke servers als 1 server worden behandeld? Dus stel je wilt foto's ophalen uit het mapje yoopovermaat/pictures, dat die hardware dan automatisch ziet, aha ... dat mapje staat op server 68 in het serverpark in Los Angeles.
Jup dat zul je in je code moeten regelen maar zo heel erg veel werk is het niet. Je hebt allereerst een toegangspunt nodig. Main entrance waar je je afbeelding upload.
Vanaf hier krijg je te maken met het df -h verhaal.
-> verbinding databases
-> query (welke server = het minst bezet qua schijfruimte) schrijf hem daar weg
-> wegschrijven van het plaatje in een directory
-> Adres van het plaatje wegschrijven in een database id, naam, serveradres
-> Opvragen van het plaatje via een link in html -> link -> php-> query....
@Yoop: Op een x moment is server A bezet qua schijfruimte en blijf je dan voor elke foto dan nog deze procedure uitvoeren of verander je dan je code weer omdat server A volledig bezet qua schijfruimte??
Yoop, wat Aad zegt is wat ik bedoelde. Dat lijkt me ook veel handiger. In je code maakt het dan niet uit op welke server iets staat. De code moet enkel zeggen: sla plaatje x op in map "pictures", en die load balancer die moet dan bepalen op welke server dat plaatje wordt gezet en waar het moet worden opgehaald.
Aad, beschrijf ik het bovenstaande zo goed? Klopt het wat ik zeg? Ik heb er zelf geen kaas van gegeten, maar het is fijn om te weten dat als ik ooit een site hebt die uit de klauwen groeit, ik niet alle code hoef aan te passen. Waarschijnlijk moet ik dan wel een expert inhuren om zo'n load balancer in te stellen :)
@Ozzie: Een load balancer plaats je doorgaans aan de voorkant, een load balancer (hardware) verdeelt het verkeer (http/https) over meerder apache servers (hardware). De apache servers spreken een gezamenlijke grote storage (disks/disk array) aan en slaan daar de plaatjes centraal op (storage server). De MySQL data wordt op zich weer bediend door een separate MySQL server met eigen storage (disks).
In jouw eerdere voorbeeld/vraag (server A server B) is het zinvol om een storage koppeling met een NFS mount te realiseren.