sql >> Database >  >> NoSQL >> MongoDB

Hoe in productie te gaan met MongoDB - Top tien tips

Na de succesvolle ontwikkeling van de applicatie en voordat u zich wijdt aan de productie van MongoDB, moet u rekening houden met deze snelle richtlijnen om een ​​soepele en efficiënte doorstroming te garanderen en optimale prestaties te bereiken.

1) Implementatie-opties

Selectie van de juiste hardware

Voor optimale prestaties verdient het de voorkeur om SSD te gebruiken in plaats van de HDD. Het is noodzakelijk om ervoor te zorgen dat uw opslag lokaal of op afstand is en dienovereenkomstig maatregelen te nemen. Het is beter om RAID te gebruiken voor de bescherming van hardwaredefecten en het herstelschema, maar vertrouw er niet volledig op, aangezien het geen enkele bescherming biedt tegen nadelige storingen. Voor uitvoering op schijven past RAID-10 goed in termen van prestaties en beschikbaarheid, wat vaak ontbreekt in andere RAID-niveaus. De juiste hardware is de bouwsteen voor uw applicatie voor geoptimaliseerde prestaties en om elk groot debacle te voorkomen.

Cloudhosting

Er is een reeks cloudleveranciers beschikbaar die vooraf geïnstalleerde MongoDB-databasehosts aanbieden. De selectie van de beste keuze is de basisstap voor uw toepassing om te groeien en eerste indrukken op de doelmarkt te maken. MongoDB Atlas is een van de mogelijke keuzes die een complete oplossing biedt voor een cloudinterface met functies zoals implementatie van uw knooppunten en een momentopname van uw gegevens die zijn opgeslagen in Amazon S3. ClusterControl is een andere goede beschikbare optie voor eenvoudige implementatie en schaalbaarheid. Die een verscheidenheid aan functies biedt, zoals het eenvoudig toevoegen en verwijderen van knooppunten, het formaat van instanties wijzigen en het klonen van uw productiecluster. U kunt ClusterControl hier uitproberen zonder te betalen. Andere beschikbare opties zijn RackSpace ObjectRocket en MongoStitch.

2) RAM

Veelgebruikte items worden in het RAM-geheugen opgeslagen, zodat MongoDB een optimale responstijd kan bieden. RAM hangt meestal af van de hoeveelheid gegevens die u gaat opslaan, het aantal verzamelingen en indexen. Zorg ervoor dat je genoeg RAM hebt om je indexen te kunnen herbergen, anders zal het de prestaties van je applicatie tijdens de productie drastisch beïnvloeden. Meer RAM betekent minder paginafouten en een betere responstijd.

3) Indexeren

Voor toepassingen die chronische schrijfverzoeken bevatten, speelt indexering een dwingende rol. Volgens MongoDB-documenten:

"Als een schrijfbewerking een geïndexeerd veld wijzigt, werkt MongoDB alle indexen bij die het gewijzigde veld als sleutel hebben"

Wees dus voorzichtig bij het kiezen van indexen, aangezien dit uw DB-prestaties kan beïnvloeden.

Indexeringsvoorbeeld:voorbeeldinvoer in de restaurantdatabase

{
  "address": {
     "building": "701",
     "street": "Harley street",
     "zipcode": "71000"
  },
  "cuisine": "Bakery",
  "grades": [
     { "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
     { "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
     { "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
     { "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
     { "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
  ],
  "name": "Bombay Bakery",
  "restaurant_id": "187521"
}
  1. Index maken op één veld

    > db.restaurants.createIndex( { "cuisine": 1 } );
    {
         "createdCollectionAutomatically" : false,
         "numIndexesBefore" : 1,
         "numIndexesAfter" : 2,
         "ok" : 1
    }

    In het bovenstaande voorbeeld wordt een oplopende volgorde-index gemaakt op het keukenveld.

  2. Index maken op meerdere velden

    > db.restaurants.createIndex( { "cuisine": 1 , "address.zipcode": -1 } );
    {
            "createdCollectionAutomatically" : false,
            "numIndexesBefore" : 2,
            "numIndexesAfter" : 3,
            "ok" : 1
    }

    Hier wordt een samengestelde index gemaakt op keuken- en postcodevelden. Het -ve getal definieert de aflopende volgorde.

4) Wees voorbereid op sharding

MongoDB verdeelt de gegevens in verschillende machines met behulp van een mechanisme dat sharding wordt genoemd. Het is niet aan te raden om in het begin sharding toe te voegen, tenzij u flinke datasets verwacht. Vergeet niet om de prestaties van uw toepassing in lijn te houden, u hebt een goede sharding-sleutel nodig, volgens uw gegevenspatronen, omdat dit rechtstreeks van invloed is op uw reactietijd. Het uitbalanceren van gegevens over shards is automatisch. Het is echter beter om voorbereid te zijn en een goed plan te hebben. U kunt dus consolideren wanneer uw toepassing daarom vraagt.

5) Best practices voor OS-configuratie

  • XFS-bestandssysteem
    • Het is een zeer schaalbaar, krachtig 64-bits journaalbestandssysteem. Verbetert de I/O-prestaties door minder en grotere I/O-bewerkingen toe te staan.
  • Leg bestandsdescriptorlimiet toe.
  • Schakel transparante grote pagina's en niet-uniform toegangsgeheugen (NUMA) uit.
  • Verander de standaard TCP keepalive-tijd in 300 seconden (voor Linux) en 120 seconden (voor Azure).

Probeer deze commando's om de standaard keepalive-tijd te wijzigen;

Voor Linux

sudo sysctl -w net.ipv4.tcp_keepalive_time=<value>

Voor Windows

Typ deze opdracht in de opdrachtprompt als beheerder, waarbij wordt uitgedrukt in hexadecimaal (bijv. 120000 is 0x1d4c0):

reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ /t REG_DWORD /v KeepAliveTime /d <value>

6) Zorgen voor hoge beschikbaarheid door middel van replicatie

Als u in productie gaat zonder replicatie, kan uw app plotseling uitvallen. Replicatie lost het probleem op als een knoop punt uitvalt. Beheer lees- en schrijfbewerkingen voor uw secundaire MongoDB-instanties volgens uw toepassingsbehoeften.

Houd deze dingen in gedachten tijdens het repliceren:

  • Voor hoge beschikbaarheid implementeert u uw replicaset in minimaal drie datacenters.
  • Zorg ervoor dat MongoDB-instanties 0 of 1 stemmen hebben.
  • Zorg voor volledige bidirectionele netwerkconnectiviteit tussen alle MongoDB-instanties.

Voorbeeld van het maken van een replicaset met 4 lokale MongoDB-instanties:

  1. 4 lokale MongoDB-instanties maken

    Maak eerst gegevensmappen

    mkdir -p /data/m0
    mkdir -p /data/m1
    mkdir -p /data/m2
    mkdir -p /data/m3
  2. Start 4 lokale instanties

    mongod --replSet cluster1 --port 27017 --dbpath /data/m0
    mongod --replSet cluster2 --port 27018 --dbpath /data/m1
    mongod --replSet cluster1 --port 27019 --dbpath /data/m2
    mongod --replSet cluster1 --port 27020 --dbpath /data/m3
  3. Voeg de instanties toe aan het cluster en start

    mongo myhost:34014
    myConfig = {_id: ‘cluster1’, members: [
        {_id: 0, host: ‘myhost1:27017’},
        {_id: 1, host: ‘myhost2:27018’},
        {_id: 2, host: ‘myhost3:27019’},
        {_id: 3, host: ‘myhost4:27020’}]
    }
    rs.initiate(myConfig);

Veiligheidsmaatregelen

7) Beveiligde machines

Open poorten op machines die MongoDB hosten, zijn kwetsbaar voor verschillende kwaadaardige aanvallen. Meer dan 30 duizend MongoDB-databases waren gecompromitteerd bij een ransomware-aanval als gevolg van vertraging in de juiste beveiligingsconfiguratie. Sluit tijdens de productie uw openbare poorten van de MongoDB-server. U moet echter één poort open houden voor Ssh-doeleinden.

Verificatie inschakelen op MongoDB-instantie:

  1. Start het bestand mongod.conf in uw favoriete editor.

  2. Voeg deze regels toe aan het einde van het configuratiebestand.

    security:
          authorization: enabled
  3. Voeg deze regels toe aan het einde van het configuratiebestand.

    service mongod restart
  4. Bevestig de status

    service mongod status

Externe toegang beperken

Open het bestand mongod.conf opnieuw om beperkte IP-toegang tot uw server in te stellen.

bind_ip=127.0.0.1

Door deze regel toe te voegen, betekent dit dat u alleen toegang hebt tot uw server via 127.0.0. (dat is localhost). U kunt ook meerdere IP's toevoegen aan de bindoptie.

bind_ip=127.0.0.1,168.21.200.200

Het betekent dat je toegang hebt vanaf localhost en je privénetwerk.

8) Wachtwoordbeveiliging

Schakel toegangscontrole in en dwing authenticatie af om een ​​extra beveiligingslaag aan uw machines toe te voegen. Ondanks het feit dat je de MongoDB-server hebt beperkt om verbindingen van de buitenwereld te accepteren, is er nog steeds een mogelijkheid dat kwaadaardige scripts je server binnendringen. Wees dus niet terughoudend om een ​​gebruikersnaam/wachtwoord voor uw database in te stellen en de vereiste machtigingen toe te wijzen. Als toegangscontrole is ingeschakeld, kunnen gebruikers alleen acties uitvoeren die worden bepaald door hun rol.

Hier zijn de stappen om een ​​gebruiker aan te maken en databasetoegang toe te wijzen met specifieke rollen.

In de eerste plaats zullen we een gebruiker maken (in dit geval is het admin) voor het beheren van alle gebruikers en databases en dan zullen we een specifieke database-eigenaar maken die alleen lees- en schrijfrechten heeft op één MongoDB-database-instantie.

Maak een admin-gebruiker voor het beheren van andere gebruikers voor database-instanties

  1. Open uw Mongo-shell en schakel over naar de beheerdersdatabase:

    use admin
  2. Maak een gebruiker aan voor de beheerdersdatabase

    db.createUser({ user: "admin", pwd: "admin_password", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
  3. Authenticeer nieuw aangemaakte gebruiker

    db.auth("admin", "admin_password")
  4. Specifieke instantiegebruiker maken:

    use database_1
    db.createUser({ user: "user_1", pwd: "your_password", roles: [{ role: "dbOwner", db: "database_1" }] })
  5. Controleer nu of een gebruiker succesvol is aangemaakt of niet.

    db.auth("user_1", "your_password")
    show collections

Dat is het! U hebt uw database-instanties met de juiste authenticatie beveiligd. U kunt zoveel gebruikers toevoegen als u wilt volgens dezelfde procedure.

9) Versleuteling en bescherming van gegevens

Als u Wiredtiger als opslagengine gebruikt, kunt u de configuratie voor versleuteling in rust gebruiken om uw gegevens te versleutelen. Zo niet, dan moet de codering op de host worden uitgevoerd met behulp van een bestandssysteem, apparaten of fysieke codering.

10) Controleer uw implementatie

Zodra u klaar bent met de implementatie van MongoDB in productie, moet u de prestatie-activiteit volgen om vroege mogelijke problemen te voorkomen. Er is een reeks strategieën die u kunt aanpassen om uw gegevensprestaties in de productieomgeving te bewaken.

  • MongoDB bevat hulpprogramma's die statistieken retourneren over de prestaties en activiteit van instanties. Hulpprogramma's worden gebruikt om problemen op te sporen en normale bewerkingen te analyseren.

  • Gebruik mongostat om de indeling van de soorten operaties en capaciteitsplanning te begrijpen.

  • Voor het bijhouden van rapporten en lees-schrijfactiviteiten wordt mongotop aanbevolen.

mongotop 15

Deze opdracht geeft elke 15 seconden een uitvoer.

                     ns    total    read    write          2018-04-22T15:32:01-05:00
   admin.system.roles      0ms     0ms      0ms
 admin.system.version      0ms     0ms      0ms
             local.me      0ms     0ms      0ms
       local.oplog.rs      0ms     0ms      0ms
   local.replset.minvalid  0ms     0ms      0ms
    local.startup_log      0ms     0ms      0ms
 local.system.indexes      0ms     0ms      0ms
  local.system.namespaces  0ms     0ms      0ms
 local.system.replset      0ms     0ms      0ms     
                     ns    total    read    write          2018-04-22T15:32:16-05:00
   admin.system.roles      0ms     0ms      0ms
 admin.system.version      0ms     0ms      0ms
             local.me      0ms     0ms      0ms
       local.oplog.rs      0ms     0ms      0ms
   local.replset.minvalid  0ms     0ms      0ms
    local.startup_log      0ms     0ms      0ms
 local.system.indexes      0ms     0ms      0ms
  local.system.namespaces  0ms     0ms      0ms
 local.system.replset      0ms     0ms      0ms

MongoDB Monitoring Service (MMS) is een andere beschikbare optie die uw MongoDB-cluster bewaakt en het voor u gemakkelijk maakt om zicht te hebben op productie-implementatie-activiteiten.

En natuurlijk is er ClusterControl van Verschillendenines, het automatiserings- en beheersysteem voor open source databases. ClusterControl maakt eenvoudige implementatie van clusters met geautomatiseerde beveiligingsinstellingen mogelijk en maakt het eenvoudig om problemen met uw database op te lossen door gebruiksvriendelijke beheerautomatisering te bieden, waaronder reparatie en herstel van kapotte knooppunten, automatische upgrades en meer. U kunt aan de slag met de (gratis voor altijd) Community-editie, waarmee u MongoDB kunt implementeren en controleren en aangepaste adviseurs kunt maken om uw monitoringinspanningen af ​​te stemmen op die aspecten die specifiek zijn voor uw installatie. Download het hier gratis.


  1. ClusterControl - Alle hoogtepunten en verbeteringen van functies vanaf 2017

  2. Wat is het verschil tussen area en BoundingBox uit de broncode van Redis?

  3. Hoe kan ik uit Redis lezen in een MULTI-blok in Ruby?

  4. Mangoest:schema versus model?