MongoDB: Replikų rinkinys (HA)
Kaip sukonfigūruoti aukšto pasiekiamumo replikų rinkinį
Replikų rinkinys (replica set) – tai MongoDB mazgų grupė, kuri veikia kartu, kad užtikrintų aukštą pasiekiamumą ir pagerintų našumą, dubliuodama duomenis per kelis serverius. Naudojant replikų rinkinį, jūsų duomenų bazė išlieka pasiekiama net ir vienam iš mazgų sugedus, o apkrovą galima paskirstyti, kad būtų aptarnaujama daugiau užklausų.
3 mazgų replikų rinkinio pavyzdys
Aukšto pasiekiamumo konfigūracijoje, jei vienas mazgas tampa nepasiekiamas, jūsų duomenys vis tiek prieinami iš kitų mazgų. Našumas taip pat pagerėja, nes visos rašymo operacijos nukreipiamos į pirminį (primary) mazgą, o skaitymo operacijos gali būti paskirstytos tarp antrinių (secondary) mazgų.
Jei dar nesate susipažinę su replikų rinkiniais, rekomenduojame peržiūrėti MongoDB oficialią dokumentaciją norint sužinoti daugiau.
Kaip veikia replikų rinkiniai
Norėdami sukurti replikų rinkinį, jums reikės bent trijų MongoDB mazgų:
- Vienas mazgas veikia kaip primary – jis apdoroja visas rašymo operacijas ir, pagal nutylėjimą, skaitymo užklausas.
- Kiti mazgai yra secondary. Jie nuolat replikavoja duomenis iš primary mazgo beveik realiu laiku.
Jei antrinis mazgas tampa nepasiekiamas, jūsų aplikacija toliau veikia įprastai. Kai antrinis mazgas vėl prisijungia prie klasterio, jis sinchronizuoja praleistus duomenis ir atnaujina savo būseną pagal likusį replikų rinkinį.
Jei primary mazgas sugenda, replikų rinkinys automatiškai inicijuoja naujo primary rinkimus. Šis procesas paprastai trunka apie 10 sekundžių. Šiuo laikotarpiu replikų rinkinys tampa tik skaitymui (read-only). Kai naujas primary išrenkamas, visos operacijos atnaujinamos kaip įprasta.
Rinkimų pavyzdys
Pradžia su MongoDB replikų rinkiniu
Norėdami sukurti replikų rinkinį Stackhero platformoje, jums reikės bent trijų MongoDB instancijų. Štai žingsnis po žingsnio instrukcija:
- Paleiskite tris (ar daugiau) MongoDB instancijas Stackhero valdymo skydelyje.
- Kai instancijos bus paleistos, atnaujinkite jų konfigūraciją valdymo skydelyje:
- Nustatykite tą patį administratoriaus slaptažodį kiekvienai instancijai.
- Įjunkite Aktyvuoti replikų rinkinį (Activate replica set) parinktį.
- Pasirinkite replikos pavadinimą ir slaptą raktą (secret key), kuriuos naudos visi mazgai. (Atminkite: replikos pavadinimo pakeisti po sukūrimo negalėsite. Jei nesate tikri,
rs-1yra geras numatytasis pasirinkimas.)
Atminkite, kad VISOS jūsų instancijos turi turėti identišką konfigūraciją (admin slaptažodis, replikų rinkinio pavadinimas ir slaptas raktas).
Išsaugojus konfigūraciją, reikės apibrėžti visus replikų rinkinio narius MongoDB aplinkoje. Štai kaip tai padaryti:
- Prisijunkite naudodami šią komandą per Mongo CLI:
mongo --quiet mongodb://admin@<XXXXXX>.stackhero-network.com/?tls=true
Jei neturite įdiegto Mongo CLI, galite naudoti oficialų Docker atvaizdį su šia komanda:
> docker run -it mongo /bin/bash
Ši komanda atidaro shell aplinką, kurioje galite tiesiogiai vykdyti Mongo komandas.
- Prisijungę galite inicijuoti savo replikų rinkinį su šia komanda. Būtinai pakeiskite
_idį savo pasirinkto replikų rinkinio pavadinimą ir atnaujinkite narių host vardus pagal poreikį:
rs.initiate({
_id: "rs-1",
members: [
{ _id: 0, host: "<XXXXXX>.stackhero-network.com:27017" },
{ _id: 1, host: "<XXXXXX>.stackhero-network.com:27017" },
{ _id: 2, host: "<XXXXXX>.stackhero-network.com:27017" }
]
})
Jei komanda įvykdyta sėkmingai, pamatysite atsakymą panašų į { "ok" : 1 }.
- Norėdami peržiūrėti savo replikų rinkinio konfigūraciją, galite vykdyti:
rs.conf()
Šią konfigūraciją reikia taikyti tik viename mazge. Kiti mazgai atnaujinami automatiškai.
Jūsų MongoDB replikų rinkinys dabar turėtų veikti.
Patikrinkite savo MongoDB replikų rinkinio būseną
Kad būtų lengviau stebėti replikų rinkinio būseną, sukūrėme Node.js skriptą, kuris tikrina būseną kas sekundę. Šį skriptą rasite mūsų GitHub repozitorijoje.
Skripto ekrano nuotrauka
Trikčių šalinimas
Kaip elgtis su klaida: "network error while attempting to run command 'isMaster' on host"
Jei matote šią klaidą, dažniausiai tai reiškia, kad TLS šifravimas nėra įjungtas. Galite išspręsti šią problemą pridėdami tls=true parametrą prie savo prisijungimo URL. Pavyzdžiui:
mongodb://admin:PASSWORD@<XXXXXX>.stackhero-network.com:27017/admin?tls=true