U host uw MongoDB waarschijnlijk op een betrouwbare cloudserviceprovider, bijvoorbeeld Atlas, omdat u zich echt op uw idee wilt concentreren en alle subtiele sleutelbeheergebieden, zoals netwerken, opslag, toegang, enz. wilt delegeren.
Het ziet er in eerste instantie allemaal goed uit totdat uw kleine idee een bedrijf begint te worden en de kosten omhoog schieten. Zelfs als dat niet het geval is, geeft dit bericht je nog steeds een algemeen overzicht van de technische complexiteit (en bespaard geld!) als je zou migreren naar een zelf-gehoste oplossing.
BTW, over hoeveel besparingen hebben we het? Laten we een snelle vergelijking maken tussen een Atlas instantie en een zelf-gehoste MongoDB op AWS .
Atlas (~$166/maand)
$ 0,23/uur op basis van de hierboven geselecteerde vereisten (~ cloud.mongodb.com)
AWS (~$36/maand)
$ 0,0416/uur voor de instantie en aanvullende prijzen op basis van het EBS-type en de opslag (~ calculator.aws)
Het is een besparing van bijna 4,5x alleen al in termen van infrastructuur!
Nu je de belangrijkste reden(en) kent en dit bericht nog steeds leest, laten we zonder verder oponthoud in de technologie duiken.
Overzicht
- Infrastructuur opzetten
- MongoDB instellen
- Bulkmigratie
- Deltasynchronisatie om de latentie van de verbindingsschakelaar te overbruggen (niet van toepassing op verouderde clusters)
Omdat de hele inhoud op één plek een beetje vermoeiend kan zijn, ga ik dit in 2 gerelateerde berichten verdelen.
1. De infrastructuur opzetten
Ik ga hieronder de gids noemen voor het opzetten van een instantie met RedHat Enterprise Linux 8 op AWS. Dit komt omdat MongoDB over het algemeen beter presteert met het xfs-bestandssysteem. Hier is een artikel om het beter te begrijpen.
Spin-up van een EC2-instantie
Ik heb een t3.small
. gebruikt instantie die wordt geleverd met 2 vCPU's en 2Gb RAM hoewel u elke instantie van uw keuze kunt selecteren.
Het wordt aanbevolen dat uw database toegang heeft tot ten minste 1GB RAM en 2 echte kernen omdat dat rechtstreeks van invloed is op de prestaties tijdens caching- en gelijktijdigheidsmechanismen zoals afgehandeld door de standaardengine WiredTiger . U kunt hier meer lezen over de productie-opmerkingen met betrekking tot de RAM- en CPU-vereisten .
Configuratieoverzicht:
- OS:Redhat Enterprise Linux 8 (x64 intel-gebaseerd)
- Instance Type:t3.small
- Opslag:10 GB (os) + 30GB (gegevens) + 3GB (logboeken) van EBS d.w.z. 3 afzonderlijke volumes
Ik neem aan dat je bekend bent met het maken van een VM op AWS.
Als de instantie nu actief is, wijst u een elastisch IP-adres toe ernaartoe en doe dan gewoon een externe login op de machine.
We hebben de elastische IP . nodig openbare hostnaam instellen voor de instantie
$ ssh -i <PEM_FILE> ec2-user@<ELASTIC_IP>
Extra volumes koppelen
We hebben 2 extra EBS-volumes toegevoegd, behalve de Root FS voor gegevens en logboeken die nog moeten worden gemount (Herinner je je de 30Gb en 3Gb? ). U kunt de volumeblokken weergeven met,
$ sudo lsblk
De extra volumes worden direct na het rootblok weergegeven (zie de pijlen)
In de afbeelding hierboven kunt u zien dat de extra volumes heten
- xvdb (30Gb ruimte om gegevens op te slaan)
- xvdc (3Gb ruimte om logs op te slaan)
Laten we nu de bestandssystemen in die volumes maken.
$ sudo mkfs.xfs -L mongodata /dev/xvdb
$ sudo mkfs.xfs -L mongologs /dev/xvdc
-L
is een aliasoptie voor het instellen van het volumelabel
En koppel vervolgens de volumes.
$ sudo mount -t xfs /dev/xvdb /var/lib/mongo
$ sudo mount -t xfs /dev/xvdc /var/log/mongodb
Om deze wijzigingen weer te geven, moet het systeem opnieuw worden opgestart. Daarom hebben we nu ook de partitiepersistentie nodig, zodat we in het geval van een onbedoelde herstart de databaseopslag niet verliezen.
We kunnen dit bereiken door de mount-regels op te geven in het fstab-bestand. Je kunt er hier meer over lezen.
Laten we eerst de UUID van de bovenstaande partities kopiëren (omdat ze uniek zijn en niet veranderen als het systeem opnieuw wordt opgestart )
$ sudo blkid
Kopieer de UUID's vermeld voor /dev/xvdb en /dev/xvdc . Raadpleeg het “LABEL” voor blokidentificatie
Open nu de /etc/fstab
bestand en plak de configuratie in het volgende formaat.
UUID=<COPIED_UUID_FOR_DATA> /var/lib/mongo xfs defaults,nofail 0 0
UUID=<COPIED_UUID_FOR_LOGS> /var/log/mongodb xfs defaults,nofail 0 0
Hostnaam bijwerken
De hostnaam wordt gebruikt om uw databaseserver op het netwerk te identificeren. U kunt ofwel het hierboven toegewezen Elastic IP . gebruiken of Domeinnaam (indien beschikbaar). Open de /etc/hostname
bestand en voeg het item toe. Voor bijv.
ip-xx.us-east-2.compute.internal **<ELASTIC_IP> <DOMAIN_1> <DOMAIN_2>** ...
De proceslimieten bijwerken (optioneel)
Dit is optioneel vereist om het maximale aantal acceptabele verbindingen te controleren terwijl het systeem stabiel blijft.Open de /etc/security/limits.conf
bestand en voeg de volgende items toe.
* soft nofile 64000
* hard nofile 64000
* soft nproc 32000
* hard nproc 32000
Nu alle infra-gerelateerde vereisten zijn gesorteerd, opnieuw opstarten de instantie, en laten we doorgaan met de installatie van MongoDB.
1. MongoDB instellen
De opslagbron toevoegen
Maak een bestand /etc/yum.repos.d/mongodb-org.4.2.repo
en voeg de volgende pakketgegevens toe.
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
Laten we nu MongoDB installeren.
$ sudo yum -y install mongodb-org
Mappen maken en machtigingen instellen
MongoDB gebruikt standaard de volgende paden om de gegevens en de interne logboeken op te slaan:
/var/lib/mongo → Gegevens
/var/log/mongodb → Logboeken
Maak de mappen
$ sudo mkdir /var/lib/mongo
$ sudo mkdir /var/log/mongodb
Gebruikers- en groepsrechten wijzigen
$ sudo chown mongod:mongod /var/lib/mongo
$ sudo chown mongod:mongod /var/log/mongod
Maak een beheerder aan
De mongod daemon/service moet eerst worden uitgevoerd voordat we doorgaan met het maken van een gebruiker. Laten we de standaardconfiguratie gebruiken (opgeslagen in /etc/mongod.conf
) voor nu en start het daemon-proces.
$ sudo -u mongod mongod -f /etc/mongod.conf
Het bovenstaande commando start de mongod-daemon in de fork-modus (standaard).
Laten we nu inloggen op de server en onze eerste admin-gebruiker maken.
Open een mongoschelp
$ mongo
Gebruik de "admin" database om de root-admin aan te maken
> use admin
Maak de admin-gebruiker
> db.createUser({user: "admin", pwd: "password", roles: [{role: "root", db: "admin"}]})
Maak een gewone gebruiker
> db.createUser({user: "normal_user", pwd: "password", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})
Sluit de server voor nu af. We herstarten opnieuw met de gewijzigde configuratie
> db.shutDownServer()
Verificatie instellen
Hier schakelen we de database-authenticatie in en wijzigen we het bindadres voor onze server om toegankelijk te zijn in het publieke domein.Open /etc/mongod.conf
en breng de onderstaande wijzigingen aan.
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # accessible on the network address
security:
authorization: enabled # creds will be required for making db operations
Sla de configuratie op en start opnieuw de server.
$ sudo -u mongod mongod -f /etc/mongod.conf
Test login
U kunt controleren of de inloggegevens werken met,
$ mongo -u admin -p password
Dat is het over de initiële setup! Blijf op de hoogte voor mijn volgende gerelateerde bericht over het gedetailleerde migratieproces en tips om de DB productiegereed te houden.
PS Met dank aan Piyush Kumar voor het helpen samenstellen van dit bericht!