О сету реплика
Предуслови
Дизајнирајте комплет реплика
Упутства за примену
Закључак
Од своје концепције 2009. године МонгоДБ је водећи у НоСКЛ индустрији. Један од основних концепата МонгоДБ-�� је скуп реплика, тако да пре него што почнете са њим да прво прегледамо концепт.
О сету реплика
Најједноставнији модел комуникације који се користи у репликацији база података је Мастер-Славе архитектура. Као што његово име сугерише, овај модел има 2 улоге које су распоређене у јединственом мастеру и многим славеовима, улога мастера је да обрађује операције читања и писања које обављају клијенти, а славе се третирају као реплика мастера.
Најважнија предност овог модела је да перформансе мастера нису угрожене операцијама резервне копије, операције резервне копије се раде на асинхрони начин и то може постати озбиљан проблем када главни чвор откаже. Славе чворови се само читају и морају се ручно унапредити у главни чвор, тако да у овом тренутку постоји могућност губитка података.
Једна опција за решавање проблема доступности је да имате више од једног мастера у архитектури, али то може довести до другог проблема у конзистентности података између тих инстанци и додатној сложености конфигурације.
Сада када имамо контекст, можемо представити технологију скупа реплика МонгоДБ-а. Скуп реплика је назив Мастер-Славе архитектуре која има аутоматски прелазак на грешку, тако да у тренутку када главни (који је сада назван primary) чвор не функционише исправно election, активираће се и нови примарни чвор ће бити изабран од преосталих славе ( који се сада назива secondaries).
Примарни чвор
Примарни чвор је једини који обавља операције писања, по подразумеваној вредности операцијама читања рукује и примарни, али ово понашање се може променити касније.
Операције се бележе у oplog(дневник операција), а затим секундарни чворови асинхроно ажурирају свој садржај на основу садржајаoplog
Напомена: oplogје ограничена колекција, то значи да колекција има ограничење, при local.oplog.rsчему можете проверити садржај ове колекције унутар монго љуске у било ком члану скупа.
Секундарни чвор
Осим што су они који праве исправну резервну копију базе података, секундарни чвор има следеће улоге:
- Може прихватити операције читања ако је потребно.
- Може да покрене избор ако примарни чвор не успе.
- Може гласати на изборима.
- Може постати нови примарни ако је потребно.
Захваљујући овим карактеристикама можемо имати различите типове секундарних чворова:
- Приоритет 0 : Ови чворови не могу постати
primaryи не могу покренути изборе, али ипак могу гласати на изборима, имати комплетну реплику и могу прихватити операције читања. Ово може бити од помоћи у примени више центара података.
- Скривени : Ово су
Priority 0чланови, али штавише не могу да обрађују операције читања. Они могу гласати ако је потребно. Жељени задаци за ове чланове су извештавање и прављење резервних копија.
- Одложено : Ови чворови су задужени за "историјске податке" тако што се одлажу са одређеном јединицом времена. Одложени члан мора бити
priority 0чвор, а препоручује се и да буде hiddenчлан.
Предуслови
- Доступност за покретање најмање 3 инстанце Убунту 16.04 к64 са истом величином сервера.
Дизајнирајте комплет реплика
Пре постављања инфраструктуре важно је дизајнирати је, а постоје тачке које треба размотрити у овом дизајну.
Избор броја чланова
Имајте на уму да је минимални број елемената за прављење скупа реплика 3. Можете мешати три типа чворова са најмање једним примарним и једним секундарним чвором.
У овом водичу распоређујемо 3 члана, једног примарног и два стандардна секундарна.
Напомена: Препоручује се да имате максималан број од 7 чланова са правом гласа са мешавином арбитара и секундарних чланова.
Изаберите име
Назив је само за референцу, али га користите у конфигурацији сета. Имајте на уму да можете имати више од једног скупа реплика у свом производном окружењу, тако да немојте занемарити име вашег скупа.
Овај водич подстиче корисника да одабере име скупа.
Дистрибуција чланова у различитим центрима података
Овај водич предлаже да се примени у истом центру података како бисте избегли проблеме у комуникацији.
Напомена: У случају примене у различитим центрима података, препоручује се да своје чворове обавите ВПН-ом
Упутства за примену
Корак 1: Поставите минималне чворове за своју инфраструктуру
Покрените 3 чвора Убунту 16.04 к64; у истом региону са вашег корисничког портала, ако је могуће. Не заборавите да их именујете у складу са типом пројекта којим се бавите и будите сигурни да имате исту величину сервера у свим овим чворовима.
Након што поставите своја 3 чвора, мораћете да будете сигурни да сваки чвор може да разговара са осталима. Морате ссх у два чвора и доћи до осталих користећи ping -c 4 EXAMPLE_IP. Промените EXAMPLE_IPна стварне ИП адресе ваших чворова.
Овде можете видети пример успешне комуникације између два чвора.
root@foo_node:~# ping -c 4 EXAMPLE_IP
PING EXAMPLE_IP (EXAMPLE_IP) 56(84) bytes of data.
64 bytes from EXAMPLE_IP: icmp_seq=1 ttl=59 time=0.594 ms
64 bytes from EXAMPLE_IP: icmp_seq=2 ttl=59 time=0.640 ms
64 bytes from EXAMPLE_IP: icmp_seq=3 ttl=59 time=0.477 ms
64 bytes from EXAMPLE_IP: icmp_seq=4 ttl=59 time=0.551 ms
--- EXAMPLE_IP ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3021ms
rtt min/avg/max/mdev = 0.477/0.565/0.640/0.064 ms
Корак 2: Инсталирајте МонгоДБ у сваки чвор ваше инфраструктуре
Уопштено говорећи, можете користити МонгоДБ пакет Убунту-а, али је боље да користите званични репо заједнице јер је увек ажуриран. Овај репо садржи ове пакете:
- монгодб-орг , групни пакет који обухвата четири компоненте.
- монгодб-орг-сервер , ово садржи
mongodдемон (примарни процес који обрађује захтеве за подацима).
- монгодб-орг-монгос , ово садржи
mongosдемон (услуга рутирања за дељене примене).
- монгодб-орг-схелл , ово је
mongo shellЈаваСцрипт интерфејс.
- монгодб-орг-тоолс , неки алати за административне активности.
Наставите са инсталирањем пакета.
Увезите јавни кључ у систем управљања пакетима.
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
Креирајте датотеку листе за МонгоДБ '/етц/апт/соурцес.лист.д/монгодб-орг-3.4.лист'.
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
Ажурирајте базу података пакета.
sudo apt-get update
Инсталирајте метапакет МонгоДБ.
sudo apt-get install -y mongodb-org
Покрените МонгоДБ услугу.
sudo service mongod start
Сада можете отворити mongo shellу било којој басх сесији. Да бисте то урадили, морате користити mongoкоманду. Дочекаће вас нешто слично овоме.
MongoDB shell version v3.4.7
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.7
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
*Some extra logs are cut by the way*
>
Не заборавите да искључите услугу са sudo service mongod stop, јер ћемо касније mongodпоново почети са неким параметрима. Поновите овај процес у сва 3 чвора скупа.
Корак 3: Конфигуришите приступну кључну датотеку
Коришћење кључног фајла намеће два концепта у администрацији скупа реплика. Први је Internal Authentication. Подразумевано можете започети mongo shellсесију без коришћења корисника и ова сесија ће имати пуну контролу над базом података, али када користите кључну датотеку за аутентификацију, ваша mongo shellсесија достиже стање које се зове localhost exception. Ово стање вам омогућава само да креирате администраторског корисника и скуп реплика. Други концепт је Role-Based Access Control, или другим речима ауторизација. Ово се примењује да би се управљало административним нивоима скупа реплика.
Креирајте своју кључну датотеку
Кључна датотека је лозинка која се користи у скупу, ова лозинка мора бити иста у свим члановима скупа. Да бисте повећали сигурност, важно је да користите насумични кључ са алатом по вашем избору.
Садржај мора да има између 6 и 1064 карактера. Такође морате подесити read onlyдозволу за кључну датотеку.
chmod 400 PATH_OF_YOUR_KEYFILE
Поставите кључну датотеку у сваки члан скупа
Сада копирајте своју кључну датотеку на сваког члана скупа, користите конзистентан фолдер за будућу референцу и немојте га чувати на преносивом медијуму.
Такође користите фасциклу за датотеку којој mongodможе да приступи.
Наметните коришћење кључног фајла у скупу реплика
У овом кораку треба да започнемо члан mongod daemon у сваком скупу . Постоје два начина за покретање mongodпроцеса: коришћењем конфигурационе датотеке или коришћењем командне линије. Обе су прилично једноставне методе, али само ради једноставности, овај водич користи верзију командне линије.
Конфигурација командне линије
Користите име које сте раније одабрали у овој команди.
mongod --keyFile PATH_OF_YOUR_KEYFILE --replSet "YOUR_SET_NAME"
Подразумевано mongodсе не покреће као демон. Мораћете да користите --forkпараметар или да га upstartу потпуности покренете као демон. У овом туторијалу не подстичемо рад mongodкао демон, тако да можете директно да видите логове у свом терминалу.
Напомена: Пажљиво откуцајте име скупа реплика јер га једном креирате не можете променити.
Корак 4: Повежите се на интерфејс локалног хоста са једног од чланова скупа
Напомена: Ако покренете mongodкао процес који није демон, онда ћете морати да отворите другу ссх везу да бисте наставили са радом.
Морате користити mongoкоманду да отворите mongo shell. Ово се може урадити у било ком члану скупа.
У овом тренутку се налазимо у стању које се зове localhost exception. Када се кључна датотека користи за подешавање mongodпроцеса, обавезни сте да креирате администратора базе података пре него што можете да примените операције читања и писања, али ћемо о томе касније.
Корак 5: Покретање скупа реплика
Ово је деликатан део, користимо команду rs.initiate()унутар mongo shellкорака 4. пре употребе ове команде, хајде да је прегледамо.
rs.initiate(
{
_id : <replicaSetName>,
members: [
{ _id : 0, host : "example1.net:27017" },
{ _id : 1, host : "example2.net:27017" },
{ _id : 2, host : "example3.net:27017" }
]
}
)
Прво _idпоље је стринг и мора се подударати са --replSetоним које је претходно прослеђено у mongod. Такође, свака вредност hostмора бити или ип или име домена сваког члана скупа реплика. Не заборавите да додате порт који монго инстанца користи у сваком члану.
Сада је време да извршите команду са вашим подацима на њој, ово ће покренути election, а затим ће примарни бити изабран аутоматски.
Овде треба да приметите да се курсор љуске променио у YOUR_SET_NAME:PRIMARY>или YOUR_SET_NAME:SECONDARY. То значи да је креирање комплета било успешно.
Да бисте наставили са радом, морате пронаћи primary, ако нисте на њему, наравно. Користите rs.status()команду да прикажете информације о скупу реплика и лоцирате primary. Ви тражите некретнину "stateStr" : "PRIMARY".
Корак 6: Креирање администратора
Након што пронађете primary, унесите mongo shellи покрените следећу команду користећи своје податке.
admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "YOUR_USER",
pwd: "YOU_PASSWORD",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
admin = db.getSiblingDB("admin")Део омогућава нам писати у adminиз неке друге базе података. Ово ствара псеудоним који се зове admin, тако да можемо да извршавамо команде користећи га уместо тога.
Ако је операција успешна, добићете обавештење да је корисник додат.
Successfully added user: {
"user" : "YOUR_USER",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
У овом тренутку имамо само администратора за све сервере, али постављање реплике нас приморава да имамо корисника са том clusterAdminулогом. Направићемо другог корисника само са том улогом да раздвојимо бриге.
Корак 7: Аутентификација као администратор
Достигли смо ограничење од localhost exception, због чега морамо да променимо аутентификацију на корисника који је креиран један корак раније.
Можете променити кориснике у mongo shellоквиру следећег.
db.getSiblingDB("admin").auth("YOUR_ADMIN", "YOUR_PASSWORD" )
Ако се већ нисте повезали са mongo shellовом командом уместо тога.
mongo -u "YOUR_ADMIN" -p "YOUR_PASSWORD" --authenticationDatabase "admin"
Бићете обавештени о промени корисника и можете да пређете на следећи корак.
Корак 8: Креирање главног кластера
clusterAdminУлога даје упутство потпуну контролу над скупа реплика. Креирање је лако као и креирање администраторског корисника.
db.getSiblingDB("admin").createUser(
{
"user" : "YOUR_USER",
"pwd" : "YOUR_PASSWORD",
roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
}
)
Имајте на уму да је овај пут улога промењена уclusterAdmin .
Корак 9: Убацивање података у скуп реплика
У овом тренутку имамо 2 администратора корисника: једног који има потпуну контролу над сервером и другог који има приступ административним задацима на нивоу скупа реплика. Међутим, недостаје нам корисник који има приступ да „користи“ базу података, па ћемо сада креирати тог корисника.
admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "YOUR_USER",
pwd: "YOUR_PASSWORD",
roles: [ { role: "userAdminAnyDatabase", db: "cars" } ]
}
)
Обратите пажњу да овај пут мењамо dbдео, ту стављамо базу података која је доступна кориснику, у овом случају користимо базу података под називом cars.
База података још није креирана. Да бисте то урадили, мораћете да откуцате неке команде да бисте га имплицитно креирали. Пребаците се на carsбазу података.
use cars
Добићете обавештење: switched to db cars.
База података још увек није креирана, да бисте то урадили, потребно је да у њу нешто упишете. Користимо следећи пример.
db.models.insert({ make: "Dodge", model: "Viper", year: 2010 })
Овог пута ћете бити обавештени са WriteResult({ "nInserted" : 1 }).
Ако желите, можете да преузмете све објекте у бази, find()методом:
db.models.find()
{ "_id" : ObjectId("59acd8b55334882863541ff4"), "make" : "Dodge", "model" : "Viper", "year" : 2010 }
Имајте на уму да _idће се то разликовати у вашем излазу, али остали подаци би требали бити исти. Ако буде довољно времена, ови подаци ће се реплицирати на друге чланове.
Закључак
Прављење сета реплика у почетку може бити изазовно јер постоји много информација које треба разумети, али када добијете идеју иза тога, можете да је примените на повјетарцу, тако да немојте одустајати ако не можете да је схватите први пут. Имајте на уму да је скуп реплика важан у МонгоДБ администрацији јер отвара могућност додавања напредних функција као што је балансирање оптерећења.