sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man går in i produktion med MongoDB - Topp tio tips

Efter den framgångsrika utvecklingen av applikationen och innan du ägnar dig åt produktionen av MongoDB, räkna med dessa snabba riktlinjer för att säkerställa ett smidigt och effektivt flöde samt för att uppnå optimal prestanda.

1) Implementeringsalternativ

Val av rätt hårdvara

För optimal prestanda är det att föredra att använda SSD istället för hårddisken. Det är nödvändigt att se till om din lagring är lokal eller fjärransluten och vidta åtgärder i enlighet med detta. Det är bättre att använda RAID för att skydda hårdvarufel och återställningsschema, men lita inte helt på det, eftersom det inte erbjuder något skydd mot negativa fel. För körning på diskar passar RAID-10 bra när det gäller prestanda och tillgänglighet, vilket ofta saknas i andra RAID-nivåer. Rätt hårdvara är byggstenen för din applikation för optimerad prestanda och för att undvika större debacle.

Cloud Hosting

En rad molnleverantörer finns tillgängliga som erbjuder förinstallerade MongoDB-databasvärdar. Valet av bästa val är grundsteget för att din applikation ska växa och göra första intryck på målmarknaden. MongoDB Atlas är ett av de möjliga valen som erbjuder en komplett lösning för molngränssnitt med funktioner som distribution av dina noder och en ögonblicksbild av dina data lagrade i Amazon S3. ClusterControl är ett annat bra tillgängligt alternativ för enkel distribution och skalning. Som erbjuder en mängd funktioner som enkelt tillägg och borttagning av noder, ändra storlek på instanser och kloning av ditt produktionskluster. Du kan prova ClusterControl här utan att bli debiterad. Andra tillgängliga alternativ är RackSpace ObjectRocket och MongoStitch.

2) RAM

Ofta åtkomliga objekt cachelagras i RAM, så att MongoDB kan ge optimal svarstid. RAM-minne beror vanligtvis på mängden data du ska lagra, antalet samlingar och index. Se till att du har tillräckligt med RAM-minne för att rymma dina index, annars kommer det att drastiskt påverka din applikationsprestanda i produktionen. Mer RAM betyder färre sidfel och bättre svarstid.

3) Indexering

För applikationer som inkluderar kroniska skrivförfrågningar, spelar indexering en avgörande roll. Enligt MongoDB-dokument:

"Om en skrivoperation ändrar ett indexerat fält, uppdaterar MongoDB alla index som har det ändrade fältet som nyckel"

Så var försiktig när du väljer index eftersom det kan påverka din DB-prestanda.

Indexeringsexempel:Exempel på inmatning i restaurangdatabasen

{
  "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. Skapa index på enstaka fält

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

    I ovanstående exempel skapas stigande ordningsindex på köksfältet.

  2. Skapa index på flera fält

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

    Här skapas ett sammansatt index på mat- och postnummerfält. -ve-numret definierar fallande ordning.

4) Var beredd på delning

MongoDB partitionerar data i olika maskiner med en mekanism som kallas sharding. Det rekommenderas inte att lägga till sharding i början om du inte förväntar dig rejäla datamängder. Kom ihåg att hålla din applikations prestanda i linje, du behöver en bra skärningsnyckel, enligt dina datamönster eftersom det direkt påverkar din svarstid. Balansering av data över skärvor sker automatiskt. Men det är bättre att vara förberedd och ha en ordentlig plan. Så du kan konsolidera närhelst din applikation kräver det.

5) Bästa metoder för OS-konfiguration

  • XFS-filsystem
    • Det är mycket skalbart, högpresterande 64-bitars journalfilsystem. Förnyar I/O-prestanda genom att tillåta färre och större I/O-operationer.
  • Ange filbeskrivningsgräns.
  • Inaktivera genomskinliga enorma sidor och Nonuniform Access Memory (NUMA).
  • Ändra standardtiden för TCP Keepalive till 300 sekunder (för Linux) och 120 sekunder (för Azure).

Prova dessa kommandon för att ändra standard Keepalive-tid;

För Linux

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

För Windows

Skriv detta kommando i kommandotolken som administratör, där uttrycks i hexadecimal (t.ex. 120000 är 0x1d4c0):

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

6) Säkerställa hög tillgänglighet med hjälp av replikering

Att gå i produktion utan replikering kan orsaka plötsliga nedladdningsfel i din app. Replikering tar hand om problemet om en nod misslyckas. Hantera läs-, skrivoperationer för dina sekundära MongoDB-instanser enligt dina applikationsbehov.

Ha dessa saker i åtanke när du replikerar:

  • För hög tillgänglighet, distribuera din replikuppsättning i minst tre datacenter.
  • Se till att MongoDB-instanser har 0 eller 1 röst.
  • Säkerställ fullständig dubbelriktad nätverksanslutning mellan alla MongoDB-instanser.

Exempel på att skapa en replikuppsättning med 4 lokala MongoDB-instanser:

  1. Skapar 4 lokala MongoDB-instanser

    Skapa först datakataloger

    mkdir -p /data/m0
    mkdir -p /data/m1
    mkdir -p /data/m2
    mkdir -p /data/m3
  2. Starta 4 lokala instanser

    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. Lägg till instanserna i klustret och initiera

    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);

Säkerhetsåtgärder

7) Säkra maskiner

Öppna portar på maskiner som är värd för MongoDB är sårbara för olika skadliga attacker. Mer än 30 tusen MongoDB-databaser hade äventyrats i en ransomware-attack på grund av fördröjning i korrekt säkerhetskonfiguration. Stäng dina offentliga portar på MongoDB-servern medan du pågår produktion. Du bör dock hålla en port öppen för SSh-ändamål.

Aktivera autentisering på MongoDB-instans:

  1. Starta filen mongod.conf i din favoritredigerare.

  2. Lägg till dessa rader i slutet av konfigurationsfilen.

    security:
          authorization: enabled
  3. Lägg till dessa rader i slutet av konfigurationsfilen.

    service mongod restart
  4. Bekräfta statusen

    service mongod status

Begränsa extern åtkomst

Öppna filen mongod.conf igen för att ställa in begränsade IP-adresser åt din server.

bind_ip=127.0.0.1

Genom att lägga till den här raden betyder det att du bara kan komma åt din server via 127.0.0. (som är localhost). Du kan också lägga till flera IP-adresser i bindningsalternativet.

bind_ip=127.0.0.1,168.21.200.200

Det betyder att du kan komma åt från localhost och ditt privata nätverk.

8) Lösenordsskydd

För att lägga till ett extra säkerhetslager till dina maskiner, aktivera åtkomstkontroll och framtvinga autentisering. Trots att du har hindrat MongoDB-servern att acceptera anslutningar från omvärlden, finns det fortfarande en möjlighet att eventuella skadliga skript kommer in på din server. Så var inte ovilliga att ange ett användarnamn/lösenord för din databas och tilldela nödvändiga behörigheter. Aktiverad åtkomstkontroll tillåter endast användare att utföra åtgärder som bestäms av deras roller.

Här är stegen för att skapa en användare och tilldela databasåtkomst med specifika roller.

I första hand kommer vi att skapa en användare (i det här fallet är det admin) för att hantera alla användare och databaser och sedan kommer vi att skapa en specifik databasägare som bara har läs- och skrivbehörigheter på en MongoDB-databasinstans.

Skapa en administratörsanvändare för att hantera andra användare för databasinstanser

  1. Öppna ditt Mongo-skal och byt till admindatabasen:

    use admin
  2. Skapa en användare för admindatabas

    db.createUser({ user: "admin", pwd: "admin_password", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
  3. Autentisera nyskapad användare

    db.auth("admin", "admin_password")
  4. Skapar specifik instansanvändare:

    use database_1
    db.createUser({ user: "user_1", pwd: "your_password", roles: [{ role: "dbOwner", db: "database_1" }] })
  5. Kontrollera nu om en användare har skapats framgångsrikt eller inte.

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

Det är allt! Du har framgångsrikt säkrat dina databasinstanser med korrekt autentisering. Du kan lägga till så många användare som du vill enligt samma procedur.

9) Kryptering och skydd av data

Om du använder Wiredtiger som en lagringsmotor kan du använda dess kryptering i vila-konfiguration för att kryptera dina data. Om inte, bör kryptering utföras på värden med hjälp av ett filsystem, enheter eller fysisk kryptering.

10) Övervaka din implementering

När du har avslutat installationen av MongoDB i produktion måste du spåra prestandaaktiviteten för att förhindra tidiga möjliga problem. Det finns en rad strategier du kan anpassa för att övervaka din dataprestanda i produktionsmiljön.

  • MongoDB inkluderar verktyg som returnerar statistik om instansprestanda och aktivitet. Verktyg används för att lokalisera problem och analysera normala funktioner.

  • Använd mongostat för att förstå arrangemanget av operationstyper och kapacitetsplanering.

  • Mongotop rekommenderas för spårning av rapporter och läs-skrivaktiviteter.

mongotop 15

Detta kommando returnerar utdata efter var 15:e sekund.

                     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) är ett annat tillgängligt alternativ som övervakar ditt MongoDB-kluster och gör det bekvämt för dig att ha en överblick över produktionsdriftsättningsaktiviteter.

Och naturligtvis finns det ClusterControl av Severalnines, automations- och hanteringssystemet för databaser med öppen källkod. ClusterControl möjliggör enkel distribution av kluster med automatiserade säkerhetsinställningar och gör det enkelt att felsöka din databas genom att tillhandahålla lättanvänd hanteringsautomatisering som inkluderar reparation och återställning av trasiga noder, automatiska uppgraderingar och mer. Du kan komma igång med dess (gratis för alltid) Community Edition, med vilken du kan distribuera och övervaka MongoDB samt skapa anpassade rådgivare för att anpassa dina övervakningsinsatser till de aspekter som är specifika för din installation. Ladda ner det gratis här.


  1. Hur skapar man en lokal Windows-baserad tjänstebuss utanför Azure, liknande Redis med automatisk fail-over?

  2. Hur vet man master/slav status för redis?

  3. Konvertera mongodb Binary _id till LUUID med hjälp av nod

  4. Användning av ServiceStack.Redis.Sentinel