Du är förmodligen värd för din MongoDB hos en pålitlig molntjänstleverantör, säg Atlas, till exempel eftersom du verkligen vill fokusera på din idé och delegera alla subtila nyckelhanteringsområden som nätverk, lagring, åtkomst, etc.
Allt ser bra ut initialt tills din lilla idé börjar förvandlas till ett företag och kostnaden börjar skjuta i höjden. Även om så inte är fallet kommer det här inlägget fortfarande att ge dig en allmän översikt över den tekniska komplexiteten som är involverad (och sparade pengar!) om du skulle migrera till en lösning som är värd för dig själv.
BTW, hur mycket besparingar pratar vi om? Låt oss göra en snabb jämförelse mellan en atlas instans och en självvärd MongoDB på AWS .
Atlas (~166 USD/månad)
0,23 USD/timme baserat på de ovan valda kraven (~ cloud.mongodb.com)
AWS (~36 USD/månad)
0,0416 USD/timme för instansen och ytterligare prissättning baserat på EBS-typ och lagring (~ calculator.aws)
Det är nästan 4,5x besparingar bara när det gäller infrastrukturen!
Nu när du vet de viktigaste varför och fortfarande läser det här inlägget, utan vidare, låt oss dyka in i tekniken.
Kontur
- Konfigurera infrastrukturen
- Konfigurera MongoDB
- Massmigrering
- Deltasynkronisering för att överbrygga anslutningsväxelns latens (ej tillämpligt på inaktuella kluster)
Eftersom hela innehållet kan vara lite ansträngande på ett ställe, tänker jag dela upp detta i två relaterade inlägg.
1. Konfigurera infrastrukturen
Jag kommer att nämna nedan guiden för att ställa in en instans som kör RedHat Enterprise Linux 8 på AWS. Detta beror på att MongoDB generellt presterar bättre med xfs-filsystemet. Här är en artikel för att förstå det bättre.
Snurra upp en EC2-instans
Jag har använt en t3.small
instans som kommer med 2 vCPU:er och 2 Gb RAM även om du kan välja vilken instans du vill.
Det rekommenderas att din DB ska ha tillgång till minst 1 GB RAM och 2 riktiga kärnor eftersom det direkt påverkar prestandan under cachning och samtidighetsmekanismer som hanteras av standardmotorn WiredTiger . Du kan läsa mer om produktionsanteckningarna relaterade till RAM- och CPU-kraven här .
Konfigurationsöversikt:
- OS:Redhat Enterprise Linux 8 (x64 Intel-baserat)
- Förekomsttyp:t3.small
- Lagring:10 GB (os) + 30 GB (data) + 3 GB (loggar) för EBS dvs 3 separata volymer
Jag antar att du är bekant med att skapa en virtuell dator på AWS.
Tilldela nu en elastisk IP när instansen är i körläge till den och gör sedan helt enkelt en fjärrinloggning till maskinen.
Vi behöver Elastic IP för att ställa in offentligt värdnamn för instansen
$ ssh -i <PEM_FILE> ec2-user@<ELASTIC_IP>
Montera ytterligare volymer
Vi har lagt till ytterligare 2 EBS-volymer förutom Root FS for Data and Logs som ännu inte har monterats (Kommer du ihåg 30Gb och 3Gb? ). Du kan lista volymblocken med,
$ sudo lsblk
De ytterligare volymerna kommer att listas direkt efter rotblocket (se pilarna)
I bilden ovan kan du se att de ytterligare volymerna är namngivna
- xvdb (30 Gb utrymme för att lagra data)
- xvdc (3 Gb utrymme för att lagra loggar)
Låt oss nu skapa filsystemen i dessa volymer.
$ sudo mkfs.xfs -L mongodata /dev/xvdb
$ sudo mkfs.xfs -L mongologs /dev/xvdc
-L
är ett aliasalternativ för att ställa in volymetiketten
Och montera sedan volymerna.
$ sudo mount -t xfs /dev/xvdb /var/lib/mongo
$ sudo mount -t xfs /dev/xvdc /var/log/mongodb
För att dessa ändringar ska återspeglas måste systemet startas om. Därför behöver vi nu också partitionsbeständigheten så att vi inte förlorar databaslagringen vid en oavsiktlig omstart.
Vi kan uppnå detta genom att specificera monteringsreglerna i fstab-filen. Du kan läsa mer om det här.
Låt oss innan dess kopiera UUID för partitionerna ovan (eftersom de är unika och kommer inte att ändras vid en omstart av systemet )
$ sudo blkid
Kopiera UUID:erna för /dev/xvdb och /dev/xvdc . Se ”LABEL” för blockidentifiering
Öppna nu /etc/fstab
fil och klistra in konfigurationen i följande 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
Uppdatera värdnamn
Värdnamnet kommer att användas för att identifiera din databasserver på nätverket. Du kan antingen använda ovan tilldelade Elastic IP eller Domännamn (om tillgängligt). Öppna /etc/hostname
fil och lägg till posten. För t.ex.
ip-xx.us-east-2.compute.internal **<ELASTIC_IP> <DOMAIN_1> <DOMAIN_2>** ...
Uppdatera processgränserna (valfritt)
Detta krävs valfritt för att kontrollera det maximala antalet acceptabla anslutningar och samtidigt hålla systemet stabilt. Öppna /etc/security/limits.conf
fil och lägg till följande poster.
* soft nofile 64000
* hard nofile 64000
* soft nproc 32000
* hard nproc 32000
Nu när alla infrarelaterade förutsättningar är sorterade starta om instansen, och låt oss fortsätta till MongoDB-installationen.
1. Konfigurera MongoDB
Lägg till repokällan
Skapa en fil /etc/yum.repos.d/mongodb-org.4.2.repo
och lägg till följande paketförrådsdetaljer.
[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
Låt oss nu installera MongoDB.
$ sudo yum -y install mongodb-org
Skapa kataloger och konfigurera behörigheter
MongoDB använder som standard följande sökvägar för att lagra data och de interna loggarna:
/var/lib/mongo → Data
/var/log/mongodb → Loggar
Skapa katalogerna
$ sudo mkdir /var/lib/mongo
$ sudo mkdir /var/log/mongodb
Ändra användar- och gruppbehörigheter
$ sudo chown mongod:mongod /var/lib/mongo
$ sudo chown mongod:mongod /var/log/mongod
Skapa en administratörsanvändare
mongod-demonen/tjänsten måste köras först innan vi fortsätter att skapa en användare. Låt oss använda standardkonfigurationen (lagrad i /etc/mongod.conf
) för nu och starta demonprocessen.
$ sudo -u mongod mongod -f /etc/mongod.conf
Ovanstående kommando kommer att starta mongod-demonen i gaffelläge (standard).
Nu, låt oss logga in på servern och skapa vår första administratörsanvändare.
Öppna ett mongoskal
$ mongo
Använd "admin"-databasen för att skapa root-admin
> use admin
Skapa administratörsanvändaren
> db.createUser({user: "admin", pwd: "password", roles: [{role: "root", db: "admin"}]})
Skapa en vanlig användare
> db.createUser({user: "normal_user", pwd: "password", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})
Stäng av servern tills vidare. Vi startar om igen med den ändrade konfigurationen
> db.shutDownServer()
Ställa in autentisering
Här aktiverar vi databasautentiseringen och ändrar bindningsadressen för vår server så att den är tillgänglig i det offentliga området. Öppna /etc/mongod.conf
och gör ändringarna nedan.
# 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
Spara konfigurationen och starta om servern.
$ sudo -u mongod mongod -f /etc/mongod.conf
Testa inloggning
Du kan verifiera om autentiseringsuppgifterna fungerar med,
$ mongo -u admin -p password
Det är det om den initiala installationen! Håll utkik efter mitt nästa relaterade inlägg om den detaljerade migreringsprocessen och tips om hur du håller DB-produktionsklar.
P.S. Tack till Piyush Kumar för att du hjälpte till att kurera detta inlägg!