15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți
23.10.2024

Cum să Instalezi și să Configurezi MongoDB pe un VPS (Ghid Complet)

MongoDB este o bază de date NoSQL orientată pe documente care stochează înregistrările ca documente BSON (Binary JSON), permițând modelarea datelor fără schemă cu scalabilitate orizontală prin sharding nativ. Spre deosebire de bazele de date relaționale, MongoDB nu necesită o schemă de tabel predefinită, ceea ce o face alegerea dominantă pentru aplicațiile cu structuri de date în evoluție, un debit ridicat de scriere sau relații ierarhice între date.

Acest ghid parcurge un deployment MongoDB de nivel producție pe un VPS Linux — acoperind instalarea din depozitul oficial, întărirea autentificării, controlul accesului la rețea, configurarea TLS, ajustarea performanței și automatizarea backup-urilor. Fiecare pas presupune că operați într-un mediu de server real unde securitatea și fiabilitatea sunt non-negociabile.

Cerințe preliminare

Înainte de a continua, confirmați următoarele:

  • Un VPS care rulează Ubuntu 20.04 LTS sau Ubuntu 22.04 LTS (comenzile sunt identice pentru ambele)
  • Acces de utilizator root sau cu privilegii sudo prin SSH
  • Minimum 2 GB RAM (4 GB recomandat pentru sarcini de lucru în producție)
  • Cel puțin 20 GB de spațiu disponibil pe disc pe un volum de stocare rapid
  • UFW sau iptables disponibil pentru gestionarea firewall-ului
  • Familiaritate de bază cu linia de comandă Linux

> Notă arhitecturală: Motorul de stocare WiredTiger al MongoDB utilizează un cache intern implicit de 50% din (RAM – 1 GB). Pe un VPS de 2 GB, aceasta produce aproximativ 512 MB de cache. Pentru sarcini de lucru intensive în citire, alocați cel puțin 4 GB RAM pentru a evita I/O constant pe disc din cauza presiunii cache-ului.

MongoDB vs. Alte Baze de Date NoSQL: Comparație Rapidă

CaracteristicăMongoDBRedisCassandraCouchDB
Model de dateDocument (BSON)Cheie-valoareColoană largăDocument (JSON)
Limbaj de interogareMQL (interogări bogate)ComenziCQLMango / MapReduce
Scalare orizontalăSharding nativMod clusterNativăMulti-master
Tranzacții ACIDDa (v4.0+, multi-doc)Parțial (scripturi Lua)UșoareDa
Cel mai bun caz de utilizareAplicații de uz general, API-uriCaching, sesiuniSerii de timp, IoTSincronizare offline-first
Persistență pe discStocare primarăOpțional (RDB/AOF)Stocare primarăStocare primară
Căutare full-textAtlas Search / index textLimitatăNuLimitată

Pasul 1: Actualizați Sistemul

Începeți întotdeauna cu un sistem complet actualizat. Pachetele învechite introduc CVE-uri cunoscute care pot fi exploatate înainte de a instala chiar și stiva de aplicații.

sudo apt update && sudo apt upgrade -y

După aplicarea actualizărilor de kernel sau libc, reporniți pentru a activa noul kernel:

sudo reboot

Reconectați-vă prin SSH după ce serverul revine online (de obicei 30–60 de secunde).

Pasul 2: Instalați MongoDB din Depozitul Oficial

Depozitele apt implicite ale Ubuntu conțin o versiune învechită, reîmpachetată de comunitate, a MongoDB, care nu dispune de patch-uri de securitate recente și îmbunătățiri ale motorului. Instalați întotdeauna din depozitul oficial MongoDB.

Adăugați Cheia GPG MongoDB și Depozitul

Comanda apt-key este depreciată pe Ubuntu 22.04. Utilizați metoda recomandată cu keyring, care funcționează atât pe 20.04, cât și pe 22.04:

curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | 
  sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg

Adăugați intrarea oficială a depozitului:

echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] 
  https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/7.0 multiverse" | 
  sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

> Notă versiune: Înlocuiți 7.0 cu versiunea țintă (de ex., 6.0) dacă aveți nevoie de o versiune specifică pentru compatibilitatea aplicației. MongoDB 7.0 este versiunea actuală cu suport pe termen lung începând cu 2024.

Instalați Pachetele MongoDB

sudo apt update
sudo apt install -y mongodb-org

Aceasta instalează următoarele componente:

    mongod — daemonul principal al bazei de date
    mongos — routerul de sharding (utilizat în deployment-urile cu cluster sharded)
    mongosh — shell-ul modern MongoDB (înlocuiește binarul legacy mongo)
    mongodb-database-tools — include mongodump, mongorestore, mongoexport și mongoimport

    Fixați Versiunea Instalată

    Preveniți upgrade-urile neintenționate care ar putea rupe compatibilitatea aplicației:

    echo "mongodb-org hold" | sudo dpkg --set-selections
    echo "mongodb-org-database hold" | sudo dpkg --set-selections
    echo "mongodb-org-server hold" | sudo dpkg --set-selections
    echo "mongosh hold" | sudo dpkg --set-selections
    echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
    echo "mongodb-org-tools hold" | sudo dpkg --set-selections

    Pasul 3: Configurați Cerințele Preliminare la Nivel de Sistem

    MongoDB funcționează cel mai bine când anumiți parametri de kernel și sistem de fișiere sunt ajustați înainte de pornirea daemonului.

    Setați ulimit pentru Fișiere Deschise

    MongoDB necesită o limită ridicată a descriptorilor de fișiere. Creați o suprascriere systemd:

    sudo mkdir -p /etc/systemd/system/mongod.service.d
    sudo tee /etc/systemd/system/mongod.service.d/limits.conf > /dev/null <<EOF
    [Service]
    LimitFNOFILE=64000
    LimitNPROC=64000
    EOF

    Dezactivați Transparent Huge Pages (THP)

    THP cauzează vârfuri semnificative de latență în MongoDB. Dezactivați-l persistent:

    sudo tee /etc/systemd/system/disable-thp.service > /dev/null <<EOF
    [Unit]
    Description=Disable Transparent Huge Pages (THP)
    DefaultDependencies=no
    After=sysinit.target local-fs.target
    Before=mongod.service
    
    [Service]
    Type=oneshot
    ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
    ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null'
    
    [Install]
    WantedBy=basic.target
    EOF
    
    sudo systemctl daemon-reload
    sudo systemctl enable --now disable-thp

    Verificați că setarea a intrat în vigoare:

    cat /sys/kernel/mm/transparent_hugepage/enabled

    Rezultatul ar trebui să afișeze [never] ca valoare activă.

    Pasul 4: Porniți și Activați MongoDB

    sudo systemctl daemon-reload
    sudo systemctl start mongod
    sudo systemctl enable mongod

    Confirmați că daemonul rulează:

    sudo systemctl status mongod

    Căutați Active: active (running) în rezultat. Dacă serviciul nu pornește, inspectați imediat jurnalul:

    sudo tail -50 /var/log/mongodb/mongod.log

    Eșecurile comune la pornire includ:

    • Portul 27017 deja în uz — un alt proces este legat la port; identificați-l cu sudo ss -tlnp | grep 27017
    • Permisiuni director de date — utilizatorul mongod trebuie să dețină /var/lib/mongodb; remediați cu sudo chown -R mongodb:mongodb /var/lib/mongodb
    • THP încă activat — motorul WiredTiger înregistrează un avertisment și poate degrada performanța

    Pasul 5: Securizați MongoDB — Autentificare și Autorizare

    Aceasta este secțiunea cea mai critică. Instanțele MongoDB neprotejate expuse la internet au fost responsabile pentru mii de breșe de date. Instalarea implicită nu are nicio autentificare, ceea ce înseamnă că oricine poate ajunge la portul 27017 are acces complet de citire/scriere la fiecare bază de date.

    Creați Utilizatorul Administrativ

    Conectați-vă la shell-ul local MongoDB (nu este necesară autentificarea înainte de activarea acesteia):

    mongosh

    În interiorul shell-ului, comutați la baza de date admin și creați un superutilizator:

    use admin
    
    db.createUser({
      user: "adminuser",
      pwd: passwordPrompt(),
      roles: [
        { role: "userAdminAnyDatabase", db: "admin" },
        { role: "readWriteAnyDatabase", db: "admin" },
        { role: "dbAdminAnyDatabase", db: "admin" },
        { role: "clusterAdmin", db: "admin" }
      ]
    })

    Utilizarea passwordPrompt() în loc de un șir de text simplu împiedică apariția parolei în istoricul shell-ului. Introduceți parola când vi se solicită, apoi ieșiți:

    exit

    Activați Autentificarea în mongod.conf

    Deschideți fișierul de configurare MongoDB:

    sudo nano /etc/mongod.conf

    Localizați secțiunea security (va fi comentată) și activați autorizarea:

    security:
      authorization: enabled

    Salvați și ieșiți (Ctrl+X, apoi Y, apoi Enter), apoi reporniți daemonul:

    sudo systemctl restart mongod

    Verificați că Autentificarea Este Aplicată

    Încercați o conexiune neautentificată — aceasta ar trebui să eșueze acum:

    mongosh --eval "db.adminCommand({ listDatabases: 1 })"

    Ar trebui să primiți o eroare Unauthorized. Acum autentificați-vă corect:

    mongosh -u adminuser -p --authenticationDatabase admin

    Creați Utilizatori cu Domeniu de Aplicație

    Nu utilizați niciodată superutilizatorul admin pentru conexiunile aplicației. Creați un utilizator cu privilegii minime pentru fiecare bază de date a aplicației:

    use myappdb
    
    db.createUser({
      user: "appuser",
      pwd: passwordPrompt(),
      roles: [
        { role: "readWrite", db: "myappdb" }
      ]
    })

    Pasul 6: Configurați Legarea la Rețea și Regulile Firewall

    Restricționați sau Extindeți bindIp

    În mod implicit, mongod.conf se leagă doar la 127.0.0.1. Aceasta este setarea corectă dacă aplicația dvs. rulează pe același VPS. Dacă aveți nevoie de acces de la distanță (de ex., de la un server de aplicații pe un host separat), editați /etc/mongod.conf:

    net:
      port: 27017
      bindIp: 127.0.0.1,10.0.0.5

    Înlocuiți 10.0.0.5 cu IP-ul privat specific al serverului dvs. de aplicații. Nu setați niciodată bindIp: 0.0.0.0 pe o interfață publică fără o regulă de firewall care restricționează accesul la IP-uri cunoscute. Legarea la toate interfețele fără firewall este cauza principală a incidentelor de expunere a datelor MongoDB.

    Reporniți după modificări:

    sudo systemctl restart mongod

    Configurați Regulile Firewall UFW

    Dacă este necesar accesul de la distanță, permiteți doar IP-ul de încredere specific:

    sudo ufw allow from 10.0.0.5 to any port 27017 proto tcp
    sudo ufw enable
    sudo ufw status verbose

    Blocați orice alt acces extern la portul 27017:

    sudo ufw deny 27017

    UFW procesează regulile în ordine — regula specifică allow from de deasupra regulii generale deny are prioritate pentru IP-ul de încredere.

    Pasul 7: Activați TLS/SSL pentru Conexiuni Criptate

    Pentru orice deployment în care traficul MongoDB traversează o rețea — chiar și un LAN privat — criptarea TLS este obligatorie. Fără aceasta, acreditările și datele sunt transmise în text simplu.

    Generați un certificat autosemnat pentru testare (utilizați un certificat semnat de CA în producție — luați în considerare asocierea acestuia cu un Certificat SSL pentru domeniul dvs.):

    sudo mkdir -p /etc/mongodb/ssl
    sudo openssl req -newkey rsa:4096 -nodes -keyout /etc/mongodb/ssl/mongodb.key 
      -x509 -days 365 -out /etc/mongodb/ssl/mongodb.crt 
      -subj "/CN=your-vps-hostname"
    sudo cat /etc/mongodb/ssl/mongodb.crt /etc/mongodb/ssl/mongodb.key | 
      sudo tee /etc/mongodb/ssl/mongodb.pem > /dev/null
    sudo chown -R mongodb:mongodb /etc/mongodb/ssl
    sudo chmod 600 /etc/mongodb/ssl/mongodb.pem

    Adăugați configurația TLS în /etc/mongod.conf:

    net:
      port: 27017
      bindIp: 127.0.0.1
      tls:
        mode: requireTLS
        certificateKeyFile: /etc/mongodb/ssl/mongodb.pem

    Reporniți MongoDB și conectați-vă cu TLS:

    sudo systemctl restart mongod
    mongosh --tls --tlsCertificateKeyFile /etc/mongodb/ssl/mongodb.pem 
      --tlsAllowInvalidCertificates -u adminuser -p --authenticationDatabase admin

    Flag-ul --tlsAllowInvalidCertificates este acceptabil doar pentru certificatele autosemnate în dezvoltare. Eliminați-l când utilizați un certificat semnat de CA.

    Pasul 8: Ajustarea Performanței în mongod.conf

    Pentru un deployment în producție pe un VPS cu resurse dedicate, ajustați cache-ul WiredTiger și setările de journaling. Deschideți /etc/mongod.conf și adăugați sau modificați următoarele:

    storage:
      dbPath: /var/lib/mongodb
      journal:
        enabled: true
      wiredTiger:
        engineConfig:
          cacheSizeGB: 1.5
    
    operationProfiling:
      slowOpThresholdMs: 100
      mode: slowOp
    
    replication:
      oplogSizeMB: 1024

    Parametrii cheie de ajustare explicați:

    • cacheSizeGB — Setați aceasta la aproximativ 50% din RAM disponibil minus 1 GB. Pe un VPS de 4 GB, utilizați 1.5. Pe un VPS de 8 GB, utilizați 3.5.
    • slowOpThresholdMs — Interogările care depășesc acest prag (în milisecunde) sunt înregistrate în profiler. Scăderea acestuia ajută la identificarea timpurie a interogărilor neindexate.
    • oplogSizeMB — Relevant dacă intenționați să adăugați membri ai setului de replici mai târziu. Dimensionarea prealabilă a oplog evită întârzierea replicării la sarcini de lucru cu scriere intensă.

    Aplicați modificările:

    sudo systemctl restart mongod

    Pasul 9: Backup și Restaurare cu mongodump

    Backup Manual

    mongodump 
      --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin" 
      --out /var/backups/mongodb/$(date +%Y-%m-%d)

    Restaurare Manuală

    mongorestore 
      --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin" 
      /var/backups/mongodb/2024-06-15

    Automatizați Backup-urile cu Cron

    Creați un script dedicat de backup:

    sudo tee /usr/local/bin/mongodb-backup.sh > /dev/null <<'EOF'
    #!/bin/bash
    BACKUP_DIR="/var/backups/mongodb"
    TIMESTAMP=$(date +%Y-%m-%d_%H-%M-%S)
    MONGO_URI="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
    RETENTION_DAYS=7
    
    mkdir -p "${BACKUP_DIR}/${TIMESTAMP}"
    mongodump --uri="${MONGO_URI}" --out="${BACKUP_DIR}/${TIMESTAMP}"
    find "${BACKUP_DIR}" -maxdepth 1 -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} ;
    EOF
    
    sudo chmod +x /usr/local/bin/mongodb-backup.sh

    Programați-l să ruleze zilnic la 2:00 AM:

    (crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/mongodb-backup.sh >> /var/log/mongodb-backup.log 2>&1") | crontab -

    > Considerație pentru producție: Stocați backup-urile în afara serverului. Păstrarea backup-urilor pe același VPS ca baza de date nu oferă nicio protecție împotriva defecțiunii discului sau compromiterii serverului. Utilizați rsync, rclone sau un magazin de obiecte compatibil S3 pentru a replica backup-urile într-o locație de la distanță.

    Pasul 10: Monitorizați Sănătatea MongoDB

    Comenzi de Monitorizare Integrate

    În interiorul mongosh, rulați statistici de server:

    db.serverStatus()
    db.stats()
    db.currentOp()

    Utilizați mongostat și mongotop

    Din shell, monitorizați numărul de operațiuni în timp real:

    mongostat --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"

    Monitorizați timpul de citire/scriere per colecție:

    mongotop --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"

    Metrici Cheie de Urmărit

    MetricăPrag de AvertizareCe Indică
    wiredTiger.cache.bytes currently in cache> 90% din cacheSizeGBPresiune cache; creșteți RAM sau reduceți setul de date
    connections.current> 80% din connections.availableEpuizarea pool-ului de conexiuni; ajustați pooling-ul aplicației
    opcounters.getmoreConstant ridicatIneficiență cursor; revizuiți modelele de interogare
    repl.lag (seturi de replici)> 10 secundeÎntârziere replicare; verificați rețeaua și I/O-ul discului
    locks.Global.acquireWaitCountOrice valoare susținutăContention de blocare; revizuiți operațiunile de lungă durată

    Alegerea Găzduirii Potrivite pentru MongoDB

    Performanța și fiabilitatea instanței dvs. MongoDB sunt direct legate de infrastructura de bază. Luați în considerare aceste niveluri de deployment:

    • Dezvoltare și staging: Un VPS standard cu 2–4 GB RAM este suficient pentru sarcini de lucru non-producție, testarea schemelor și medii de integrare.
    • Producție nod unic: Un VPS cu 4–8 GB RAM, stocare NVMe și un nucleu CPU dedicat gestionează traficul de producție moderat pentru majoritatea aplicațiilor web.
    • Producție cu debit ridicat: Un Server Dedicat elimină efectul de vecin zgomotos inerent mediilor virtualizate. Modelele I/O ale WiredTiger beneficiază semnificativ de pe urma array-urilor NVMe bare-metal.
    • Sarcini de lucru ML/analiză: Dacă rulați MongoDB alături de pipeline-uri de date, analiză intensivă în agregare sau căutare vectorială, Găzduirea GPU poate accelera sarcinile de procesare din aval.

    Pentru deployment-urile care necesită o interfață de gestionare grafică, VPS cu cPanel oferă un mediu familiar pentru echipele mai puțin confortabile cu administrarea prin CLI pur, deși editarea directă a mongod.conf rămâne necesară pentru configurarea avansată.

    Matricea de Decizie pentru Deployment

    Utilizați această listă de verificare înainte de a intra în producție:

    • [ ] MongoDB instalat din depozitul oficial, versiune fixată
    • [ ] Serviciul mongod activat și confirmat active (running)
    • [ ] Transparent Huge Pages dezactivat și verificat
    • [ ] ulimit pentru descriptori de fișiere setat la 64000 sau mai mare
    • [ ] Autentificarea activată în mongod.conf (authorization: enabled)
    • [ ] Utilizator admin creat cu passwordPrompt() — fără parole în text simplu în istoricul shell-ului
    • [ ] Utilizatori specifici aplicației creați cu roluri de privilegii minime
    • [ ] bindIp restricționat la localhost sau doar la IP-uri de încredere specifice
    • [ ] Reguli UFW în vigoare — portul 27017 blocat de pe internetul public
    • [ ] TLS activat cu un certificat valid
    • [ ] Cache WiredTiger dimensionat la 50% din (RAM – 1 GB)
    • [ ] Profilarea interogărilor lente activată (slowOpThresholdMs: 100)
    • [ ] Backup-uri zilnice automatizate cu replicare în afara serverului
    • [ ] Restaurarea backup-ului testată — un backup pe care nu l-ați restaurat niciodată nu este un backup

    Întrebări Frecvente

    Pe ce port implicit ascultă MongoDB și ar trebui schimbat?

    MongoDB ascultă implicit pe portul TCP 27017. Schimbarea acestuia la un port non-standard adaugă o obscuritate minoră, dar nu este un substitut pentru autentificare și regulile de firewall. Dacă îl schimbați, actualizați net.port în /etc/mongod.conf și ajustați toate regulile UFW și șirurile de conexiune în consecință.

    De ce folosește MongoDB atât de mult RAM chiar și cu un set de date mic?

    WiredTiger pre-alocă cache-ul său intern pe baza formulei max(50% of (RAM - 1 GB), 256 MB). Aceasta este intenționată — menținerea datelor de lucru în memorie elimină citirile de pe disc. Dacă consumul de RAM este o preocupare pe un VPS mic, setați explicit cacheSizeGB în /etc/mongod.conf la o valoare mai mică.

    Pot rula MongoDB pe găzduire partajată?

    Nu. MongoDB necesită un daemon de fundal persistent (mongod), acces direct la sistemul de fișiere pentru directorul său de date și capacitatea de a se lega la un port de rețea. Niciunul dintre acestea nu este disponibil pe Găzduirea Web Partajată. Un VPS este mediul minim viabil.

    Care este diferența dintre mongodump și un snapshot de sistem de fișiere pentru backup-uri?

    mongodump efectuează un backup logic — citește documentele prin interfața de interogare MongoDB și le exportă ca fișiere BSON. Este portabil și funcționează între versiuni, dar este mai lent și nu poate garanta consistența la un moment dat pe o instanță live cu scriere intensă fără --oplog. Un snapshot de sistem de fișiere (LVM, ZFS sau snapshot de stocare bloc în cloud) capturează fișierele de date brute la un moment consistent în timp și este semnificativ mai rapid pentru seturi de date mari, dar necesită ca motorul de stocare să fie într-o stare consistentă.

    Cum verific ce versiune de MongoDB este instalată?

    Rulați următoarea comandă din terminal:

    mongod --version

    Sau din interiorul mongosh:

    db.version()
    15%

    Economisește 15% la toate serviciile de găzduire

    Testează-ți abilitățile și obține Reducere la orice plan de găzduire

    Utilizați codul:

    Skills
    Începeți