Tento článek popisuje postup, jak vytvořit cluster s databázemi MongoDB 3.2. Nezachází do hlubší problematiky replikačních setů nebo shardování, od toho tu je originální dokumentace. Berte jej proto jen jako takovou základní kuchařku 🙂
Co budeme potřebovat?
(Virtuální) stroje s nainstalovaným debianem (wheezy, jessie) nebo ubuntu serverem. Jejich názvy budou následující:
config1
první konfigurační serverconfig2
– druhý konfigurační serverconfig3
– třetí konfigurační servermongos1
– query routermongos2
– záložní query routerdata11
– data: stroj 1, disk 1data12
– data: stroj 1, disk 2data21
– data: stroj 2, disk 1data22
– data: stroj 2, disk 2
Na každém stroji nainstalujeme balíček mongodb-org z oficiálního repositáře. Postup instalace je uveden v dokumentaci a liší se podle distribuce.
Konfigurační servery, config[1-3], musí být minimálně tři (z důvodu redundance) a měly by být na různých serverech nebo alespoň na různých discích. Obsahují totiž veškeré informace o clusteru, rozdělní dat atp. V případě, že klesne počet konfiguračních serverů na dva, přepne se cluster do režimu read-only a nelze ho měnit.
Datový server, místo, kde jsou uložena samotná data databáze. Zpravidla jsou pro přehlednost označeny indexy: první je číslo stroje, druhý je číslo disku. V našem případě budeme předpokládat, že máte dva fyzické stroje a na každém z nich dva stroje virtuální, každý s jiným diskem.
Mongos server slouží jako vstupní brána do clusteru. Nejsou na něm uložena žádná data, proto není potřeba alokovat velký disk. Důležitý je dostatečný výpočetní výkon, operační paměť a síťová propustnost.
Replikační set
Jak konfigurační, tak datová úložiště fungují v rámci tzv. replikačního setu. Replikační set není nic jiného než skupina MongoDB instancí sdílející stejný název replikačního setu.
Jak už název napovídá, každý člen replikačního setu obsahuje (nebo by měl obsahovat) stejná data, jako jeho ostatní členové. Cílem je zajistit spolehlivost a dostupnost v případě, že jeden ze členů selže. Synchronizace dat mezi členy probíhá automaticky a trvale.
Každý set má právě jednoho primárního člena (zápis, čtení) a libovolný počet členů sekundárních (pouze čtení). Když selže primární člen, proběhne volba mezi sekundárními stroji o to, ze kterého se stane nový primární člen (král je mrtev, ať žije král). Když selže sekundární člen, neděje se „nic“.
Zprovoznění konfiguračních serverů
V přiloženém souboru s konfigracemi naleznete soubory conf1.conf
, conf2.conf
a conf3.conf
. Ty zkopírujte na příslušné stroje (config1, config2, config3) do souboru /etc/mongod.conf například přes příkaz scp
:
scp conf1.conf root@config1: /etc/mongod .conf scp conf2.conf root@config2: /etc/mongod .conf scp conf3.conf root@config3: /etc/mongod .conf |
Zkontrolujte si prosím adresář databáze (nastavení dbPath
), případně si jej změňte dle libosti. Ujistěte se rovněž, že je adresář prázdný. Pokud budete mít vše v pořádku, službu restartujte, a to na všech konfiguračních strojích:
/etc/init .d /mongodb restart |
Pokud vše proběhlo v pořádku, máte zinicializované prázdné databáze s konfigurací clusteru. Gratuluji!
To ale není všechno. Protože chceme, aby konfigurační stroje běžely v replikačním setu, je potřeba ho zinicializovat. Připojíme se proto k mongu na stroji config1
:
mongo --host config1 --port 27019 |
a zadáme následující příkazy:
rs.initiate() rs.add( 'config2:27019' ) rs.add( 'config3:27019' ) |
Tím jsme ziniciovali replikační set crs (viz konfigurační hodnota replSetName
) o 3 strojích.
Spuštění mongos
Mongos je aplikace, která slouží jako vstupní bod do clusteru. Spouští se jednoduše z příkazové řádky a jako svůj argument přijímá výčet konfiguračních strojů:
ssh root@mongos1 mongos --configdb crs /config1 :27019,config2:27019,config3:27019 |
Mongos by se měl spustit na výchozím portu 27017, pokud se tak nestalo, přidejte k parametrům ještě --port 27017
.
Poznámka: bohužel neexistuje service file pro mongos a tak je třeba si se spuštěním a zastavením služby poradit svépomocí…
Analogicky spusťe i záložní mongos na stroji mongos2
.
Zprovoznění datových strojů
Funguje podobně jako zprovoznění konfiguračních serverů. Nejprve si ale řekněme něco o jejich logické struktuře.
Budeme mít dva replikační sety:
- rs0: stroje
data11
adata21
- rs1: stroje
data12
adata22
Každý replikační set bude plnit úlohu shardu (dílu) v našem clusteru.
Nejprve překopírujte konfigurační soubory pro datové servery (data11.conf
, data12.conf
, data21.conf
a data22.conf
) stejným způsobem jako jsme to dělali u konfigurace:
scp data11.conf root@data11: /etc/mongod .conf scp data12.conf root@data12: /etc/mongod .conf scp data21.conf root@data21: /etc/mongod .conf scp data22.conf root@data22: /etc/mongod .conf |
Na každém stroji se opět ujistěte, že je konfigurace v pořádku a složka s databází je prázdná. Následně můžete spustit službu mongodb na všech strojích:
/etc/init .d /mongodb restart |
Nyní postupně ziniciujeme replikační sety. Nejprve rs0:
mongo --host data11 --port 27018 |
rs.initiate() rs.add( 'data21:27018' ) |
a analogicky pro rs1:
mongo --host data12 --port 27018 |
rs.initiate() rs.add( 'data22:27018' ) |
Nyní nastala chvíle, kdy můžeme přidat naše datové replikační sety do clusteru.
Přihlaste se proto na mongos:
mongo --host mongos1 |
a přidejte replikační sety:
sh.addShard( 'rs0/data11:27018' ) sh.addShard( 'rs1/data12:27018' ) |
A je hotovo. Povšimněte si, že stačí zadat jeden z členů replikačního setu. Mongos si zbývající členy zjistí sám, což můžete ověřit příkazem na stav clusteru:
sh.status() |
Povolení shardování pro databázi a kolekci
Je pěkné mít zprovozněný shard, ale ještě pěknější je ho moct použít. Výchozí chování monga je totiž takové, že pokud není řečeno jinak, jsou všechny kolekce umístěné pouze na jednom (výchozím) replikačním setu.
Předpokládejme, že máme databázi s názvem test
a kolekci s názvem users
. Chceme, aby byla kolekce users
rozložena mezi více shardy podle uživatelských jmen login
. Dokument o uživateli může vypadat následovně:
{
login: "djanku",
firstname: "Dominik",
lastname: "Janků"
}
Potom je potřeba na clusteru (mongos) zadat následující příkazy:
sh.enableSharding( 'test' ) sh.shardCollection( 'test.users' , { 'login' : 'hashed' }) |
Důležité je, aby byla kolekce před započetím shardování prázdná. Volba shardovacího klíče je velice důležitá, prostudujte si proto dokumentaci, ve které se dozvíte více informací.
To je vše. Gratuluji, máte svůj první MongoDB cluster 🙂