Enkla migreringar av MongoDB till Kubernetes

Enkla migreringar av MongoDB till Kubernetes

Denna artikel fortsÀtter vÄr senaste material om migrering av RabbitMQ och handlar om MongoDB. Eftersom vi hanterar mÄnga Kubernetes- och MongoDB-kluster har vi kommit till den naturliga slutsatsen att migrera data frÄn en installation till en annan utan driftstopp. De grundlÀggande scenarierna Àr desamma: att flytta MongoDB frÄn en virtuell/physical server till Kubernetes eller flytta MongoDB inom ett och samma Kubernetes-kluster (frÄn ett namnrum till ett annat).

VÄrt recept Àr avsett för fall dÀr en gammal MongoDB-kluster Àr i drift (till exempel frÄn 3 noder och antingen redan i K8s eller pÄ gamla servrar), som applikationen som körs i Kubernetes arbetar med:

Enkla migreringar av MongoDB till Kubernetes

Hur kommer vi att överföra detta kluster till en ny produktionsmiljö i Kubernetes?

Teori

Den allmÀnna migrationsalgoritmen liknar den som beskrivs i situationen med RabbitMQ.

Det Àr viktigt att notera att för möjligheten att flytta krÀvs att servrarna med MongoDB och Kubernetes finns i samma nÀtverk. Noderna i MongoDB-klustret kommer att kommunicera med varandra via IP-adresserna för de gamla servrarna (dÀr de gamla installationerna av MongoDB finns) och via DNS-namn för poddar med MongoDB i K8s. DÀrför behöver du pÄ de fysiska servrarna (med gamla installationer) dirigera rutter till poddarna och sedan konfigurera dem för att anvÀnda DNS-servern som fungerar i Kubernetes (eller skriva in de nödvÀndiga namnen i /etc/hosts, Àven om det i allmÀnhet Àr bÀttre att undvika denna möjlighet).

NĂ€sta steg Ă€r att höja upp MongoDB-klustret i Kubernetes-poddar. I vĂ„rt fall bestĂ„r databasklustret av 3 noder och varje nod Ă€r belĂ€gen i en separat K8s-podd – men deras antal kan vara annorlunda. I ConfigMap mĂ„ste du ange adressen till MongoDB-mastern frĂ„n den gamla installationen: dĂ„ kommer de MongoDB-noder som finns i poddarna i K8s att börja synkronisera med den direkt.

Efter att alla poddar har startat kommer ett MongoDB-kluster att bildas med 6 noder:

Enkla migreringar av MongoDB till Kubernetes

Observera att poddarna kommer att ta tid att starta, eftersom varje podd startas i tur och ordning, och under startprocessen synkroniserar data med mastern.

Efter detta kan applikationen vÀxlas till att anvÀnda de nya MongoDB-servrarna:

Enkla migreringar av MongoDB till Kubernetes

Och det ÄterstÄr bara att ta bort de gamla noderna frÄn MongoDB-klustret, efter vilket flytten kan anses vara fullbordad:

Enkla migreringar av MongoDB till Kubernetes

Denna procedur anvÀnder vi ofta i produktion och för att underlÀtta dess anvÀndning har vi implementerat den inom modulen k addon-operator (detta verktyg har vi nyligen annonserat), vilket gör att man kan distribuera standardkonfigurationer av MongoDB över flera kluster. Publiceringen av vÄra moduler planerar vi att genomföra inom kort, och tills vidare presenterar vi separata instruktioner som man kan prova den föreslagna lösningen med i praktiken utan att anvÀnda addon-operator.

Testar i praktiken

Krav

Uppgifter:

  • Kubernetes-kluster (minikube fungerar ocksĂ„);
  • MongoDB-kluster (kan bĂ„de vara implementerat pĂ„ bare metal och skapat som ett vanligt kluster i Kubernetes frĂ„n den officiella Helm-diagrammet).

I det följande exemplet kommer det gamla klustret med MongoDB att kallas mongo-old och installeras i samma Kubernetes-kluster dÀr vi senare kommer att installera den nya (mongo-new).

Förbereder det gamla klustret

1. För att demonstrera det beskrivna schemat i praktiken, skapar vi ett "gamalt" (dvs. som ska migreras) MongoDB-kluster direkt i Kubernetes (i verkligheten kan det Àven befinna sig pÄ separata servrar utanför K8s). För detta laddar vi ner Helm-diagrammet:

helm fetch --untar stable/mongodb-replicaset


 och redigerar det lite, stÀller in autentisering:

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

Det gÄr ocksÄ att stÀlla in certifikat och mycket mer i values.yaml .

2. Installera diagrammet:

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

DĂ€refter kommer en testinstallation av "det gamla" MongoDB att startas:

kubectl --namespace=mongo-old get pods

Enkla migreringar av MongoDB till Kubernetes

Vi gÄr in i pod med dess master och skapar en testdatabas:

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

Enkla migreringar av MongoDB till Kubernetes

Genom att gÄ in i olika podar hittar jag att mastern Àr mongo-old-mongodb-replicaset-0. För att lösa denna frÄga mer bekvÀmt efter installationen av Helm-diagrammet visas ett kommando för att identifiera MASTER_POD. I mitt fall (för mongo-old av 3 noder) ser det ut sÄ hÀr:

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

SÄledes Àr förberedelserna för den gamla MongoDB-installationen, vars data ska migreras, klara.

Migrering av MongoDB-klustret

Nu kommer vi att implementera en ny MongoDB-installation som kommer att finnas i Kubernetes och anvÀndas av applikationen i produktion.

NB: Observera att samma version av MongoDB bör anvÀndas som tidigare. Annars finns det risk för kompatibilitetsproblem.

I likhet med den föregÄende delen (dÀr vi imiterade en "gammal" installation av MongoDB), tar vi den nÀmnda Helm-diagrammet (kommandot helm fetch) och konfigurerar autentisering samt andra parametrar, om de anvÀnds. Dessutom kommer vi att korrigera filen init/on-start.sh, temporÀrt lÀgga till adressen till master pÄ rad 165, som erhölls i föregÄende steg (eller som du kÀnner till frÄn installationen av MongoDB pÄ separata servrar):

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

Vi Àr redo att skapa en ny installation av MongoDB:

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

VĂ€nta tills alla poddar startas (om det finns mycket data kan det ta timmar):

Enkla migreringar av MongoDB till Kubernetes

Nu gör vi exec i den nya podden och tittar pÄ listan över databaser:

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

Enkla migreringar av MongoDB till Kubernetes

TvÄ MongoDB-kluster har förenats till ett, bestÄende av 6 noder.

För tillfÀllet kan applikationen redan vÀxlas till det nya klustret, men det ÄterstÄr nÄgra steg för att avsluta migreringen.

FrÄn filen init/on-start.sh tar vi bort raden vi lade till i den nya installationen:

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

Nu gĂ„r vi in i den gamla masterklustret och "avsĂ€tter" den — dĂ„ kommer det att utses en ny master i klustret. GĂ„ in i podden med MongoDB-mastern:

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

DÀrefter Àndrar vi prioriteringarna hos noderna och byter master:

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

Den nuvarande noden har slutat vara master — val av ny kommer att Ă€ga rum. Eftersom vi har Ă€ndrat prioriteringarna kommer den nod vi önskar att bli master.

NB: Som standard har alla MongoDB-noder en prioritet pÄ 1. HÀr höjer vi prioriteten hos den nod vi önskar till 2. SÄledes blir en medlem av det nya klustret den gemensamma mastern. Mer om hur dessa mekanismer fungerar i MongoDB kan man lÀsa i dokumentationen.

Vi kommer att stÀnga den gamla installationen av MongoDB, och sedan gÄ in i den nya mastern och ta bort de gamla noderna:

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

DÀrefter kan man anse att migreringen Àr avslutad: vi har framgÄngsrikt vÀxlat frÄn det gamla MongoDB-klustret till det nya!

Sammanfattning

Det beskrivna schemat passar praktiskt taget alla fall nÀr man behöver flytta MongoDB eller bara flytta till ett nytt kluster.

Kanske det viktigaste att tÀnka pÄ vid migrering Àr behovet av att vidarebefordra IP-adresserna för de nya poddarna till servrarna för den gamla installationen av MongoDB, om den finns utanför K8s, samt att namnge dem korrekt i DNS (eller /etc/hosts). I exemplet behövdes inte dessa steg eftersom migreringen skedde mellan olika namnrymder inom samma Kubernetes-kluster.

P.S.

LÀs Àven i vÄr blogg:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster