In oktober installeerden we Artemis 6, onze huidige primaire databaseserver, en op 23 juni nemen we ook een nieuwe secundaire databaseserver in gebruik: Apollo 6. Deze server neemt de replicatiefunctie van Artemis 5 over. We gaan op woensdagochtend 23 juni om 08:00 aan de slag en we verwachten ongeveer vier uur nodig te hebben.
Omdat MySQL's replicatie-omgeving niet fail-safe is, willen we met een consistente backup en de bijbehorende binlogs beginnen. Nu kan in MySQL met MyISAM-tabellen alleen een consistente backup worden gemaakt als de database geen nieuwe data aangeleverd krijgt, dus MySQL moet worden stilgelegd.
Het stoppen en starten van onze MySQL-server duurt een aantal minuten: er moeten tenslotte tientallen gigabytes aan ram-cache worden verwerkt. Omdat we MySQL liever niet te vaak platgooien, nemen we de gelegenheid te baat om enkele wijzigingen in grote tabellen aan te brengen en een minor upgrade van de op Artemis draaiende MySQL uit te voeren.
Omdat we tegenwoordig over een read-onlymodus beschikken, kan de site gedurende het onderhoud grotendeels online blijven, al kan er uiteraard niets naar de database geschreven worden. Dat betekent dat je niet kunt reageren of modereren, niet kan inloggen, geen nieuwe topics kan starten, enzovoorts. Zolang de read-onlymodus actief is, wordt bovenaan de pagina een gele waarschuwingsbalk getoond.
De nieuwe machine is een Dell PowerEdge R710, die naar het voorbeeld van Artemis 6 is gemodelleerd. Apollo 6 krijgt een tweetal Xeon X5660-hexacores en 48GB geheugen, en net als zijn primaire broertje beschikt hij over een zestal 50GB-ssd's en twee 300GB grote sas-schijven.
Daarmee is Apollo 6 onze vierde machine met solid state drives: naast Artemis 6 zijn ook de zoekmachine en de nieuwe fileserver hiermee uitgerust. De fileserver gebruikt de flashdisks overigens alleen als cache en voor logs, in aanvulling op een array van normale sata-disks.
Artemis 6 (24-10-2009) | Apollo 6 | |
---|---|---|
Processors | 2x Xeon X5570 2,93GHz | 2x Xeon X5660 2,80GHz |
Geheugen | 72GB DDR3-800 | 48GB DDR3-1333 |
Raid-controller | Dell Perc 6/i | Dell Perc H700 |
Opslag | 2x Seagate Savvio 10K.3 300GB 6x Dell / Samsung MCCOE50G5MPQ 50GB |
2x Seagate Savvio 10K.3 300GB 6x Dell / Samsung MCB4E50G5MXP 50GB |
De oplettende lezer zal zien dat de nieuwe Apollo toch behoorlijk wat reken- en i/o-capaciteit heeft. Voor het maken van de eerder genoemde consistente backups heeft Apollo nog wel wat spierballen nodig, maar wat MySQL betreft blijft het daarbij. Artemis heeft het normaliter niet heel erg druk, waardoor het weinig zin heeft om het MySQL-leeswerk over beide machines te verdelen.
Wel hadden we al langer de wens om de sessies en de voorkeuren van gebruikers flexibeler op te slaan, zodat een gebruiker zijn instellingen zowel per sessie als voor al zijn sessies kan opslaan. Ook zou het prettig zijn als we de database niet elke keer hoeven te verbouwen als we een instelling willen toevoegen.
De starre MySQL-tabelstructuur die we nu gebruiken, sluit niet aan bij die wensen. We stonden daardoor voor de keus om een flexibelere MySQL-database te bouwen of om alternatieve databases te bekijken.
Aangezien de flexibele variant in MySQL zou betekenen dat we extra queries moesten introduceren en de overzichtelijkheid van de code zou afnemen, hebben we een inventarisatie van NoSQL-databases gemaakt. Daarvoor hadden we een aantal eisen geformuleerd.
- We hebben geen zin of tijd om het beheerwerk zelf te schrijven. Cassandra en Hadoop vielen daardoor af.
- We willen de instellingen per gebruiker logisch gegroepeerd houden, zonder concessies te doen aan het aantal en het type van de instellingen. Hierdoor viel een hoop software af, waaronder MemcacheDB en Tokyo Cabinet, en bleven vooral document databases over.
- We willen niet verplicht zijn om meer hardware toe te voegen als er meer data dan ram is - dus moesten we Redis en Terrastore schrappen.
- Query's als 'geef de instellingen behorende bij sessie X', 'geef alle sessies voor gebruiker Y' en 'hoeveel sessies zijn er voor Firefox-gebruikers' moeten efficiënt en snel worden uitgevoerd. De mapreduce-only document databases, zoals bijvoorbeeld CouchDB en Riak, waren daarom ongeschikt.
- We slaan slechts een paar gigabyte aan data op, dus rauwe performance is voor ons belangrijker dan uitgebreide schaalbaarheid.
- Aangezien we met PHP werken, moet daar eenvoudig mee gecommuniceerd kunnen worden.
Uiteindelijk is de keus gevallen op MongoDB. Apollo 6 gaat, naast MySQL-replicatie, dus MongoDB draaien om de flexibele opslag van voorkeuren te faciliteren. Als Apollo 6 onverhoopt uitvalt, zou deze constructie wel betekenen dat bezoekers niets meer mogen doen, ook niet als de primaire MySQL-server nog wel goed werkt. Daarom hebben we Artemis 6 zo ingericht dat hij de MongoDB-backupserver wordt. Kortom: Apollo is de backup voor de MySQL-database en in ruil daarvoor is Artemis de backup voor de MongoDB.
Ook deze wijziging gaan we woensdagochtend doorvoeren. Als het goed is merken jullie daar in eerste instantie niets van: we implementeren de infrastructuur, maar niet de toepassingen. Het is dus niet zo dat er ineens allerlei nieuwe instellingen beschikbaar komen - dat komt allemaal later wel

Aangezien we ondertussen een behoorlijk complexe variant op LAMP hebben opgebouwd, zie je hierboven een overzicht van wat we ondertussen aan logische onderdelen hebben. De twee rode blokken representeren respectievelijk Artemis 6 en de nieuwe Apollo. Verder zie je de memcached- en ActiveMQ-services en de diverse web- en applicatieservers die we naast Apache geïntroduceerd hebben. Deze laatste zijn gegroepeerd in het bruine blok en deze groep is op vier identiek ingerichte webservers geinstalleerd. Uiteraard geven de lijntjes aan hoe de communicatie ongeveer loopt.
Update, 12:32: ondertussen zijn de werkzaamheden achter de rug: de upgrade is om 11:30 voltooid. Ondanks een paar kleine tegenslagen verliep een en ander volgens schema. Het voornaamste probleem was wel dat de MySQL-replicatie door Artemis 5 een grote achterstand had opgebouwd, waardoor de data op deze server onbruikbaar was. Omdat de data op Apollo 6 nu volledig consistent met de primaire databaseserver is, zou dat probleem een volgende keer niet meer mogen optreden.