Беспрекорна миграција МонгоДБ-а у Кубернетес

Беспрекорна миграција МонгоДБ-а у Кубернетес

Овај чланак наставља наше новији материјал о РаббитМК миграцији и посвећен МонгоДБ-у. Пошто одржавамо много Кубернетес и МонгоДБ кластера, дошли смо до природне потребе да мигрирамо податке са једне инсталације на другу и то без застоја. Главни сценарији су исти: премештање МонгоДБ-а са виртуелног/хардверског сервера на Кубернетес или премештање МонгоДБ-а унутар истог Кубернетес кластера (из једног именског простора у други).

Наш рецепт је намењен случајевима када постоји стари МонгоДБ кластер (на пример, од 3 чвора и који се већ налази у К8с или на старијим серверима) са којим се покреће апликација хостована у Кубернетес-у:

Беспрекорна миграција МонгоДБ-а у Кубернетес

Како ћемо такав кластер пренети у нову производњу у Кубернетесу?

Теорија

Општи алгоритам миграције је сличан оном описаном у ситуацији са РаббитМК.

Важно је напоменути да овај потез захтева да МонгоДБ и Кубернетес сервери буду на истој мрежи. Чворови МонгоДБ кластера ће комуницирати једни са другима користећи ИП адресу старих сервера (где се налазе старе МонгоДБ инсталације) и ДНС имена подова са МонгоДБ у К8с. Стога, на хардверским серверима (са старим инсталацијама) мораћете да проследите руте до подова, а затим их конфигуришете да користе ДНС сервер који ради у Кубернетес-у (или региструјете потребна имена у /etc/hosts, иако је генерално боље избегавати ову могућност).

Следећи корак је подизање МонгоДБ кластера у Кубернетес подовима. У нашем случају, кластер базе података се састоји од 3 чвора и сваки чвор се налази у засебном К8с под - међутим, њихов број може бити различит. У ЦонфигМап-у морате навести адресу МонгоДБ мастера из старе инсталације: тада ће МонгоДБ чворови који се налазе у подовима у К8с одмах почети да се синхронизују са њим.

Након што се сви подови покрену, формира се МонгоДБ кластер од 6 чворова:

Беспрекорна миграција МонгоДБ-а у Кубернетес

Имајте на уму да ће махунама требати доста времена да се подигну, пошто се сваки под покреће редом, а у тренутку покретања синхронизује податке са мастера.

Затим можете пребацити своју апликацију да користи нове МонгоДБ сервере:

Беспрекорна миграција МонгоДБ-а у Кубернетес

Остаје само да уклоните старе чворове из МонгоДБ кластера, након чега се потез може сматрати завршеним:

Беспрекорна миграција МонгоДБ-а у Кубернетес

Ову шему често користимо у производњи и, ради лакшег коришћења, имплементирали смо је у оквиру модула за аддон оператор (ми недавно објављено), што омогућава да се типичне МонгоДБ конфигурације дистрибуирају у многе кластере. Планирамо да ускоро објавимо наше модуле, али за сада представљамо посебна упутства помоћу којих можете испробати предложено решење у акцији без коришћења аддон-оператора.

Хајде да пробамо у пракси

Захтеви

Реквизити:

  • Кубернетес кластер (миникубе ће такође радити);
  • МонгоДБ кластер (може се поставити на голи метал и направити као обичан кластер у Кубернетесу са званичног Хелм графикона).

У примеру испод, стари МонгоДБ кластер ће бити именован mongo-old и инсталиран у истом Кубернетес кластеру, где ћемо касније инсталирати нови (mongo-new).

Припрема старог кластера

1. За пример који демонстрира описану шему у акцији, хајде да креирамо „стари“ (тј. подложан миграцији) МонгоДБ кластер директно у Кубернетес-у (у стварности, може се налазити на одвојеним серверима изван К8с-а). Да бисте то урадили, преузмите Хелм графикон:

helm fetch --untar stable/mongodb-replicaset

... и мало га уредите подешавањем ауторизације:

auth:
  enabled: true
  adminUser: mongo
  adminPassword: pa33w0rd
  # metricsUser: metrics
  # metricsPassword: password
  # key: keycontent
  # existingKeySecret:
  # existingAdminSecret:
  # exisitingMetricsSecret:

Такође, у values.yaml можете да конфигуришете сертификате и још много тога.

2. Инсталирајте графикон:

helm install . --name mongo-old --namespace mongo-old

Након тога ће бити покренута пробна „стара“ инсталација МонгоДБ-а:

kubectl --namespace=mongo-old get pods

Беспрекорна миграција МонгоДБ-а у Кубернетес

Уђимо у под са његовим мастером и направимо тестну базу података:

kubectl --namespace=mongo-old exec -ti mongo-old-mongodb-replicaset-0 mongo
use admin
db.auth('mongo','password')
use music
db.artists.insert({ artistname: "The Tea Party" })
show dbs

Беспрекорна миграција МонгоДБ-а у Кубернетес

Улазећи у различите махуне, сазнао сам да је господар mongo-old-mongodb-replicaset-0. Међутим, за погодније решење овог проблема, након инсталирања Хелм графикона, приказује се команда о томе како да се одреди MASTER_POD. У мом случају (за mongo-old од 3 чвора) изгледа овако:

for ((i = 0; i < 3; ++i)); do kubectl exec --namespace mongo-old mongo-old-mongodb-replicaset-$i -- sh -c 'mongo --eval="printjson(rs.isMaster())"'; done

У овом тренутку, припрема старе МонгоДБ инсталације, чији ће подаци бити пренети, је спремна.

Мигрирајте МонгоДБ кластер

Хајде сада да применимо нову инсталацију МонгоДБ-а, која ће бити лоцирана у Кубернетес-у и коју ће апликација користити у производњи.

NB: Имајте на уму да се мора користити иста верзија МонгоДБ-а као и раније. У супротном, постоји ризик од проблема са компатибилношћу.

По аналогији са претходним одељком (где смо симулирали „стару“ МонгоДБ инсталацију), узмимо већ поменути Хелм графикон (са командом helm fetch) и конфигуришите ауторизацију, као и друге параметре, ако се користе. Поред тога, исправићемо датотеку init/on-start.sh, привремено додајући му на линији 165 главну адресу добијену у претходном кораку (или вам је позната по инсталацији МонгоДБ-а на појединачним серверима):

peers='mongo-old-mongodb-replicaset-0.mongo-old-mongodb-replicaset.mongo-old.svc.cluster.local:27017'

Спремни смо да креирамо нову МонгоДБ инсталацију:

helm install . --name mongo-new --namespace mongo-new

Чекамо док се сви подови не почну (ако има пуно података, њихово покретање може потрајати сатима):

Беспрекорна миграција МонгоДБ-а у Кубернетес

Сада знамо exec на нови под и погледајте листу база података:

kubectl --namespace=mongo-new exec -ti mongo-new-mongodb-replicaset-0 mongo

Беспрекорна миграција МонгоДБ-а у Кубернетес

Два МонгоДБ кластера су комбинована у један, који се састоји од 6 чворова.

У овом тренутку можете пребацити апликацију на нови кластер, али је остало неколико корака да довршите миграцију.

Из датотеке init/on-start.sh у новој инсталацији уклањамо линију коју смо додали:

peers='mongo-old-mongodb-replicaset-0.mongo-old-mongodb-replicaset.mongo-old.svc.cluster.local:27017'

Сада идемо до старог мастера кластера и "оборимо" га - тада ће нови мастер бити додељен кластеру. Идемо у под са МонгоДБ мастером:

kubectl --namespace=mongo-old exec -ti mongo-old-mongodb-replicaset-0 mongo
use admin
db.auth('mongo','password')

Након тога мењамо приоритете чворова и мењамо мастере:

cfg = rs.conf()
cfg.members[5].priority = 2
rs.reconfig(cfg)
rs.stepDown(120)

Тренутни чвор је престао да буде мастер - биће изабран нови чвор. Пошто смо променили приоритете, чвор који нам је потребан постаће главни.

NB: Подразумевано, сви МонгоДБ чворови имају приоритет 1. Изнад, повећавамо приоритет чвора који нам је потребан на 2. Тако члан новог кластера дефинитивно постаје генерални господар. Више о томе како ови механизми функционишу у МонгоДБ-у можете прочитати у документација.

Хајде да онемогућимо стару МонгоДБ инсталацију, а затим идите на нови чаробњак и избришите старе чворове:

rs.remove("mongo-old-mongodb-replicaset-0.mongo-old-mongodb-replicaset.mongo-old.svc.cluster.local:27017")
rs.remove("mongo-old-mongodb-replicaset-1.mongo-old-mongodb-replicaset.mongo-old.svc.cluster.local:27017")
rs.remove("mongo-old-mongodb-replicaset-2.mongo-old-mongodb-replicaset.mongo-old.svc.cluster.local:27017")

Након овога, миграција се може сматрати завршеном: успешно смо прешли са старог МонгоДБ кластера на нови!

Резултати

Описана шема је погодна за скоро све случајеве када треба да мигрирате МонгоДБ или једноставно пређете на нови кластер.

Можда је главна нијанса при преносу потреба да се ИП адресе нових подова проследе на сервере старе МонгоДБ инсталације, ако се налази ван К8с, и да се правилно именују у ДНС-у (или /etc/hosts). У примеру, ови кораци нису били потребни, пошто је до миграције дошло између различитих именских простора истог Кубернетес кластера.

ПС

Прочитајте и на нашем блогу:

Извор: ввв.хабр.цом

Купите поуздан хостинг за сајтове са ДДоС заштитом, ВПС ВДС сервере 🔥 Купите поуздан веб хостинг са DDoS заштитом, VPS VDS сервере | ProHoster