Jak na cluster s MongoDB

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í server
  • config2 - druhý konfigurační server
  • config3 - třetí konfigurační server
  • mongos1 - query router
  • mongos2 - záložní query router
  • data11 - data: stroj 1, disk 1
  • data12 - data: stroj 1, disk 2
  • data21 - data: stroj 2, disk 1
  • data22 - 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 a data21
  • rs1: stroje data12 a data22

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

Příloha: