Du hoster sandsynligvis din MongoDB hos en pålidelig cloud-tjenesteudbyder, f.eks. Atlas, fordi du virkelig ønsker at fokusere på din idé og uddelegere alle de subtile nøgleadministrationsområder såsom netværk, lagring, adgang osv.
Det hele ser godt ud i starten, indtil din lille idé begynder at blive til en forretning, og omkostningerne begynder at skyde i vejret. Selvom det ikke er tilfældet, vil dette indlæg stadig give dig et generelt overblik over de involverede tekniske kompleksiteter (og sparede penge!), hvis du skulle migrere til en selv-hostet løsning.
BTW, hvor mange besparelser taler vi om? Lad os lave en hurtig sammenligning mellem et atlas instans og en selv-hostet MongoDB på AWS .
Atlas (~166 USD/måned)
$0,23/time baseret på de ovenfor valgte krav (~ cloud.mongodb.com)
AWS (~36 USD/måned)
0,0416 USD/time for forekomsten og yderligere priser baseret på EBS-typen og lagring (~ calculator.aws)
Det er næsten 4,5x besparelse bare i forhold til infrastrukturen!
Nu hvor du kender de vigtigste årsager og stadig læser dette indlæg, lad os uden videre dykke ned i teknologien.
Kontur
- Opsætning af infrastrukturen
- Opsætning af MongoDB
- Massemigrering
- Delta-synkronisering for at bygge bro mellem forbindelsesswitch-latenstiden (gælder ikke for forældede klynger)
Da hele indholdet kan være lidt udmattende ét sted, vil jeg opdele dette i 2 relaterede indlæg.
1. Opsætning af infrastrukturen
Jeg vil nedenfor nævne vejledningen til opsætning af en instans, der kører RedHat Enterprise Linux 8 på AWS. Dette skyldes, at MongoDB generelt klarer sig bedre med xfs-filsystemet. Her er en artikel for at forstå det bedre.
Spind en EC2-instans op
Jeg har brugt en t3.small
instans, der kommer med 2 vCPU'er og 2 Gb RAM selvom du kan vælge en hvilken som helst instans efter eget valg.
Det anbefales, at din DB skal have adgang til mindst 1 GB RAM og 2 rigtige kerner da det direkte påvirker ydeevnen under cachelagring og samtidighedsmekanismer som håndteret af standardmotoren WiredTiger . Du kan læse mere om produktionsnoterne relateret til RAM- og CPU-kravene her .
Konfigurationsoversigt:
- OS:Redhat Enterprise Linux 8 (x64 intel-baseret)
- Forekomsttype:t3.small
- Lagerplads:10 GB (os) + 30 GB (data) + 3 GB (logfiler) af EBS dvs. 3 separate bind
Jeg går ud fra, at du er bekendt med at oprette en VM på AWS.
Nu, når forekomsten er i kørende tilstand, skal du tildele en elastisk IP til den, og lav derefter et fjernlogin på maskinen.
Vi skal bruge den elastiske IP for at opsætte offentligt værtsnavn for forekomsten
$ ssh -i <PEM_FILE> ec2-user@<ELASTIC_IP>
Monter yderligere bind
Vi har tilføjet 2 yderligere EBS-volumener ud over Root FS for Data og Logs, som endnu ikke er monteret (Husker du 30Gb og 3Gb? ). Du kan liste lydstyrkeblokkene ved hjælp af,
$ sudo lsblk
De ekstra volumener vil blive vist lige efter rodblokken (se pilene)
På billedet ovenfor kan du se, at de ekstra bind er navngivet
- xvdb (30 Gb plads til at gemme data)
- xvdc (3 Gb plads til at gemme logfiler)
Lad os nu oprette filsystemerne i disse bind.
$ sudo mkfs.xfs -L mongodata /dev/xvdb
$ sudo mkfs.xfs -L mongologs /dev/xvdc
-L
er en aliasindstilling til indstilling af volumenetiketten
Og monter derefter volumener.
$ sudo mount -t xfs /dev/xvdb /var/lib/mongo
$ sudo mount -t xfs /dev/xvdc /var/log/mongodb
For at disse ændringer skal afspejle sig, skal systemet genstartes. Derfor har vi nu også brug for partitionens persistens, så vi i tilfælde af en utilsigtet genstart ikke mister databaselageret.
Vi kan opnå dette ved at specificere monteringsreglerne i fstab-filen. Du kan læse mere om det her.
Før det, lad os kopiere UUID'et for ovenstående partitioner (fordi de er unikke og vil ikke ændre sig ved en systemgenstart )
$ sudo blkid
Kopier de UUID'er, der er angivet for /dev/xvdb og /dev/xvdc . Se "LABEL" til blokidentifikation
Åbn nu /etc/fstab
fil og indsæt konfigurationen i følgende format.
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
Opdater værtsnavn
Værtsnavnet vil blive brugt til at identificere din databaseserver på netværket. Du kan enten bruge den ovenfor tildelte elastiske IP eller Domænenavn (hvis tilgængeligt). Åbn /etc/hostname
fil og tilføj posten. For f.eks.
ip-xx.us-east-2.compute.internal **<ELASTIC_IP> <DOMAIN_1> <DOMAIN_2>** ...
Opdater procesgrænserne (valgfrit)
Dette er valgfrit påkrævet for at kontrollere det maksimale antal acceptable forbindelser og samtidig holde systemet stabilt. Åbn /etc/security/limits.conf
fil og tilføj følgende poster.
* soft nofile 64000
* hard nofile 64000
* soft nproc 32000
* hard nproc 32000
Nu hvor alle de infra-relaterede forudsætninger er sorteret, genstart instansen, og lad os fortsætte til MongoDB-installationen.
1. Opsætning af MongoDB
Tilføj Repo-kilden
Opret en fil /etc/yum.repos.d/mongodb-org.4.2.repo
og tilføj følgende pakkeopbevaringsdetaljer.
[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
Lad os nu installere MongoDB.
$ sudo yum -y install mongodb-org
Opret mapper og opsætningstilladelser
MongoDB bruger som standard følgende stier til at gemme dataene og de interne logfiler:
/var/lib/mongo → Data
/var/log/mongodb → Logfiler
Opret mapperne
$ sudo mkdir /var/lib/mongo
$ sudo mkdir /var/log/mongodb
Skift bruger- og gruppetilladelser
$ sudo chown mongod:mongod /var/lib/mongo
$ sudo chown mongod:mongod /var/log/mongod
Opret en administratorbruger
mongod-dæmonen/tjenesten skal køre først, før vi fortsætter med at oprette en bruger. Lad os bruge standardkonfigurationen (gemt i /etc/mongod.conf
) for nu og start dæmonprocessen.
$ sudo -u mongod mongod -f /etc/mongod.conf
Ovenstående kommando vil starte mongod-dæmonen i gaffeltilstand (standard).
Lad os nu logge ind på serveren og oprette vores første administratorbruger.
Åbn en mongo-skal
$ mongo
Brug "admin"-databasen til at oprette root-admin
> use admin
Opret administratorbrugeren
> db.createUser({user: "admin", pwd: "password", roles: [{role: "root", db: "admin"}]})
Opret en almindelig bruger
> db.createUser({user: "normal_user", pwd: "password", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})
Luk serveren for nu. Vi genstarter igen med den ændrede konfiguration
> db.shutDownServer()
Opsætning af godkendelse
Her aktiverer vi databasegodkendelsen og ændrer bindingsadressen til vores server, så den er tilgængelig i det offentlige domæne. Åbn /etc/mongod.conf
og foretag nedenstående ændringer.
# 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
Gem konfigurationen og genstart serveren.
$ sudo -u mongod mongod -f /etc/mongod.conf
Test login
Du kan kontrollere, om legitimationsoplysningerne fungerer ved hjælp af,
$ mongo -u admin -p password
Det er det om den indledende opsætning! Hold øje med mit næste relaterede indlæg om den detaljerede migreringsproces og tips til at holde DB-produktionsklar.
P.S. Tak til Piyush Kumar for at hjælpe med at kurere dette indlæg!