Door Arjen van der Meijden

Software Architect

Tweakers' serverpark anno 2013

09-03-2013 • 08:00

164

Multipage-opmaak

Inleiding

Inleiding

Het is alweer enige tijd geleden dat we een uitvoerig overzicht van onze servers hebben gegeven. Met de start van ons Phoenix-project is er bovendien flink wat veranderd. De recentste toevoeging is onze nieuwe databaseserver Artemis 7. We richten ons in dit artikel op de hardware- en softwareconfiguratie van de servers.

Momenteel gebruiken we 25 fysieke servers om Tweakers in de lucht te houden. Een van de redenen voor dat aantal is dat zo nog een groot deel kan uitvallen voordat je echt niks meer op je scherm krijgt bij een bezoek aan ons :) De servers zijn verdeeld over drie racks. Zoals te lezen is in het Phoenix-verhaal, staan twee daarvan op onze primaire locatie en de derde op de secundaire locatie. Naast de servers zit er nog meer hardware in die racks. We hebben negen switches, drie loadbalancers, zes pdu's, twee kvm-switches, twee 'out of band'-routers en drie racklades in gebruik. In het verhaal over Phoenix is de netwerkstructuur uitvoerig beschreven. Aangezien daar verder niets aan veranderd is, slaan we die in dit verhaal over.

Racks 1 en 2 in EUnetworks en rack '3' in Telecity. Helaas is het moeilijk om rechte foto's te maken in die krappe gangen…

De drie racks lijken erg leeg, maar schijn bedriegt. Achter de bovenste afdekplaten zitten nog de diverse switches (3 à 4 per rack), kabelgeleiders en andere zaken die 'naar achteren' zijn opgehangen, zoals de kvm's en access routers. Die opvallende Google search-appliance is overigens, als enige machine in onze racks, niet voor Tweakers in gebruik; hij doet werk voor onze zustersite Computable.

Zoals je ziet komt er aardig wat bij kijken om een site als Tweakers in de lucht te houden. De vraag of dat 'allemaal wel nodig is' lezen we vaak als we hierover uitwijden. Het is niet zo makkelijk om zomaar 'ja' op die vraag te antwoorden. Wat wij nodig vinden, zal een ander overdreven krachtig of uitgebreid vinden. Wij hebben onszelf echter tot doel gesteld om een hoge uptime te combineren met een zeer goede performance van de site. Beide principes moeten wat ons betreft ook blijven gelden bij zo veel mogelijk onverwachte pieken in de belasting en dat maakt 'overdreven veel' en 'overdreven snelle' hardware noodzakelijk.

Er zijn uiteraard verschillende wegen die naar Rome leiden. Onze structuur is voortgekomen uit een jarenlange uitbreiding van wat ooit een eenvoudige LAMP-stack was. Er zijn op allerlei plekken toevoegingen gedaan om beperkingen van MySQL, PHP of Apache op te vangen. Zelfs Linux is niet helemaal heilig gebleken toen we onze storage-server met OpenSolaris uitwerkten.

Uitbreidingen op LAMP-stack

De toevoeging van allerlei losse services is in veel gevallen ook weerspiegeld in de inzet van een of meer losse servers. Geen van die kerntaken draait op virtuele machines, we vragen doorgaans voldoende van dergelijke servers om ook daadwerkelijk bare metal te kunnen verantwoorden. Daarbij moet wel gezegd worden dat we soms bundels taken op een server combineren, maar daarvoor is uiteraard geen virtualisatie nodig.

Webservers

Bij een bezoek aan Tweakers komt je browser uiteindelijk bij de loadbalancers terecht. Nadat een van de loadbalancers je netwerkverbinding heeft aangenomen, stuurt hij de gegevens door naar een van de webservers. In zekere zin zijn de webservers daarom de belangrijkste servers die we hebben. Zonder die krijg je niets, terwijl als een database onbereikbaar is, je in ieder geval nog een foutmelding kunt krijgen. We hebben daarom drie webservers in elk van beide datacentra, zes in totaal. Op deze manier kan zelfs bij uitval van een van de twee locaties nog steeds een webserver uitvallen zonder dat we daar noemenswaardig last van hebben. Aangezien het dataverkeer voor onze primaire locatie gratis is, sturen we 95% van het verkeer daarheen. Er gaat nog wel 5% naar de secundaire locatie, zodat alle caches gevuld blijven en we zeker weten dat die webservers ook gewoon goed werken.

Onze webservers zijn traditioneel behoorlijk zwaar uitgerust. In tegenstelling tot veel andere sites hebben we dus niet een heleboel lichte servertjes. Dat doen we omdat we niet alleen schaalbaarheid belangrijk vinden, maar ook willen dat iedere individuele request snel wordt afgehandeld. Bovendien beperken we zo het aantal servers in onze racks en de hoeveelheid beheer die daarmee gemoeid is. De hardware is voor alle zes servers dezelfde en bestaat momenteel uit:

Onderdeel6x webserver
Server IBM x3550 M3
Cpu 2x Intel X5675, 3.06GHz hexacore
Geheugen 24GB 1333MHz
Disk 1x 146GB 10K SAS

We combineren overigens de taken van 'reverse proxy'-, web- en applicatieservers in deze machines. Dit hebben we gedaan om zowel de spof's te beperken als om nog wat snellere communicatie tussen de diverse dicht op elkaar zittende diensten te faciliteren.

Voor de schaling is dat uiteraard zowel een voor- als een nadeel. Enerzijds is het eenvoudig om er een webserver bij te zetten, zodat de capaciteit van ieder onderdeel toeneemt, maar anderzijds is het lastig om alleen een specifieke taak, bijvoorbeeld de proxyservers, meer capaciteit te geven. We houden dit soort dingen in de gaten en zijn er ook niet vies van om waar nodig taken naar losse servers te verhuizen.

Drie webservers bij elkaar

Drie van de webservers gebroederlijk bij elkaar

Varnish

De meeste requests komen eerst binnen bij Varnish. Dit is een zeer krachtige en snelle reverse proxy server, die voorkomt dat onze Apaches zich moeten bezighouden met statische content. Denk bij statische content vooral aan plaatjes, JavaScript- en css-bestanden. We maken al een paar jaar gebruik van Varnish, maar met Phoenix hebben we besloten om alle requests via Varnish te laten lopen. De losse Lighttpd voor tweakimg.net is daarmee komen te vervallen. Er zat uiteindelijk geen snelheidsvoordeel in het gebruik van de losse Lighttpd-webserver voor statische content, terwijl het wel extra software was om te beheren.

Iedere Varnish heeft een eigen cache van 5GB, die alleen in ram-geheugen wordt bijgehouden. Ondanks die relatief beperkte cachegrootte, haalt Varnish bij ons een gemiddelde hitrate van ongeveer 97%. Dat betekent dat er van iedere honderd hits op de webserver slechts drie doorgestuurd worden naar Apache. Zo gek is dat natuurlijk niet, want op een pagina van Tweakers staan al gauw meer dan veertig statische elementen. Het zou zonde zijn om dat allemaal door Apache te laten verwerken, terwijl Varnish dat sneller en met veel minder belasting voor de hardware kan.

Apache en PHP

Tweakers is geschreven in PHP. Hoewel we daar elementen van hebben herschreven in Java, komt elke pageview van een bezoeker nog gewoon binnen op PHP. Daarbinnen wordt dan besloten waar de benodigde data vandaan gehaald moet worden. Dat kan onder andere uit MySQL, MongoDB, Memcached, het bestandssysteem en onze Java-back-end zijn. Voor de routing van requests, en om de onderliggende databeheercode en de weergave ervan te scheiden gebruiken we het Symfony Framework.

Doordat Varnish het gros van het webserver-werk op zich neemt, konden we Apache als applicatieserver blijven gebruiken. Er zijn allerlei snellere alternatieven, waaronder Nginx en Lighttpd, maar die zijn doorgaans lastiger te configureren met PHP en vaak minder krachtig of minder flexibel. Bovendien zijn ze vooral sneller voor de requests die bij ons direct door Varnish worden afgehandeld en ze zijn niet (noemenswaardig) sneller dan Varnish. Zodra je alleen nog maar requests doet waarbij PHP actief is, is er nog maar nauwelijks prestatiewinst met de alternatieve webservers te behalen. Het grootste deel van de tijd zit dan toch in zaken waarop de webserversoftware geen invloed heeft, zoals berekeningen in PHP, en queries naar MySQL en andere databronnen.

Engine

Eind 2012 schreven we uitgebreid over onze Java-back-end. Deze noemen we intern, bij gebrek aan een betere naam, simpelweg Engine. Samenvattend komt het erop neer dat MySQL en PHP samen niet goed overweg konden met de complexiteit van onze Pricewatch of de gecombineerde zoekresultaten die met Tweakers 7 geïntroduceerd werden. En omdat we de filtering van specificaties en dergelijke compleet en snel wilden houden, hebben we uiteindelijk alles herschreven in Java.

Om de communicatie met deze Engines zo snel mogelijk te houden en om ook hier geen spof te introduceren hebben we ervoor gekozen om op iedere webserver zo'n Engine te deployen. Ondanks snelle 1Gbit-switches en -nics is het nog altijd veel sneller om met localhost te communiceren dan over het netwerk te gaan.

De omgeving is opgezet als Java Servlet en we hebben daarvoor op iedere webserver een instantie van Tomcat 7 draaien. Deze heeft 8GB ram toegekend gekregen. Voor de liefhebbers: we gebruiken deze Garbage Collection-parameters:

TypeInstellingen
Geheugen -Xms8G -Xmx8G -XX:+UseNUMA
Permgen -XX:PermSize=256M -XX:MaxPermSize=256M
Garbage Collection -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSClassUnloadingEnabled

Met de standaard-garbage-collector, de Parallel Garbage Collector, bleek dat er zo nu en dan een relatief lange application pause ontstond. Dat komt doordat Java de hele applicatie even stillegt om de laatste stappen van het opruimen van de ontstane memory garbage op te ruimen. Afhankelijk van je taak is dat natuurlijk niet per se een probleem; dat geheugen moet toch een keer opgeruimd worden.

Bij ons kwam het daardoor echter voor dat zo'n Engine meer dan twee seconden onbereikbaar was. Het opgeruimd houden van 8GB geheugen kost helaas aardig wat tijd, zelfs op onze snelle hardware. Doordat onze PHP-code automatisch naar een andere Engine verbindt als het te lang duurt, merk je daar als gebruiker verder weinig van, maar het was geen ideale situatie. Met de Concurrent Mark Sweep garbage collector is dat verleden tijd geworden. Deze ruilt een beetje opruimkwaliteit in voor een veel gunstiger pauzeregime. In technische termen: de maximale throughput is wat lager en het geheugen wordt iets minder goed opgeruimd, maar in ruil daarvoor zijn de latencypieken ook veel lager geworden.

ActiveMQ

We gebruiken ActiveMQ, via het Stomp-protocol, om bepaalde zaken vanuit PHP uitgesteld te kunnen verwerken. Het is bijvoorbeeld nergens voor nodig om een logfile direct bij te werken tijdens een pageview, dat mag best een paar minuten later gebeuren. Door deze log-updates in een Message Queue in ActiveMQ te plaatsen zorgen we ervoor dat deze asynchroon met de pageview opgeslagen worden.

Daardoor hoeft niet bij elke pageview een verbinding gemaakt te worden met onze database om vervolgens een insert te doen. We kunnen bovendien tijdens het verwerken meteen verschillende van deze inserts groeperen. Daarnaast kunnen we zo het aantal processen dat tegelijk de data in de database bijwerkt beperken.

Een laatste groot voordeel is dat we de load van onze database kunnen monitoren en het tempo van de verwerking daarop kunnen aanpassen. Als de load stijgt, kunnen we het uitlezen van de message queues vertragen of zelfs tijdelijk pauzeren. Hierdoor kunnen we de invloed van het opslaan van log-gegevens en daarmee de hele databaseload (een beetje) beperken.

ActiveMQ network of brokers

Omdat ActiveMQ zo belangrijk is bij elke pageview, willen we daarmee natuurlijk geen spof introduceren. Vandaar dat we ervoor gekozen hebben om met ActiveMQ een network of brokers op te zetten. In ons geval betekent dit dat iedere webserver een eigen ActiveMQ draait en dat deze de inkomende berichten doorstuurt naar een van twee centrale brokers. De consumers maken verbinding met die centrale instanties om de berichten uit te lezen en te verwerken.

De PHP-code op de webservers probeert eerst de berichten naar de lokale instantie te verzenden, die is tenslotte het snelst te bereiken. Mocht dat niet lukken, dan wordt een van de centrale instanties geprobeerd. Door deze opstelling kunnen de berichten op de lokale server gebufferd worden voordat ze naar de centrale message queue worden verzonden. Al met al moet dat ertoe leiden dat we vrij eenvoudig de verwerking van berichten kunnen pauzeren, vertragen of naar een andere server verhuizen, zonder dat de webservers, en dus de bezoekers, daar last van hebben.

Video

We zijn alweer enkele jaren geleden begonnen met het plaatsen van video's op onze eigen servers. Ondertussen is er zelfs een heuse videoredactie die dagelijks nieuwe video's opneemt op locatie en in onze eigen videostudio. Dat levert uiteraard allerlei technische uitdagingen op. Video's zijn groot, het afspelen ervan over het internet vereist specifieke instellingen bij het transcoderen en het transcoderen naar verschillende versies duurt vrij lang. Dat laatste geldt zeker voor de 1080p- en 720p-versies.

Om te voorkomen dat de videoredactie continu bezig is met het saaie produceren van allerlei losse versies van dezelfde video's wilden we daar veel aan automatiseren. Daar bestaan onder andere allerlei cloudoplossingen voor, externe partijen die het hele proces van video-upload, transcoderen en uitserveren op zich kunnen nemen. Doordat onze volledige colocatie in het datacentrum door True wordt gesponsord bevinden wij ons in een vrij unieke situatie. De kostenberekeningen die op het internet rondzwerven, gaan voor ons niet op. Onze kosten voor stroom, het rack en de bandbreedte zijn immers veel lager dan gebruikelijk, in de meeste gevallen zelfs nihil.

Uiteindelijk kwamen we terecht bij StreamOne. Dit bedrijf biedt een videoserverplatform aan waarmee we zelf servers kunnen plaatsen, die vervolgens voorzien worden van software om video's te serveren, te transcoderen en/of te beheren. In de praktijk lijkt dit platform sterk op ons eigen webserverplatform, maar het bij elkaar zoeken van de juiste software, het bijhouden van videobibliotheken en het uitvogelen van de juiste transcodingparameters is ons hiermee uit handen genomen. Ook kunnen we hiermee live-streams verzorgen, bijvoorbeeld van evenementen bij ons op kantoor.

De hardware voor ons videoplatform bestaat momenteel uit de volgende servers. Voor de specificaties van de VM-host kun je verderop in deze review terecht.

Onderdeel2x Videostreaming2x Videotranscoding2x Videotranscoding/Controller
Server Dell R210 Sun X2270 VM
CPU Core i3 530 2,93GHz 2x Xeon X5570 2,93GHz 6 cores
RAM 8GB DDR3-1066 12GB DDR3-1333 8GB
Storage 1x 160GB SATA 1x 250GB SATA gedeeld met host

Videostreaming

De videostreaming vindt plaats vanaf twee, voor ons doen, eenvoudige webservers. Deze zijn vooral ingericht om domweg meer dan 2Gbit aan netwerkbandbreedte met hun streamingwerk vol te kunnen krijgen. Daarvoor is bij dit soort eenvoudige taken met moderne hardware overigens niet heel veel nodig. Vandaar dat het eenvoudige webservertjes zijn gebleven.

Momenteel hebben we alleen videowebservers in onze primaire locatie. De bandbreedte kost ons daar tenslotte niets. Omdat we toch ook video's willen kunnen blijven serveren als onze primaire locatie uitvalt, komen daar binnenkort nog twee webservertjes bij. Overigens zijn de huidige twee ondertussen afgeschreven, dus die worden dan ook tegelijk vervangen.

Videotranscoding

De videotranscoding vond in eerste instantie alleen op onze VM-servers plaats. Op beide VM-servers hebben we een 'zware' VM geplaatst voor het transcoderen van video's en voor het bijhouden van de meta-informatie ervan. In de praktijk bleek dat de videoredactie vaak verschillende video's vlak achter elkaar uploadt en dat dan vooral bij beurzen lange wachttijden ontstaan voordat een video eindelijk klaar is voor gebruik.

Video webservers en twee oude/nieuwe transcodeservers

Van boven naar beneden: videowebserver Aedon, mailserver Aphrodite en 'nieuwe' videotranscoders Ares en Abaris

Daarom hebben we twee van onze oude webservers teruggeplaatst, die omgebouwd zullen worden tot videotranscodingserver. Deze bieden wat krachtigere cpu-cores en geven daarnaast (beter) directe toegang tot alle speciale cpu-features, zoals SSE3 en SSE4, en het ram-geheugen. Bovendien hoeven we met deze servers niet bang te zijn dat andere taken (op andere VM's) er last van krijgen en kunnen we ze daarom tot de volle 100% belasten. De twee transcodingservers op de VM-servers blijven voorlopig ook gewoon meedraaien, waardoor we de capaciteit ruimschoots verdubbelen.

De VM's zijn behalve voor transcoding ook verantwoordelijk voor de opslag van de video's en het bijhouden van de metadata. De metadata wordt in een MySQL-database bijgehouden. Aangezien die verder relatief licht belast wordt, kon die gewoon op een van de twee VM's meedraaien.

Voor de opslag van de video's wordt gebruikgemaakt van de centrale nas-opslag. Het belangrijkste dat de VM hierbij doet is het coördineren van de bestandsopslag en het doorgeven van bestanden aan de videowebservers.

Databases en filestorage

Tweakers begon jaren geleden met enkel een normale rdbms en PHP-code die daarin alle data opsloeg en weer uithaalde. Hoewel Femme bij de allereerste webserver per ongeluk voor MiniSQL (afgekort mSQL) koos, werd dat kort daarna MySQL en na al die jaren wordt het grootste deel van de gegevens van Tweakers nog altijd in MySQL opgeslagen. We zijn alleen alternatieven gaan gebruiken als daar een goede reden voor was. Momenteel hebben we de volgende servers voor de opslag van gegevens:

OnderdeelMySQL-masterMySQL-slave2x 'NoSQL'2x SearchNas
OS Linux Linux Linux Linux OpenSolaris
Server IBM x3550 M4 Dell R710 IBM x3550 M3 IBM x3550 M3 Sun x4270
CPU 2x E5-2643 3,3GHz 2x X5660 2,80GHz 2x E5645 2,4GHz 2x E5645 2,4GHz 2x E5520 2,26GHz
RAM 256GB DDR3-1600 48GB DDR3-1066 48GB DDR3-1333 48GB DDR3-1333 24GB DDR3-1066
Controller ServeRaid M5110 Perc H700 ServeRaid M5015 ServeRaid M5015 JBOD icm ZFS
OS-disks 2x 250GB SATA 2x 300GB 10k SAS Geen losse 2x 146GB 10k SAS 2x 146GB 10k SAS
Data-disks 6x 256GB SSD 6x 50GB SSD 2x 900GB 10k SAS 2x 900GB 10k SAS 10x 500GB SATA
SSD-accelerator Geen Geen 1x 50GB 2x 50GB

2x 80GB (read),
2x 32GB (write)

MySQL

MySQL heeft een turbulente geschiedenis en stond bekend als een database die veel van de SQL-standaard afweek, niet goed met complexe queries overweg kon en vrij instabiel was. Het grootste voordeel was destijds dat het gratis te gebruiken was en dat het eenvoudig op te zetten was in combinatie met PHP. Daarnaast was het snel met heel simpele queries, het type dat je bij websites veel gebruikt.

Aangezien MySQL in de loop der jaren steeds stabieler is geworden en het tegenwoordig ook redelijk complexe queries aankan, hebben we niet de moeite genomen om over te stappen naar alternatieven, zoals PostgreSQL. Het overstappen zou namelijk veel werk geweest zijn, onder meer omdat een groot deel van de SQL-statements herschreven zou moeten worden om ze te vertalen van MySQL's eigen SQL-dialect in het dialect van de nieuwe database. Al met al wogen de voordelen niet op tegen de nadelen van onder andere veel werk en uren downtime gedurende de migratie.

We slaan het gros van de data op in InnoDB-tabellen, hoewel we nog lang niet altijd alle beschikbare mogelijkheden voor veilige data-opslag gebruiken. Foreign keys werken in MySQL bijvoorbeeld nog steeds een beetje raar.

Momenteel gebruiken we voor MySQL master/slave-replicatie om gegevens veilig te stellen in geval van een calamiteit. We onderzoeken op dit moment of we dat naar multimasterreplicatie kunnen ombouwen.

Databases TC3

Telecity-databases: 'NoSQL'-database Narwhal, Search-server Squid en MySQL-slave Apollo. Onderaan nog backup/nfs-server Athena.

'NoSQL'

Databases hebben doorgaans wat moeite met data die veel wordt aangepast en tegelijk ook veel wordt gelezen. Daarnaast laat SQL weinig flexibiliteit in opslag toe. MySQL is daar geen uitzondering op.

We liepen met onze sessies tegen deze beide beperkingen aan. In de sessies slaan we onder andere een aantal voorkeuren, de tijd van je laatste bezoek en nog een aantal gegevens op. Hierdoor verandert jouw sessie bij elk bezoek aan Tweakers. Bovendien hebben we miljoenen van deze sessie-records in de database staan; die willen we dan ook opgeruimd houden. Periodiek lopen we de verlopen sessies langs om ze uit de database te verwijderen.

Dit samenspel van veel reads, continu lichte updates en af en toe grote deletes bleek echter een behoorlijke aanslag op MySQL te plegen. Daarnaast wilden we de voorkeuren flexibeler kunnen opslaan. Als jij een bepaalde instelling niet hebt gekozen, dan is het zonde als die toch ruimte in de database inneemt en daarnaast willen we juist ook bij nieuwe voorkeuren met een query kunnen nagaan of en hoe vaak ze worden gebruikt. Bij een rdbms betekent het toevoegen van een instelling dat je een kolom aan een tabel moet toevoegen en dat betekent bij MySQL dat de tabel waarin de data is opgeslagen, op de achtergrond helemaal herschreven wordt. Dat levert op zijn beurt enige downtime op bij zo'n grote tabel. Om dat te voorkomen sloegen we de voorkeuren al zodanig op dat MySQL ze domweg als bytes zag, zonder per voorkeur een losse query te kunnen doen.

Al met al leek MongoDB ons een betere keuze voor de sessieopslag. In eerste instantie werd deze samen met MySQL op onze databaseservers gezet, later hebben we het verhuisd naar twee eigen servers. Ook MongoDB draait effectief in master/slave-replicatie, hoewel MongoDB het zelf een 'replica set' noemt. Naast de twee servers draait een van onze managementservers nog een arbiter-instantie, zodat er onder normale omstandigheden drie MongoDB-servers zijn en er altijd een meerderheid is om te bepalen welke de master moet zijn.

Aangezien ook MongoDB nog enige moeite heeft met onze sessies, beraden we ons nog op de vraag of we bij MongoDB blijven of toch nog op zoek gaan naar een andere oplossing.

De bijbehorende NoSQL-servers zijn vooral voorzien van veel geheugen, MongoDB maakt daar gretig gebruik van. Daarnaast kan de raid-controller die we daarin hebben geplaatst gebruikmaken van de 50GB-ssd om zowel lees- als schrijfwerkzaamheden te versnellen.

Naast MongoDB draaien ook Memcached en de centrale ActiveMQ-omgevingen op deze servers.

Memcached

Om te voorkomen dat we voor elk wissewasje een query op MySQL moeten uitvoeren gebruiken we al jaren Memcached. Dit is een centrale geheugen-cache die door de webservers aangesproken kan worden om snel aan gegevens te komen. Memcached wordt vaak ingezet om kleine plukjes informatie te bewaren, die relatief duur zijn om uit de database te halen. Het voordeel van een centrale cache is dat als webserver A iets opslaat, het ook toegankelijk is voor webserver B. Bovendien zorgt dit ervoor dat als webserver C het weer overschrijft, ook A en B de nieuwste versie van de data hebben.

Een goed voorbeeld van waar wij het inzetten, is de reaction count. Bij een lijstje van nieuwsberichten zie je bij elk artikel staan hoeveel reacties er zijn, maar om die te tellen moet je eigenlijk in de reactietabel een vrij 'dure' query uitvoeren. Om te voorkomen dat dit steeds opnieuw gedaan moet worden, wordt de uitkomst in Memcached bewaard. Bij het tonen van een lijst nieuwsberichten worden die cijfers met één multiget opgehaald en kost het veel minder rekentijd dan wanneer we het uit MySQL moeten halen.

Uiteraard slaan we er nog veel meer in op, maar al met al gebruiken we van de 2GB aan cache-grootte slechts zo'n 800MB aan data. Dat lijkt weinig, maar het gaat daarbij alsnog om ruim vijf miljoen records. Omdat we slechts 2GB aan cache voor Memcached hebben en zelfs dat nog ruim is, draait Memcached samen met MongoDB op de NoSQL-servers.

Memcached biedt geen vorm van replicatie. Er wordt van uitgegaan dat je zo veel gegevens in Memcached wil opslaan dat je bij verschillende servers liever alle informatie verspreidt dan dat je het meer dan eens wil opslaan. Aangezien dat voor onze kleine hoeveelheid data niet geldt, hebben we er zelf een replicatielaag omheen gebouwd, zodat we altijd een van twee memcached-servers kunnen aanspreken en data waar nodig in beide wordt bijgewerkt.

Search

Databases zijn over het algemeen niet erg geschikt om te gebruiken als full text search engine. In de loop der jaren zijn er wel wat trucjes voor ontstaan binnen MySQL, maar de ervaring leert dat een specialistische omgeving in de praktijk beter werkt. Bovendien stelt dat ons in staat om ook daarvoor weer dedicated hardware in te zetten.

Voor het forum kwamen we destijds uit op Xapian en diens client Omega. Hoewel deze zoekmachine ons in de loop der jaren goed is bevallen, zijn er al een aantal jaren af en toe klachten over de manier waarop de zoekresultaten tot stand komen. Omdat we in de tussentijd goede ervaringen hadden met onze eigen Java-back-end, is die ondertussen uitgebreid met een Lucene-zoekmachine voor het forum. Op het moment van schrijven is deze in bèta en te testen.

Daarmee zijn (bijna) al onze zoekmachines ondertussen uitgewerkt in Lucene. Aangezien het opbouwen van de forumzoekdatabase enige uren kost, is het niet handig dit enkel in ram-geheugen bij te houden. Dit doen we wel bij alle andere zoekmachines; die kosten samen slechts een paar minuten om op te bouwen.

We laten de zoekdatabase voor het forum daarom door Lucene op disk opslaan en alleen onze dedicated search-servers maken daarom een forumzoekmachine aan. De rest van de engines (zie webservers) draait weliswaar dezelfde Java-code, maar is geconfigureerd om deze database over te slaan. Overigens draaien deze Tomcats met 16GB ram, zodat Lucene wat meer ruimte heeft om dingen in het ram te houden.

De twee search-servers zijn tegelijk aangeschaft met de beide NoSQL-servers. Het belangrijkste verschil zit 'm in de I/O-configuratie. Bij de search-servers zijn de twee 900GB-disks dedicated als datadisk. Ze hoeven dus niet ook nog eens het lees- en schrijfwerk voor het besturingssysteem uit te voeren. Daarnaast beschikt de raid-controller in deze machines over twee 50GB-ssd's om nog wat meer werk te kunnen cachen.

Filestorage

Onze fileserver is momenteel de oudste server die nog in een kerntaak aan het werk is. Deze hebben we destijds met OpenSolaris en ZFS opgezet. Hoewel dit goed bevalt, is helaas de support voor OpenSolaris vrij kort na de plaatsing stopgezet en kunnen we nu dus niet zomaar op dezelfde weg doorgaan.

File-server athos in bedrijf

Momenteel voorziet deze server ons serverpark van centrale opslag van bestanden. De afbeeldingen die onze redactie en gebruikers uploaden, de video's die we hosten: het staat allemaal op deze machine. Ook speelt deze server een belangrijke rol in het verdelen van de JavaScript, CSS- en PHP-bestanden over de verschillende servers. Het centrale bestandssysteem is via NFSv3 beschikbaar gemaakt.

Overigens maken de webservers een kopie van de JavaScript, CSS- en PHP-bestanden om onnodig netwerkverkeer te voorkomen. Die kopie maken ze met een rsync-daemon op de nfs-server. Ook van populaire video's en afbeeldingen worden kopieën in de webservers bijgehouden. Bij de afbeeldingen gebeurt dat in de ram-caches van Varnish. De videowebservers kopiëren de populaire video's naar hun lokale harde schijf.

We zijn momenteel op zoek naar goede vervanging voor deze webserver. ZFS bevalt goed, maar we hebben onze twijfels over de stabiliteit van de Linux-implementatie. En onze belangrijkste ervaring met OpenSolaris is dat het een aanzienlijke aanslag pleegt op de beheercapaciteit als er een server met een vreemd besturingssysteem tussen je machines zit. Kortom, we willen niet zomaar (weer) een Solaris- of FreeBSD-server opzetten.

Daarnaast hebben NFS (en ZFS) als nadeel dat het erg lastig is om er een multimastercluster mee op te bouwen. We hebben daarom ook nog wat onderzoekswerk te doen naar alternatieven als Ceph en GlusterFS. De voorlopige conclusie is overigens dat er nog te veel haken en ogen aan dergelijke clustersystemen zitten en we met onze omvang toch beter af zijn met een 'eenvoudige' nas met ZFS.

Overige servers

Hoewel we al zeventien servers hebben genoemd in dit verhaal, zijn we er nog niet helemaal. We hebben ook nog allerlei servers en VM's in gebruik voor diverse secundaire taken. Denk daarbij aan het versturen en ontvangen van e-mail, het bijhouden van backups, het uitvoeren van monitoring en het aanbieden van diverse ontwikkelplatforms.

Onderdeel2x VMMail2x ManagementDevelopmentBackups
OS Linux+KVM Linux Linux Linux+KVM Nexenta Core
Server Dell R410 Dell R610 Dell R310 IBM x3550 M3 Dell R510
CPU 2x Xeon E5630 2,53GHz 2x Xeon X5570 2,93GHz Xeon X3440 2,53GHz 2x Xeon E5645 2,4GHz 2x Xeon E5620 2,4GHz
RAM 64GB DDR3-1066 24GB DDR3-1333 4GB DDR3-1333 144GB DDR3-1333 24GB DDR3-1333
Controller PERC 6 SAS 6iR ServeRAID M5015 PERC H700
OS-disks 1x 250GB 2x 300GB 10k SAS 2x 160GB SATA Geen losse 2x 146GB 10k SAS
Data-disks MD3200i iSCSI 4x 50GB SSD 6x 900GB 10k SAS 12x 2TB SATA
SSD-accelerator 2x 50GB

VM's + iSCSI

Voor veel servertaken gebruiken we dedicated hardware. Toch zijn er nog diverse taken waarvoor we een gescheiden besturingssysteem wilden, zonder daar meteen ook een dedicated machine op te willen zetten. We hebben onder andere twee losse VM's voor de spamfiltering van de inkomende e-mail. Verder draaien het verzamelen van accesslogs, monitoring door zabbix, onze dns-servers en de irc-server op eigen virtuele servers. Daarnaast zetten we zo nu en dan nog losse VM's op voor tijdelijke taken.

Mail

In eerste instantie was ook de centrale mailserver gehost op de VM-servers, maar vooral het versturen van de nieuwsbrief naar duizenden Tweakers leverde grote pieken in de belasting op, wat leidde tot onderbrekingen bij andere gebruikers van de mailserver. Aangezien we onze oude searchserver nog in het rack hadden hangen, hebben we die omgebouwd tot mailserver. De snellere hardware en snellere toegang tot de bestanden van de mailopslag hebben de problemen verholpen.

Servermanagement

Om een serverpark van deze omvang goed te beheren, moet je uiteraard ook allerlei interne diensten aanbieden. Denk aan (caching) dns-servers, een centrale tijdserver, dhcp en ldap. Sinds Phoenix worden onze servers bovendien beheerd met Puppet om zo eenvoudig nieuwe servers te kunnen installeren en snel wijzigingen in de configuraties te kunnen uitrollen over verschillende servers. Al deze taken zijn verzameld binnen onze managementservers.

Management-server Maia

Managementserver Maia helemaal alleen onderin…

Development

Development nemen we serieus. Vandaar dat we al jaren 'afgedankte' hardware inzetten voor de diverse test- en ontwikkelservers. Tijdens het ontwikkelen van Tweakers 7 hebben we dat zelfs nog wat verder doorgetrokken. We hebben daarbij een alfa-, bèta- en gamma-opstelling gemaakt. Ieder van die drie omgevingen bestaat uit een webserver en een databaseserver.

Omdat het uiteraard zonde is om voor zulke weinig bezochte sites zes fysieke servers te plaatsen, hebben we die verenigd in een krachtige VM-host met veel geheugen en snelle I/O. Bovendien kunnen we zo eenvoudigweg nog meer developmentmachines opzetten. Gedurende de ontwikkeling van Tweakers 7 hadden we bijvoorbeeld ook een 'Tweakers 6.9'-testserver. Onze SVN-omgeving wordt eveneens op deze VM-server gehost.

Deze testservers zijn tegelijk een mooie manier om te testen of onze databasebackups goed zijn gegaan. Althans, we zien in ieder geval dat ze geïmporteerd worden en overduidelijke fouten zullen er ook uitspringen. Als er echter ergens een obscure tabel verkeerd is ingeladen, zullen we dat natuurlijk niet zo snel zien.

Behalve de bovenstaande server hebben we in onze kantooromgeving ook nog wat servers voor het testen en ontwikkelen van onze code.

Backup

Er zijn een aantal zaken waarvan we actief backups bijhouden. De belangrijkste zijn de centrale databases, filestorage en onze SVN-omgeving. Doordat Puppet zijn gegevens in SVN opslaat, hebben we ook van de belangrijkste serverconfiguraties een backup. Voor de filesystem-backups maken we gebruik van de snapshot-functie van ZFS. De backups worden met ZFS Send & Receive overgestuurd van de NFS-server naar de backupserver. Het grootste voordeel hiervan is dat we ook automatisch een vorm van 'deduplicatie' in de backups hebben; bestanden die niet veranderen, staan maar één keer op de server.

De MySQL-databases zijn steeds volledige dumps, waarvan we er een behoorlijk aantal bewaren. Aangezien dit per keer 'slechts' een paar gigabyte is en we oude backups weggooien, gaat de 24TB aan bruto-opslag uiteindelijk nog even mee. Althans, dat hopen we ;)

Naast deze onsite-backupserver hebben we ook nog een server op ons kantoor die periodiek een kopie van de recentste backups krijgt toegestuurd.

Toekomstige uitbreidingen

We proberen onze servers vlot te vervangen. Dat betekent niet dat ze altijd precies drie jaar na aanschaf worden ingeruild, maar dat is wel waar we ons op richten. Een enkele keer komt het beter uit om een server wat eerder te vervangen, zodat we bijvoorbeeld een nieuwe aanpak voor een bepaalde service kunnen uitwerken.

Ook dit jaar gaan we weer flink wat vervangen. Het belangrijkste is de centrale storage. Het liefst zouden we een omgeving opzetten met multi-master-replicatie, zodat er naar een willekeurige fileserver in een van de beide locaties geschreven kan worden en de clients transparant omgezet kunnen worden bij problemen.

In de praktijk blijkt dat dit soort systemen erg zeldzaam is. Zelfs ruim boven ons budget is het nog niet gebruikelijk dat fileservers elkaar via een tcp/ip-netwerk actueel kunnen houden. Het is meestal één kant op, in een variant op een master-slave-opstelling. Omdat het systeem voor ons niet alleen storage moet bieden, maar ook beheersbaar en flexibel moet zijn, gaan we hier waarschijnlijk weer simpelweg aan de slag met ZFS. Op welk besturingssysteem of welke appliance dat dan komt, weten we nog niet. Het liefst wordt dat natuurlijk Linux, maar helaas is ZFS op Linux geen officieel ondersteund bestandssysteem. Dat maakt de combinatie daardoor automatisch een minder goed recept voor stabiliteit en continuïteit.

Naast de storage staan er nog diverse servers op de agenda om vervangen te worden. Daaronder bevinden zich de 'slave' MySQL-server, de VM-hosts en de videowebservers. Aangezien die in hun huidige vorm vrij goed werken, zullen dat domweg varianten op dezelfde soort server zijn. Alleen dan uiteraard drie jaar nieuwer.

Op het gebied van software willen we ook nog verder met nieuwe versies en zullen we diverse aspecten tunen. Zo wordt het https-verkeer nu direct naar Apache verzonden. Dat is zonde, want daardoor wordt Varnish overgeslagen. Aangezien onze loadbalancers ook zelf https kunnen 'terminaten', gaan we onderzoeken hoe we dat het efficiëntst kunnen inzetten. Helaas is dat typisch een wijziging die simpel lijkt, maar in de praktijk allerlei haken en ogen met zich meebrengt. Op het moment van schrijven wordt dit daarom alleen nog voor tweakimg.net gedaan.

Zoals eerder gemeld willen we onderzoeken waarom MongoDB relatief slecht met de hoeveelheid queries en updates overweg kan. Wellicht is een nieuwere versie beter of stappen we over op een van de alternatieven. Vooral Redis lijkt een goede kandidaat. Verder moeten we nog hard aan de slag om al onze oude code na te pluizen op compatibiliteit met PHP 5.4 en 5.5.

Reacties (164)

164
164
134
26
0
4
Wijzig sortering
Misschien nog een handig weetje in het kader van Java en garbage collection - de CMS garbage collector faalt als er te veel fragmentatie in de heap space van je JVM is. In tegestelling tot de standaard parallel GC kan de CMS niet defragmenteren. In geval van zo een "concurrent mode failure" gaat de JVM de standaard parallel GC aanroepen en staan nogsteeds je threads stil. Je kan dit zien als je garbage collection logging aanzet in je JVM.

Hoe los je dit op? Tja, kan lastig zijn. Als je vanuit je applicatie veel kleine objecten aanmaakt die in de tenured generation terecht komt dan fragmenteert je heap space veel sneller dan dat je veel grote objecten aanmaakt (immers grote objecten zorgen ook weer voor grote gaten in je heap space). Een mogelijk antwoord zijn TLABs. Ik ben zelf geen Java programmeur dus mijn kennis houdt hier ook een beetje op. Zie https://blogs.oracle.com/...sizing_an_annoying_little voor details.
AuteurACM Software Architect @silentsnake9 maart 2013 11:57
Sinds we van Parallel naar CMS zijn gegaan hebben we geen noemenswaardige vertragingen meer gezien. Althans, ze vallen in ieder geval niet zo meer op als toen we nog de Parallel collector gebruikten, toen was het meerdere keren per dag dat een hele serie requests naar zo'n Tomcat (die dan dus bezig was met zijn full garbage collect) dan als traag werden gelogged. Veel daarvan waren langer dan 2 seconden.

Dus zelfs als het nu nog af en toe voorkomt, is het in ieder geval veel minder erg dan voorheen :)
"Ook dit jaar gaan we weer flink wat vervangen. Het belangrijkste is de centrale storage. Het liefst zouden we een omgeving opzetten met multi-master-replicatie, zodat er naar een willekeurige fileserver in een van de beide locaties geschreven kan worden en de clients transparant omgezet kunnen worden bij problemen."

DRBD kan tegenwoordig volgens mij ook over tragere WAN links geconfigureerd worden. We gebruiken dit in onze Vmware omgeving al jaren naar tevredenheid. Failoveren gaat vlot (er is "amper" impact op de virtuele machine's). Het voordeel ervan is dat het synchroniseerd op block niveau en je er dus elke FS op kunt draaien :)
Poeh, wat een artikel, maar ik heb het helemaal gelezen. Ofschoon ik mezelf niet als IT-Pro kan beschouwen, en dat met een artikel als dit ook duidelijk merk :+ was ik toch wel nieuwsgierig naar jullie afwegingen die de keuzes hebben bepaald voor de omgeving zoals de momenteel draait. Zoals in iedere server omgeving is ook bij Tweakers een factor "historisch gegroeid" aanwezig. En dat is prima, want dat duidt op een een voortdurend gecontroleerd omvormen. En met serveromgevingen willen we niet anders.

Ik ben betrokken in het beheer van een PDM database (Product Data Management). De PDM software gebruikt een Oracle omgeving als database. In deze configuratie zijn in het afgelopen decennium ook de nodige omzwervingen gedaan. In dit kader vond ik, ondanks mijn gebrek aan diepgaande IT-kennis, twee frases opmerkelijk en meende ik uit mijn ervaring te herkennen:
Geen van die kerntaken draait op virtuele machines, we vragen doorgaans voldoende van dergelijke servers om ook daadwerkelijk bare metal te kunnen verantwoorden. Daarbij moet wel gezegd worden dat we soms bundels taken op een server combineren, maar daarvoor is uiteraard geen virtualisatie nodig.
Deze uitspraak vond ik opmerkelijk. Ik vond het verfrissend om te lezen dat voor de kern activiteiten fysieke servers zijn gekozen. Voor de bovengenoemde PDM database gaan wij de servers wel virtualiseren (ook de Oracle environment), maar het was een duivels dilemma. Het is natuurlijk appels en peren vergelijken, maar wij verwachten dat virtualisatie wel mogelijk zou moeten zijn. Waarom dan toch nerveus? Ten eerste claimt Oracle een sloot aan RAM geheugen voor stacks over de recente activiteit. Ten tweede zou Oracle gevoelig kunnen zijn voor timing issues die door de virtualisatielaag net niet meer real time genoeg zijn. Qua CPU belasting stelt de server activiteit echter weinig voor, en dat is het grootste verschil met de Tweakers omgeving.
Ondanks snelle 1Gbit-switches en -nics is het nog altijd veel sneller om met localhost te communiceren dan over het netwerk te gaan.
Dit lijkt ook ons voortschrijdend inzicht, ofschoon ook weer een gevalletje appels en peren. In de eerste jaren van onze installatie stonden de PDM applicatie en de Oracle omgeving op dezelfde fysieke server. Enkele jaren geleden is vanwege het zware beslag dat Oracle legt op het werkgeheugen een aparte fysieke Oracle server opgericht. Wij hoopten toen op een sneller acterende database. Als ik mij niet vergis waren beide servers onderling met 2x1Gbit verbonden, aan bandbreedte lag het dus niet. Nou, van die snelheidswinst hebben we niet veel gemerkt. Eigenlijk is ten gunste van het Oracle geheugengebruik een veer gelaten door een netwerk verbinding tussen de PDM en Oracle omgeving te introduceren. De slag die komend jaar gemaakt gaat worden is om een andere netwerkverbinding minder belangrijk te maken. De PDM applicatie bevat ook Java componenten en heeft een serverproces dat nog lokaal op clients (client-side) en op de PDM applicatie server (server-side) draait (2-tier). Deze situatie wordt omgezet naar een configuratie waarbij zowel de client-side processen als het server-side proces lokaal op de PDM server draaien (4-tier). Op de PDM clients rest dan nog alleen een echt client proces. De trade off is wel dat de PDM server een fors uit de kluiten gewassen systeem gaat worden, en onze huidige generatie client werkstations een ietwat overgedimensioneerd zullen zijn ;). Onze verwachting dat dit een snellere database response oplevert is gebaseerd op het gegeven dat de database momenteel ook een webomgeving bedient die voor de webclients het client-side proces al op de webserver heeft draaien. Deze client-side processen hebben, zo leggen wij uit, door de innige koppeling tussen web-, Oracle- en PDM-server een snellere database response dan de royaal uitgelegde (niet-web)client werkstations met hun eigen lokale client-side proces. Kortom, een totaal andere omgeving waar ook de tendens is om de invloed van het door andere taken vervuilde netwerkverkeer op de database responsiviteit te minimaliseren.

edit: taal

[Reactie gewijzigd door teacup op 22 juli 2024 14:33]

1 gokje: CATIA/ENOVIA?
AuteurACM Software Architect 12 maart 2013 17:47
Nginx is niet inflexibel of een omgeving die 'een probleem' heeft.

Apache heeft sowieso als groot voordeel dat we het goed kennen en al jaren stabiel draait. We maken onder andere gebruik van de MultiViews-functionaliteit (dus dat je een bestand genaamd pricewatch.php hebt en dan tweakers.net/pricewatch kan gebruiken zonder dat je dat expliciet voor elke url moet lopen mappen) en allerlei andere features. Zoals ondersteuning voor .htaccess, mod_rewrite, php geintegreerd in de omgeving (dus niet een losse daemon hoeven te beheren), de mogelijkheid om naar een remote-server te loggen, etags uit kunnen schakelen (dit kon Lighttpd niet goed, Nginx wellicht wel), remote-ip's vanuit varnish gebruiken ipv de eigen remote-ip (en dus geen 127.0.0.1 als ip in de access logs loggen), ssl met virtual hosts en allerlei andere kleine dingetjes.

Ieder van die features is mogelijk wel een tegenhanger voor in Nginx, maar het is allemaal niet domweg een drop-in replacement. We hadden dan steeds opnieuw op zoek gemoeten naar dat alternatief. Nginx+PHP-FPM was in onze tests overigens niet sneller dan Apache+PHP voor pure php-requests. Dus het bood dan vooral de nadelen van een nieuwe configuratie uit moeten vogelen en een extra daemon te moeten beheren.

Alleen maar een omgeving vervangen "omdat het kan" is niet zo'n beste reden. Van Apache weten we dat het werkt en voldoet aan wat we willen

De vraag is voor ons dus niet "Wat heeft Apache beter dan Nginx?", maar "Wat heeft Nginx zodanig beter, dat het een goed idee is om Apache+Varnish erdoor te vervangen?".

Het antwoord daarop is, voor zover wij dat hebben beoordeeld: "niets". Wat overigens niet zegt dat het niks beter doet dan Apache of een slecht alternatief is :) Het zegt zelfs niet dat als we het met de huidige stand der techniek allemaal over zouden moeten doen, dat we dan niet Nginx zouden kiezen (overigens ook niet dat we het per se wel zouden kiezen :P ).

Daarbij zal je dus moeten accepteren dat doordat wij Apache en Varnish draaien, we automatisch bevoordoordeeld zijn en elke feature die Nginx niet of minder praktisch aanbiedt snel als een minpunt zullen zien terwijl jij het niet zou opnoemen als pluspunt van Apache/Varnish :P
Bovendien houden we sowieso wel bij dit soort dingen het "If it ain't broken, don't fix it"-adagio aan :)
Wat me bij T.net opvalt is dat jullie een allegaatje hebben aan merken.

Dell, Sun, IBM etc. waarom niet 1 merk icm met gemirrorde storage? En waarom geen VMs? met de huidige technoligie kan je toch veel meer doen dan met zoveel fysieke machines?

3 of 4 flinke stukken hardware icm cached SSD en iSCSI storage. tegenwoordig is 10Gbit in servers redelijk mainstream aan het worden en betaalbaar. Dan kan je ook makkelijker backuppen dmv replicatie en dedup erbij naar de andere locatie.

Kan het misschien helemaal verkeer zien maar dat moet toch haalbaar zijn met jullie omgeving.
AuteurACM Software Architect @loodgieter9 maart 2013 15:14
We hebben gemixed Dell (en voorheen Sun) en IBM omdat de beste offertes nou eenmaal niet elke keer bij dezelfde partij vandaan kwamen. Standaardiseren op hardware heeft natuurlijk wel wat voordelen, maar een scherpe prijs krijgen ook...

Voor wat betreft virtualisatie; mijns inziens werkt dat vooral goed als je veel relatief lichte taken hebt die je over een verzameling (zware) machines kunt uitsmeren en waarbij ze bij voorkeur niet allemaal tegelijk evenveel belast worden.
Wij hebben vooral een beperkt aantal zware taken en die worden bovendien allemaal op dezelfde momenten zwaarder belast (als het drukker is op de site).

Bovendien hebben we er ook niet zo'n zin in om een server af te stemmen op alle taken tegelijk en er dan achter te komen dat het toch nog niet goed werkt. Dat twee applicaties elkaar negatief beinvloeden.
We hebben bijvoorbeeld een tijd lang MySQL en MongoDB op dezelfde servers gedraaid (zonder virtualisatie), veel RAM, dikke cpu's, ssd-storage... En toch werd MySQL negatief beinvloed door MongoDB en vice versa. Daarna toch maar op losse servers gezet en ze presteerden beide gelijk een stuk beter, ondanks dat de servers zowel ervoor als erna niet tot hun maximum werden belast.
Voor wat betreft virtualisatie; mijns inziens werkt dat vooral goed als je veel relatief lichte taken hebt die je over een verzameling (zware) machines kunt uitsmeren en waarbij ze bij voorkeur niet allemaal tegelijk evenveel belast worden. Wij hebben vooral een beperkt aantal zware taken en die worden bovendien allemaal op dezelfde momenten zwaarder belast (als het drukker is op de site).
Virtualisatie hoef je niet alleen te gebruiken om CPU utilization omhoog te krijgen. Je kan het ook gebruiken voor om je server portable te maken, zodat je het kan migreren in geval van onderhoud of uitval. Of om VM's te klonen zodat je snel capaciteit kan bijschalen. (Op eigen hardware of 3rd party cloud provider.)
We hebben bijvoorbeeld een tijd lang MySQL en MongoDB op dezelfde servers gedraaid (zonder virtualisatie), veel RAM, dikke cpu's, ssd-storage... En toch werd MySQL negatief beinvloed door MongoDB en vice versa.
Met virtualisatie kan je dat juist voorkomen, omdat je limieten aan de VM stelt. Je kan tegenwoordig SAP draaien als monster VM tussen je andere enterprise applicaties. Als je toch bare metal wil draaien is stateless computing een optie. Met service profiles kan je daarmee de identiteit van een server bepalen. (Zoals BIOS & RAID settings, boot from SAN opties, MAC adressen, etc.) Faalt de server hardware, dan boot je het server OS op een andere server, met dezelfde server settings.

Maar als rackspace, dataverkeer en stoomkosten gratis zijn dan speelt dit natuurlijk veel minder. En T.net heeft natuurlijk een systeembeheerder. Dus op beheer is ook niet veel te winnen.
Bedankt voor je uitleg.

Mee eens vwb de 2 databases op 1 server is sowieso niet optimaal. Maar met virtualisatie ( wat al gezegd is) ben je veel flexibeler. Ook met zware taken kan virtualisatie prima over weg. Misschien wel beter ivm makkelijke schaling. Het hoeft niet meteen VMware te zijn er zijn ook andere leveranciers die dit prima kunnen.

SSD kan hier ook een goedesnelheids bepaler zijn. Zoals hybride SAN oplossingen die SSDs gebruiken voor caching van veel gebruikte pages. daarmee kan je snelheden halen van dik over de 20 tot 30K IOPS. Zeker bij databases goed. Maar eigenlijk wil je niet dat een database leunt op schijven maar om memory. Wij hebben enkele klanten die met 600 man werken op een database server met 96GB aan memory (ok wel een SSD SAN). De snelheid is perfect. Ook prijs speelt een rol natuurlijk. Niet ieder bedrijf of stichting heeft zoveel op de plank liggen. Dat is ook begrijpelijk.

Als T.net hebben jullie toch ook wel de mogelijkheid om bij bijv Dell of IBM loaner hardware te krijgen om zulke zaken te testen? Het is voor zo`n bedrijf ook goede marketing dat een site zoals T.net op de hardware van die fabrikant draait.
Ik zie af en toe (OS) disken van 1x X Gb voorbij komen. Is dat dan het logische aantal disken of zit er echt maar een in? (Dat laatste lijkt het geval op sommige plaatjes). Ben benieuwd waarom daar voor gekozen is en niet voor een RAID 1 opstelling. Van alles wat fysiek kapot kan gaan staan disken samen met fans en voedingen toch bovenaan mijn ervaringslijst.
AuteurACM Software Architect @PolarBear9 maart 2013 09:42
De kans dat een harde schijf uitvalt is nou ook weer niet zo heel groot. Het is niet zo dat we er dagelijks een moeten vervangen... Sterker nog, ik kan me de laatste keer nauwelijks herinneren. Zeker van OS-disks weet ik eigenlijk niet of er uberhaupt een in de afgelopen 10 jaar stuk is gegaan. En ook zwaarder belaste datadisks houden het over het algemeen prima hun geplande 3 jaar vol.

Soms is het dan domweg niet de extra investering in extra redundantie in een server waard. Dat doen we alleen als de bijbehorende taken al heel erg redundant opgezet. Het beste voorbeeld zijn onze webservers. Daar hebben we er 6 van, als er een of twee van uitvallen merk je daar weinig van.

Het is dan domweg zonde van het geld om 6x een extra disk en raid-controller aan te schaffen. Voor servers en taken die niet zo eenvoudig te vervangen zijn kiezen we er uiteraard wel voor om ook de risico's rond de OS-disks nog verder te beperken.
die server zal toch wel een standard controller met raid-1 hebben
AuteurACM Software Architect @amatoer9 maart 2013 11:14
Nee, niet per se standaard. Over het algemeen kost een eenvoudige raid-1 controller een paar tientjes per server extra. Al met al heb je het met dit soort servers al gauw over 100-200 euro per server extra - en soms moet je dan ook een hot-swap chassis kiezen en wordt het nog wat meer - als je een 2e disk en een raidcontroller toevoegt.
Ik vind 100-200 euro voor een server extra niet echt iets om meteen op te besparen. Ik snap jullie overweging, ik zou het zelf alleen niet doen. Alles redundant uitvoeren maar dan 100-200 euro besparen op een raid-1 opstelling voor je OS.
AuteurACM Software Architect @PolarBear9 maart 2013 11:39
Zoals ik hieronder ook al noemde. Mijn schatting is dat we op normale momenten aan 1 webserver genoeg hebben en op drukke momenten aan 2.
Dus dan wil je er minimaal 3 hebben, zodat een complete server kan uitvallen (bijvoorbeeld door een kapotte voedingverdeler of moederbord) en je nog steeds al het verkeer aankan.

We hebben echter 6 webservers. Dus volgens die schattingen zijn het er 3x zoveel als strict noodzakelijk en 2x zoveel als ons minimum comfort-niveau. Aangezien die raid-controllers en extra disks ons niet gaan helpen tegen een uitvallende locatie (bijv stroomuitval of netwerkverbinding die eruit gaat), moesten we toch wel minimaal 3 per locatie hebben (en dus 6 in totaal) :)

Er is een moment dat extra redundatie, duurdere support, etc allemaal niet genoeg meer toevoegt om daadwerkelijk tegen de risico's op te wegen.

Doordat we natuurlijk meestal twee werkende lijnen hebben en (OS-) harde schijven in onze ervaring vrij zelden stuk gaan, vonden we het niet nodig om ook nog eens weer extra te investeren in raid-controllers en extra schijven :)
De trend is eigenlijk zo bij alle grotere websites -- simpelere machines met zelf minder redundancy, maar dan wel de servers redundant uitvoeren.

Tweakers zit een beetje op de ondergrens van waar dat nuttig is, maar het zal in deze opstelling niet veel meer kosten dan minder, grotere servers die van alles tegelijk doen.

Consolidatie op grote bakken (evt met virtualisatie) versus large-numbers COTS bakjes is al zeker de afgelopen tien jaar een van de grote spanningsvelden in de hele IT. Het voordeel (ook voor kleinere websites) van het tweede systeem is vooral de schaalbaarheid, voor relatief weinig investering tegelijk. Een of twee (of vier) servertjes vervangen is betaalbaarder dan 1 grote VM bak met 4 sockets en 384GB ram. Met name als je rackspace en power gratis is natuurlijk :P

Opvallend is BTW dat door technische limits juist in de DB servers wel nog de grote-geconsolideerde filosofie wordt gebruikt, omdat replicatie van mysql blijkbaar nog steeds zuigt :)
Je vergeet dat RAID controllers ook kapot kunnen, of fouten kunnen bevatten. Leuk dat je je schijven dubbel hebt uitgevoerd, maar je krijgt er een ander spof voor terug. Plus dat er extra beheer nodig is, en er door de dubbele hoeveelheid schijven ook vaker iets kapot gaat, wat je wel weer moet vervangen.
ik geloof dat er11 of 12 jaar geleden een grote crash was. Veel reactie's waren alleen nog te achterhalen door gebruikers die het nog in hun cache hadden of zoiets.
Ja das zeker, Hier is het gedeeltelijk allemaal nog eens na te lezen

reviews: Tweakers.net 10 jaar: De hostinggeschiedenis 2001- 2004

Gelukkig wel, Alle noob posts van mij waren toen allemaal meteen mooi opgeschoont :D

Ook leuk te zien is in deze post van toen hoe tweakers begonnen is met een leuke P!!! opstelling en hoe ze gegroeid zijn van zelfbouw knutsel servers tot leuke apparaten ;)

En voor nog meer geschidenis :P
reviews: Tweakers.net 10 jaar: De hostinggeschiedenis 1998 - 2001

Kan je meteen lezen waar dat MiniSQL vandaan komt haha

[Reactie gewijzigd door Professor_Botje op 22 juli 2024 14:33]

ik gok dat dit de reden is voor de redundantie van de servershet risico kan daarom genomen worden, en is de aanschaf per server wel lager (1 disk, geen raid controller)
Het overstappen zou namelijk veel werk geweest zijn, onder meer omdat een groot deel van de SQL-statements herschreven zou moeten worden om ze te vertalen van MySQL's eigen SQL-dialect in het dialect van de nieuwe database.
In hoeverre is een oplossing als PDO hier een mogelijkheid? Niet dat het mij noodzakelijk lijkt om over te stappen naar PostgreSQL of iets anders, maar waarom geen flexibiliteit inbouwen?
AuteurACM Software Architect @renevanh9 maart 2013 12:49
Vziw zijn er maar heel weing omgevingen die je daadwerkelijk afschermen van de specifieke SQL-smaak. Dan kom je al gauw bij de ORM's uit.
Bij PDO schrijf je uiteindelijk ook gewoon SQL-statements, dus zal je gebruik (kunnen) maken van MySQL-specifieke functies, statements en datatypen. Denk aan LIMIT's of UNIX_TIMESTAMP() of unsigned data-typen of de INSERT ... SET (analoog aan de UPDATE), INSERT .. ON DUPLICATE KEY UPDATE, REPLACE en al dat soort zaken.

Als je puur vanilla SQL92 (of 99 of 03) zou schrijven, dan kan je met PDO (maar ook met onze eigen wrapper-bibliotheek) relatief eenvoudig switchen naar een ander type database die vergelijkbare of betere SQL92-ondersteuning heeft.

Maar we hebben lang niet alle statements in puur SQL92 geschreven, al is het alleen maar omdat cursors niet bestonden in MySQL en LIMIT sowieso veel beter werkt voor paginering in webapplicaties. Maar ook andere dingen zijn er doorgesijpeld of zelfs vrij bewust gekozen (of omdat er geen alternatief was).
Nu breekt UNIX_TIMESTAMP() je query cache, dus die wil je natuurlijk sowieso liever vermijden ;)

Having said that, ik moet de eerste ORM nog zien die geen performance verlies oplevert. Het is jammer (zeker gezien sommige van MySQL's eigenaardigheden), maar specifieke SQL schrijven is ook niet zo'n ramp. Zeker met de recentere MySQL versies mis ik de mogelijkheid om over te stappen niet zo.
AuteurACM Software Architect @FragFrog10 maart 2013 09:38
We gebruiken geen query cache, met onze hoeveelheid queries en updates zagen we er niet heel veel heil in. Sowieso proberen we data waar het wel lang in de cache zou blijven al via memcached te cachen :)
2 vragen:
- Waarom is dataverkeer gratis op jullie primaire locatie?
- Zou het wat betreft kosten en schaalbaarheid niet interessant zijn om de website in een cloud onder te brengen bij een grote aanbieder (google e.d.)? En zou het uberhaupt mogelijk zijn voor een website als tweakers?
AuteurACM Software Architect @Chayan719 maart 2013 10:49
- Omdat dat nou eenmaal een sponsordeal is met True (zie ook het logotje rechtsboven), die we al heel lang hebben :)
- Omdat onze bandbreedte nu grotendeels gratis is, zijn er maar verdraaid weinig cloudberekeningen die uberaupt op 'break even' uitkomen, laat staan goedkoper zijn.


Bedenk een paar punten mbt cloud:
- Je hebt nog altijd minstens een systeembeheerder nodig (en daar hebben we er nu ook een van, dus minder kan niet)
- Als je een cloudserver 3 jaar lang, 24x7 laat draaien is ie doorgaans flink duurder dan zelf een server met dezelfde specificaties aanschaffen en dezelfde tijd aan te laten staan (maar je kan evt wel delen van servers huren natuurlijk)
- Je moet moeite gaan doen om "krap bemeten" servers te plaatsen en zodra ze te krap worden, ze verhuizen naar een ruimere server.
- Het liefst doe je dat continu en meerdere keren per dag en zonder dat gebruikers daar last van hebben
- Je moet allerlei omgevingen ombouwen om de meest (kosten)efficiente cloud-variant te pakken (denk bij Amazon aan ElastiCache, S3, SQS, SimpleDB, DynamoDB, etc ipv memcached, Varnish, ActiveMQ, MySQL en MongoDB).

Cloudoplossingen zijn daarom moeilijk om kostenefficient uit te rollen, zeker als je al bestaande hardware hebt.
Al met al kan je een cloudoplossing wel net zo goedkoop of goedkoper krijgen als een oplossing met normale servers, maar het is niet zo makkelijk als men nog wel eens pretendeert.

En aangezien in ons geval de kosten voor hosting heel laag zijn door die sponsordeal, wordt het wel heel moeilijk om een cloudoplossing goedkoper te laten zijn. Want naast de vaste aanschafkosten voor een server die relatief laag belast zal zijn (en dus meestal duurder dan nodig) en het systeembeheer (je hoeft niet meer mensen te hebben die fysieke dozen versjouwen) zou je vooral ook op kosten voor bandbreedte, rackhuur en energie moeten kunnen besparen :P

Overigens hebben diverse grote cloudomgevingen het afgelopen jaar slechtere uptimes gehad dan wij.
• Colocator True sponsort het verkeer sinds jaar en dag.
• Wil jij afhankelijk zijn van een derde, de complexiteit van dit park "zomaar even" verplaatsen? Bovendien is Google een Amerikaans bedrijf. Waar wordt de data bewaard, kunnen de regeringsdiensten er bij? Wat als er problemen zijn zoals bij een andere cloudaanbieder Amazon een tijdje geleden?

De public cloud is niet heilig. Doe mij maar een interne zodat je controle hebt over het park.
Je kan wel kijken naar iets als CloudFlare. Mocht het ooit voorkomen dat alle locaties tegelijk gebombardeerd worden (zeer goed mogelijk!!111one!one1!) of om een andere reden álle servers down zijn, kun je nog altijd op een gecachte kopie van Tweakers browsen.
Cloudflare != heilig:

Storing 4 maart (800.000 sites plat): http://www.ispam.nl/archi...dduizenden-websites-plat/
Eind vorig jaar: http://techcrunch.com/201...e-went-down-this-morning/

Ach tja, alles kan plat :9

[Reactie gewijzigd door pietermx op 22 juli 2024 14:33]

In hoeverre heeft Tweakers dan interessante data voor de US government? In principe staat alle data vrij toegankelijk op het web, dus lijkt me niet echt een issue.
Bovendien zou je ook een Europese cloud provider kunnen kiezen (toekomstmuziek wellicht nog)

Overigens zou ik de cloud in zo'n geval alleen gebruiken voor 'cloudbursting': het terugvallen op extra capaciteit in tijden van grote drukte. Als ik het verhaal begrijp, is er sprake van een enorme overcapaciteit om ook op dat soort dagen te performen. Dat is redelijk prijzig en precies de use case van cloud. Voor je standaard workload kun je zelf een betere prijs of kwaliteit regelen in principe.
Aller eerste... mijn complimenten voor dit verhelderende artikel. Weinig sites geven zoveel interessante data en gegevens prijs, maar jullie _O_.....

Maar dan rest me nog één vraag:

Stel, wat nu als op de primaire locatie de stroom uitvalt (en de stroom-redundantie niet werkt)?
Is de secondaire locatie bij Telecity dan groot genoeg om de bezoekers op te vangen? En zijn er dan services die niet zullen werken dan? Ik kan me voorstellen dat de zoekserver dan even niet van belang is om in te zetten...
En die repliceert MySQL zich dan uiteindelijk als de primaire locatie weer up komt?

Hoe reageert het serverpark hier dan op?

[Reactie gewijzigd door AW_Bos op 22 juli 2024 14:33]

AuteurACM Software Architect @AW_Bos9 maart 2013 16:46
Zodra euNetworks uitvalt wordt het inderdaad even spannend. De capaciteit bij Telecity is overigens ruwweg gelijk aan die bij euNetworks, dus wat dat betreft zit het wel goed.

Het belangrijkste dat momenteel nog echt weg zou vallen is de videostreaming.

Wel is het zo dat een aantal aspecten (nog) niet automatisch een fail-over zullen doen, waaronder storage, MySQL en Mongodb. Die laatste twee zullen in read-only modus terugvallen. Daarnaast zullen cronjobs en queue-consumers niet direct werken.

We werken er wel naar toe alle taken naast redundant ook automatisch of bijna-automatisch (na een druk op een 'knop') te laten omschakelen. Daar werken we in de meeste gevallen nog aan, maar de site zal dan dus niet gelijk goed werken. Wel is alle data dan al beschikbaar, dus het opbrengen van taken en het tot master promoveren van services is daardoor een stuk eenvoudiger :)
We hoeven in ieder geval niet direct nieuwe servers te kopen of backups in te laden als een van de twee locaties eruit gaat :P
Even over power, op bijna elke server/Router ed. zijn continue twee Power sources aangesloten (220V of -48V afhankelijk van waarmee de apparatuur is uitgevoerd) dat is in je local rackspace, indien de externe power uitvalt is er altijd eerste instantie nog een batterij backup, en binnen een (paar seconden) zullen er generatoren opstarten die het datacenter een aantal dagen van stoom voorzien of zoals waar ik werkte twee weken kon laten doordraaien, dus power is mi. niet echt een probleem, dat je hoopt dat je apparatuur op de juiste wijze Switched dat lijkt me spannender…
maar 25 servers? valt me tegen dan is tweakers nog een tamelijk klein project?
Ik vind 25 overigens best een hoop, maar als je goede performance wilt hebben.... ;)
Ik noem het niet bepaald een klein project, als ik dit zo lees....

[Reactie gewijzigd door AW_Bos op 22 juli 2024 14:33]

25 server valt toch best wel mee? is niks schrikbarends ofzo..
Voor 1 website? Ik vind het juist veel.
AuteurACM Software Architect @Crim13 maart 2013 18:27
'Google' en 'Facebook' zijn ook beide 1 website... toch? Zou je van hun ook minder dan 25 webservers verwachten? :)

Het aantal benodigde servers hangt onder andere af van het aantal bezoekers, de hoeveelheid data en de complexiteit (en dus benodigde rekentijd per bezoek). Het aantal 'websites' is niet zo relevant :P

Op dit item kan niet meer gereageerd worden.