Bouwen van een schaalbaar platform

Bij webapplicaties die gebruik maken van een open-source database systeem, was tot niet al te lang geleden MySQL bijna de de facto standaard. MySQL is gratis, stabiel en zo breed ondersteund dat er bijna geen ontkomen meer aan was. Met de opkomst van NoSQL databases is daar echter verandering in aan het komen. Eén van de meest populaire, open source databasesystemen van dit type is MongoDB, waarvan recent versie 1.8 is verschenen. Dit artikel gaat niet in op de verschillen tussen de verschillende databasesystemen, maar biedt een toelichting op de wijze waarop, met behulp van ingebouwde functionaliteit van MongoDB en het gebruik van Cloud virtualisatie, er op betrekkelijk eenvoudige wijze bijzonder schaalbare databaseplatformen kunnen worden gerealiseerd.

Nu de bekendheid van IT-professionals met MongoDB aan het toenemen is, zal de vraag bij ISP’s naar dergelijke platformen de komende tijd alleen maar toe gaan nemen. Als een ISP zijn klanten bij deze vragen wil kunnen faciliteren, is het daarom van belang dat de organisatie kennis en ervaring opdoet met het inrichten en beheren van dergelijke platformen. Het installeren van een pakketje op een server is snel geregeld; het bouwen van een schaalbaar platform dat kan en doet wat het belooft, vereist toch echt meer kennis.

Voordelen en ondersteuning
Een probleem waar veel databasesystemen mee worstelen, is hoe je omgaat met groeiende databases. Naarmate databases en het gebruik ervan groeien, gaan er problemen optreden op het gebied van performance (hoge I/O belasting), replicatie (complexiteit en performance) en schaalbaarheid (disks lopen vol). MongoDB is ontworpen om deze uitdagingen op eenvoudige wijze het hoofd te kunnen bieden, zonder de ontwikkelaar van applicaties hiermee lastig te hoeven vallen.

MongoDB platformen bestaan uit een aantal componenten die verschillende rollen vervullen.

  • mongod – Dit is het database proces; in feite een instantie van MongoDB. Op een server kunnen meerdere mongod processen draaien.
  • mongos – Dit is een routing proces en verzorgt de connectie tussen een applicatie (client) en de verschillende mongod instanties.
  • config servers – Dit zijn specifieke mongod instanties die de onderdelen en gegevens van het MongoDB platform bijhouden en altijd op de hoogte zijn van welke data zich waar bevindt.

 

Replicatie en failover door middel van replica sets
Voor bedrijfskritische applicaties zijn betrouwbaarheid en beschikbaarheid van cruciaal belang. Bij veel databasesystemen is het realiseren hiervan complex en vaak erg duur. Daarnaast resulteert het nogal eens in een behoorlijk performanceverlies. MongoDB ondersteunt standaard al datareplica en automatische failover door het gebruik van replica sets.

Een replica set bestaat uit een aantal mongod servers die geconfigureerd zijn om onderling gegevens te repliceren en om voor automatische failover te zorgen. Eén mongod wordt verkozen tot master binnen de set en de andere draaien in slave modus. Mocht de master uitvallen, dan stemmen de resterende nodes (eventueel met hulp van een arbiter; een mongod proces dat alleen dit ene doel dient) onderling over een nieuwe master.

De configuratie is eenvoudig en behelst niet veel meer dan het benoemen van de mongod instanties die samen een replica set moeten vormen. MongoDB regelt vervolgens de replicatie en failover geheel zelfstandig.

Schaalbaarheid door gebruik van sharding
Om de schaalbaarheid van databases te realiseren, maakt MongoDB gebruik van sharding. Sharding houdt in dat MongoDB in staat is om gegevens uit een database automatisch in een cluster te verdelen over verschillende daarvoor aangewezen nodes (shards). Op basis van een zogenaamde shard key wordt data op de daarvoor aangewezen shard geplaatst. Op deze manier wordt ervoor gezorgd dat databases buiten de fysieke grootte van een enkele server kunnen groeien en dat de belasting verdeeld wordt over meerdere servers.

mongo_shard
Voorbeeld: drie shards waarbij de data is verdeeld op basis van het alfabet.

MongoDB splitst de data vervolgens automatisch in kleinere blokken (chunks). Het houdt op de achtergrond de verdeling van de gegevens in de gaten om te zorgen dat de spreiding van de data (en daarmee de belasting op de server) ongeveer gelijk blijft en zal via een balancer proces deze data chunks van de ene shard naar de andere verplaatsen en zo de balans herstellen. Bij het toevoegen van een extra shard zal hetzelfde gebeuren en zal er een nieuwe verdeling worden gemaakt en de nieuwe server vervolgens gevuld worden met de toegewezen dataset.

Een shard bevat één of meer mongod servers, die elk een complete kopie van het toegewezen deel van de database bevatten. In productieomgevingen zal een shard vaak bestaan uit een replica set. Het aantal shards dat gebruikt wordt voor een database is vrij te bepalen en eenvoudig bij te stellen bij groeiende of juist krimpende databases.

mongo_replica
De gegevens van een shard bevinden zich in een replica set.

De client communiceert altijd met het mongos proces dat het verzoek doorstuurt naar de juiste node. De ontwikkelaar van een applicatie heeft alleen te maken met dit mongos proces, en hoeft geen weet te hebben van de achterliggende verdeling van de databasegegevens.

De kracht van MongoDB met Cloud diensten
Zoals te zien, bevat MongoDB functionaliteit die zowel voor een betrouwbaar als schaalbaar platform kan zorgen. Er zijn echter wel heel wat componenten die benodigd zijn en rollen die vervuld dienen te worden om dit te realiseren. Gelukkig is niet voor ieder onderdeel een aparte server vereist. Eén server kan probleemloos meerdere rollen vervullen.

Mongo_setup
De structuur van een MongoDB databaseplatform

Bij het ontwerpen van een platform betekent dit dat er klein kan worden begonnen, maar dat er de mogelijkheid is om eenvoudig een platform uit te kunnen breiden als de hoeveelheid data en de belasting groter wordt. Gelukkig sluit dat perfect aan bij een aantal kenmerken van Cloud hosting.

  • Snel servers toevoegen (horizontale schaalbaarheid)
  • Flexibele contracten
  • Template-gebaseerde servers

Als de behoefte ontstaat aan meer capaciteit, is het eenvoudig een extra mongod toe te voegen aan het platform. Afhankelijk van de actuele wensen en behoefte, kan deze ingezet worden om een bestaande replica set uit te breiden, nieuwe shards toe te voegen of rollen opnieuw te verdelen binnen de servers. Het verplaatsen van de benodigde gegevens naar de server en het bijwerken van de configuratie over alle onderdelen van het platform wordt automatisch door MongoDB verzorgd.

Conclusie
MongoDB leent zich niet voor alle soorten applicaties. Maar als een applicatie of dienst wel geschikt is voor een MongoDB back-end, heeft men de beschikking over een database met ongekende mogelijkheden, prestaties en flexibiliteit. De architectuur is ingericht om optimaal gebruik te kunnen maken van de schaalbaarheid die ook kenmerkend is voor Cloud technologie.

MongoDB is een product dat nog volop in ontwikkeling is. Terwijl er bij iedere nieuwe versie nog steeds grote stappen worden gemaakt, zijn de versies die beschikbaar zijn voor Linux distributies als Ubuntu en Debian inmiddels stabiel en compleet genoeg om in productie genomen te worden.


Jeroen Bakker is inmiddels ruim 10 jaar werkzaam in de hostingbranche en houdt zich bezig met de zakelijke strategie en communicatie bij Cyso Managed Hosting.