Migració perfecta de MongoDB a Kubernetes

Migració perfecta de MongoDB a Kubernetes

Aquest article continua el nostre material recent sobre la migració de RabbitMQ i dedicat a MongoDB. Com que mantenim molts clústers de Kubernetes i MongoDB, vam arribar a la necessitat natural de migrar les dades d'una instal·lació a una altra i fer-ho sense temps d'inactivitat. Els escenaris principals són els mateixos: moure MongoDB d'un servidor virtual/maquinari a Kubernetes o moure MongoDB dins del mateix clúster de Kubernetes (d'un espai de noms a un altre).

La nostra recepta està pensada per als casos en què hi ha un clúster MongoDB antic (per exemple, de 3 nodes i situat ja sigui en K8s o en servidors més antics) amb el qual s'està executant una aplicació allotjada a Kubernetes:

Migració perfecta de MongoDB a Kubernetes

Com transferirem aquest clúster a una nova producció a Kubernetes?

Теория

L'algorisme de migració general és similar al descrit en la situació amb RabbitMQ.

És important tenir en compte que el moviment requereix que els servidors MongoDB i Kubernetes estiguin a la mateixa xarxa. Els nodes del clúster de MongoDB es comunicaran entre ells mitjançant la IP dels servidors antics (on es troben les instal·lacions antigues de MongoDB) i pels noms DNS dels pods amb MongoDB a K8s. Per tant, als servidors de maquinari (amb instal·lacions antigues) haureu de reenviar rutes als pods i, a continuació, configurar-los per utilitzar un servidor DNS que s'executi a Kubernetes (o registrar els noms necessaris a /etc/hosts, encara que en general és millor evitar aquesta possibilitat).

El següent pas és crear un clúster MongoDB als pods de Kubernetes. En el nostre cas, el clúster de base de dades consta de 3 nodes i cada node es troba en un pod K8s independent; tanmateix, el seu nombre pot ser diferent. Al ConfigMap, heu d'especificar l'adreça del mestre MongoDB de la instal·lació antiga: aleshores, els nodes MongoDB situats als pods a K8s començaran a sincronitzar-se immediatament amb ell.

Després que tots els pods estiguin en funcionament, es forma un clúster MongoDB de 6 nodes:

Migració perfecta de MongoDB a Kubernetes

Tingueu en compte que els pods trigaran molt a augmentar, ja que cada pod es llança al seu torn i, en el moment del llançament, sincronitza les dades del mestre.

A continuació, podeu canviar la vostra aplicació per utilitzar els nous servidors MongoDB:

Migració perfecta de MongoDB a Kubernetes

Tot el que queda és eliminar els nodes antics del clúster MongoDB, després del qual el moviment es pot considerar completa:

Migració perfecta de MongoDB a Kubernetes

Sovint fem servir aquest esquema en producció i, per facilitar-ne l'ús, l'hem implementat dins del mòdul de operador-complement (nosaltres anunciat recentment), que permet que les configuracions típiques de MongoDB es distribueixin entre molts clústers. Tenim previst publicar els nostres mòduls aviat, però de moment us presentem instruccions separades amb les quals podeu provar la solució proposada en acció sense utilitzar l'operador de complements.

Provem-ho a la pràctica

Requisits

Requisits:

  • Clúster Kubernetes (minikube també funcionarà);
  • Clúster MongoDB (es pot desplegar en metall nu i fer com un clúster normal a Kubernetes a partir del gràfic oficial de Helm).

A l'exemple següent, s'anomenarà l'antic clúster MongoDB mongo-old i instal·lat al mateix clúster de Kubernetes, on després instal·larem el nou (mongo-new).

Preparant el clúster antic

1. Per a un exemple que demostra l'esquema descrit en acció, creem un clúster MongoDB "vell" (és a dir, subjecte a migració) directament a Kubernetes (en realitat, es pot localitzar en servidors separats fora de K8). Per fer-ho, descarregueu el gràfic Helm:

helm fetch --untar stable/mongodb-replicaset

... i editeu-lo una mica configurant l'autorització:

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

També en values.yaml podeu configurar certificats i molt més.

2. Instal·leu el gràfic:

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

Després d'això, s'iniciarà la instal·lació "vella" de prova de MongoDB:

kubectl --namespace=mongo-old get pods

Migració perfecta de MongoDB a Kubernetes

Entrem al pod amb el seu mestre i creem una base de dades de prova:

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

Migració perfecta de MongoDB a Kubernetes

Entrant a diferents beines, vaig descobrir que el mestre és mongo-old-mongodb-replicaset-0. Tanmateix, per a una solució més còmoda a aquest problema, després d'instal·lar el gràfic Helm, es mostra una ordre sobre com determinar MASTER_POD. En el meu cas (per mongo-old de 3 nodes) té aquest aspecte:

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

En aquest punt, la preparació de l'antiga instal·lació de MongoDB, les dades de la qual es transferiran, està a punt.

Migrar un clúster MongoDB

Ara despleguem una nova instal·lació de MongoDB, que estarà ubicada a Kubernetes i utilitzada per l'aplicació en producció.

NB: Tingueu en compte que s'ha d'utilitzar la mateixa versió de MongoDB que abans. En cas contrari, hi ha el risc de problemes de compatibilitat.

Per analogia amb la secció anterior (on vam simular una instal·lació "antiga" de MongoDB), agafem el ja esmentat gràfic Helm (amb l'ordre helm fetch) i configurar l'autorització, així com altres paràmetres, si s'utilitza. A més, corregirem el fitxer init/on-start.sh, afegint-hi temporalment a la línia 165 l'adreça mestra obtinguda al pas anterior (o coneguda per la instal·lació de MongoDB en servidors individuals):

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

Estem preparats per crear una nova instal·lació de MongoDB:

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

Esperem fins que comencen tots els pods (si hi ha moltes dades, el seu llançament pot trigar hores):

Migració perfecta de MongoDB a Kubernetes

Ara ho fem exec al nou pod i mireu la llista de bases de dades:

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

Migració perfecta de MongoDB a Kubernetes

Dos clústers MongoDB es combinen en un, format per 6 nodes.

En aquest punt, podeu canviar l'aplicació al nou clúster, però queden uns quants passos per completar la migració.

Del fitxer init/on-start.sh a la nova instal·lació eliminem la línia que hem afegit:

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

Ara anem a l'antic mestre del clúster i "derrocar-lo"; llavors s'assignarà un nou mestre al clúster. Entrem al pod amb el mestre MongoDB:

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

Després d'això, canviem les prioritats dels nodes i canviem els mestres:

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

El node actual ha deixat de ser un mestre: s'escollirà un nou node. Com que hem canviat les prioritats, el node que necessitem es convertirà en el mestre.

NB: Per defecte, tots els nodes de MongoDB tenen una prioritat d'1. A dalt, elevem la prioritat del node que necessitem a 2. Així, un membre del nou clúster es converteix definitivament en el mestre general. Podeu llegir més sobre com funcionen aquests mecanismes a MongoDB a documentació.

Desactivem l'antiga instal·lació de MongoDB, després aneu al nou assistent i suprimim els nodes antics:

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

Després d'això, la migració es pot considerar completa: hem canviat correctament de l'antic clúster MongoDB al nou!

Resultats de

L'esquema descrit és adequat per a gairebé tots els casos en què necessiteu migrar MongoDB o simplement passar a un clúster nou.

Potser el matís principal durant la transferència és la necessitat de reenviar les adreces IP dels nous pods als servidors de l'antiga instal·lació de MongoDB, si es troba fora de K8s, i anomenar-les correctament en DNS (o /etc/hosts). A l'exemple, aquests passos no eren necessaris, ja que la migració es va produir entre diferents espais de noms del mateix clúster de Kubernetes.

PS

Llegeix també al nostre blog:

Font: www.habr.com

Compreu allotjament fiable per a llocs amb protecció DDoS, servidors VPS VDS 🔥 Compra allotjament web fiable amb protecció DDoS, servidors VPS VDS | ProHoster