sql >> Databáze >  >> NoSQL >> MongoDB

Průvodce vývojáře k MongoDB Sharding

Masivní nárůst dat je spojen s náklady na sníženou propustnost operací, zejména pokud jsou obsluhovány jedním serverem. Tento výkon však můžete zlepšit zvýšením počtu serverů a také distribucí dat na více čísel těchto serverů. V tomto článku Replica sets v MongoDB jsme podrobně diskutovali o tom, jak lze kromě zajištění vysoké dostupnosti dat zlepšit operace propustnosti. Tento proces nelze zcela dosáhnout bez zmínky o Sharding v MongoDB.

Co je Sharding v MongoDB

MongoDB je navrženo flexibilním způsobem, takže je škálovatelné pro provoz v clusteru na distribuované platformě. V této platformě jsou data distribuována přes řadu serverů pro ukládání. Tento proces se nazývá sharding. Pokud je jeden server vystaven velkému množství dat pro ukládání, může vám dojít úložný prostor. Kromě toho mohou být do značné míry ovlivněny velmi kritické operace propustnosti, jako je čtení a zápis. Funkce horizontálního škálování v MongoDB nám umožňuje distribuovat data mezi více počítačů s konečným výsledkem zlepšení vyvažování zátěže.

Střepy MongoDB

Shard lze považovat za sadu replik, která hostí nějakou podmnožinu dat používanou ve sdíleném clusteru. Pro danou instanci mongoda s nějakou sadou dat jsou data rozdělena a distribuována do několika databází, v tomto případě útržků. V zásadě mnoho různých útržků slouží jako nezávislé databáze, ale společně tvoří logickou databázi. Střepy snižují zátěž, kterou má provádět celá databáze, tím, že snižují počet operací, které by měl datový fragment zvládnout, kromě menšího množství dat, které bude tento fragment hostovat. Tato metrika poskytuje prostor pro horizontální expanzi shluku. Jednoduchá architektura shardingu je uvedena níže.

Data odeslaná z klientské aplikace jsou zachycována ovladači serveru a poté přiváděna do routeru. Směrovač poté zkontroluje konfiguraci serveru, aby určil, kde na serverech shard použít operaci čtení nebo zápisu. Stručně řečeno, pro operace, jako je zápis, má nějaký index, který bude diktovat, který fragment má být hostitelem. Řekněme, že databáze má datovou kapacitu 1 TB rozdělenou do 4 útržků, přičemž každý útržek pojme 256 GB těchto dat. Se sníženým množstvím dat, které může datový fragment zpracovat, lze operace provádět poměrně rychle. Měli byste zvážit použití sdíleného clusteru ve vaší databázi, když:

  1. Očekáváte, že množství dat v budoucnu překročí kapacitu úložiště pro jednu instanci.
  2. Pokud se operace zápisu nepodaří provést jedinou instancí MongodB
  3. Dochází vám paměť RAM s náhodným přístupem na úkor zvětšené velikosti aktivní pracovní sady.

Sdílení přichází se zvýšenou složitostí v architektuře kromě dalších zdrojů. Je však vhodné provést sharding v raných fázích, než vaše data přerostou, protože je to docela zdlouhavé, když vaše data překročí kapacitu.

MongoDB Shard Key

Jak všichni víme, dokument v MongoDB má pole pro uložení hodnot. Když nasazujete sharding, budete muset vybrat pole z kolekce, kterou použijete k rozdělení dat. Toto pole, které jste vybrali, je klíč útržku, který určuje, jak rozdělíte dokumenty ve sbírce na několik útržků. V jednoduchém příkladu mohou mít vaše data názvy polí studenti, třídní učitelé a známky. Můžete se rozhodnout, že jedna sada fragmentů bude obsahovat dokumenty se studentem indexu, další učiteli a známky. Můžete však vyžadovat, aby byla vaše data distribuována náhodně, a proto použijte hashovaný klíč. Kromě hašovaného shard klíče se při rozdělování dat používá celá řada shard klíčů, ale dvě hlavní kategorie jsou indexovaná pole a indexovaná složená pole.

Výběr Shard Key

Pro lepší funkčnost, schopnosti a výkon strategie shardingu budete muset vybrat vhodný sdílený klíč. Kritéria výběru závisí na 2 faktorech:

  1. Struktura schématu vašich dat. Můžeme například uvažovat pole, jehož hodnota může být rostoucí nebo klesající (monotónně se měnící). To s největší pravděpodobností ovlivní distribuci vložek do jednoho fragmentu v rámci clusteru.
  2. Jak jsou vaše konfigurace dotazování navrženy pro provádění operací zápisu.

Co je to hash Shard Key

Toto používá hashovaný index jednoho pole jako zlomkový klíč. Hašovaný index je index, který udržuje položky s hodnotami hash indexovaného pole.tj

{
    "_id" :"5b85117af532da651cc912cd"
}

Chcete-li vytvořit hashovaný index, můžete použít tento příkaz v mongo shell.

db.collection.createIndex( { _id: hashedValue } )

Kde proměnná hashedValue představuje řetězec vámi zadané hodnoty hash. Hašované sdílení podporuje rovnoměrnou distribuci dat v rámci sdíleného clusteru, čímž snižuje cílové operace. Je však nepravděpodobné, že dokumenty s téměř stejnými klíči fragmentu budou na stejném datovém fragmentu, a proto vyžadují instanci mongo, aby provedla operaci vysílání za účelem splnění daného kritéria dotazu.

Klíč Shard na základě rozsahu

V této kategorii je datová množina rozdělena na základě rozsahů hodnot zvoleného klíče pole, a proto je velký rozsah oddílů. Tj. máte-li číselný klíč, jehož hodnoty se pohybují od záporného nekonečna do kladného nekonečna, bude každý zlomkový klíč spadat do určitého bodu v rámci této čáry. Tento řádek je rozdělen na bloky, přičemž každý blok má určitý rozsah hodnot. Přesně řečeno, dokumenty s téměř podobným klíčem jsou umístěny ve stejném bloku. Výhodou této techniky je, že podporuje řadu dotazů, protože router vybere fragment s konkrétním blokem.

Charakteristiky optimálního Shard Key

  1. Ideální klíč fragmentu by měl být schopen zacílit na jeden fragment, aby se zlepšil program mongos tak, aby vracel operace dotazu z jediné instance mongoda. To charakterizuje klíčové primární pole. Tj. nikoli ve vloženém dokumentu.
  2. Vyznačují se vysokou mírou náhodnosti. To znamená, že pole by mělo být dostupné ve většině dokumentů. To zajistí, že operace zápisu budou distribuovány v rámci fragmentu.
  3. Být snadno dělitelný. Se snadno dělitelným klíčem střípky dochází ke zvýšené distribuci dat a tím k většímu počtu útržků.
Somenines Staňte se MongoDB DBA – Uvedení MongoDB do produkce Zjistěte, co potřebujete vědět, abyste mohli nasadit, monitorovat, spravovat a škálovat MongoDBDdownload zdarma

Součásti nasazení produkčního klastru

Pokud jde o architekturu uvedenou výše, cluster produkčního fragmentu by měl mít:

  • Směrovače Mongos/ Query. Jedná se o mongo instance, které fungují jako server mezi aplikačními ovladači a samotnou databází. Při nasazení je nástroj pro vyrovnávání zatížení nakonfigurován tak, aby umožňoval připojení z jednoho klienta k dosažení stejných mongos.
  • Střepy. Toto jsou oddíly, ve kterých jsou hostovány dokumenty sdílející stejnou definici shard key. Měli byste mít alespoň 2, abyste zvýšili dostupnost dat.
  • Konfigurační servery:můžete mít buď 3 samostatné konfigurační servery na různých počítačích, nebo jejich skupinu, pokud budete mít více sdílených clusterů.

Nasazení sdíleného clusteru

Následující kroky vám poskytnou jasný směr k nasazení vašeho sdíleného clusteru.

  1. Vytvoření hostitele pro konfigurační servery. Ve výchozím nastavení jsou soubory serveru k dispozici v adresáři /data/configdb, ale vždy jej můžete nastavit na preferovaný adresář. Příkaz pro vytvoření datového adresáře je:

    $ mkdir /data/configdb
  2. Spusťte konfigurační servery tak, že pro každý z nich určíte port a cestu k souboru pomocí příkazu

    $ mongod --configsvr --dbpath /data/config --port 27018

    Tento příkaz spustí konfigurační soubor v datovém adresáři s názvem config na portu 27018. Ve výchozím nastavení běží všechny servery MongoDB na portu 27017.

  3. Spusťte instanci mongos pomocí syntaxe:

    $ mongo --host hostAddress --port 27018.

    Proměnná hostAddress bude mít hodnotu názvu hostitele nebo IP adresy vašeho hostitele.

  4. Spusťte mongoda na shard serveru a spusťte jej příkazem:

    mongod --shardsvr --replSet
    rs.initiate()
  5. Spusťte své mongo na routeru příkazem:

    mongos --configdb rs/mongoconfig:27018
  6. Přidávání fragmentů do vašeho clusteru. Řekněme, že máme výchozí port 27017 jako náš cluster, můžeme přidat fragment na port 27018 takto:

    mongo --host mongomaster --port 27017
    sh.addShard( "rs/mongoshard:27018")
    { "shardAdded" : "rs", "ok" : 1 }
  7. Povolte sdílení databáze pomocí názvu fragmentu pomocí příkazu:

    sh.enableSharding(shardname)
    { "ok" : 1 }

    Stav shardu můžete zkontrolovat příkazem:

    sh.status()

    Tyto informace vám budou předloženy

    sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("59f425f12fdbabb0daflfa82")
    }
    shards:
    { "_id" : "rs", "host" : "rs/mongoshard:27018", "state" : 1 }
    active mongoses:
    "3.4.10" : 1
    autosplit:
    Currently enabled: yes
    balancer:
    Currently enabled: yes
    Currently running: no
    NaN
    Failed balancer rounds in last 5 attempts: 0
    Migration Results for the last 24 hours:
    No recent migrations
    databases:
    { "_id" : shardname, "primary" : "rs", "partitioned" : true }

Vyvažování střepů

Po přidání fragmentu do clusteru si můžete všimnout, že některé fragmenty mohou stále hostovat více dat než jiné, a aby byl nový fragment více sečnatý, nebude mít žádná data. Proto musíte provést některé kontroly na pozadí, abyste zajistili rovnováhu zatížení. Vyvažování je základem, pro který jsou data přerozdělována v clusteru. Balancér zjistí nerovnoměrnou distribuci, a proto migruje kusy z jednoho úlomku na druhý, dokud nebude dosaženo rovnovážného kvora.

Proces vyvažování spotřebovává spoustu šířky pásma kromě režie pracovního zatížení, což ovlivní provoz vaší databáze. Lepší proces vyvažování zahrnuje:

  • Přesun jednotlivých částí najednou.
  • Proveďte vyrovnávání, když je dosaženo prahu migrace, to znamená, když je rozdíl mezi nejnižším počtem bloků pro danou kolekci a nejvyšším počtem bloků ve sdílené kolekci.

  1. Docker-compose – Redis na 0.0.0.0 místo 127.0.0.1

  2. Dávková sada dat ze slovníku do Redis

  3. MongoDB $dateToString

  4. Vypočítat hodnotu přeskočení pro daný záznam pro seřazené stránkování