
Aquest article continua el nostre 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:

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:

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:

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

Sovint fem servir aquest esquema en producció i, per facilitar-ne l'ús, l'hem implementat dins del mòdul de (nosaltres ), 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-oldDesprés d'això, s'iniciarà la instal·lació "vella" de prova de MongoDB:
kubectl --namespace=mongo-old get pods 
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 
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())"'; doneEn 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-newEsperem fins que comencen tots els pods (si hi ha moltes dades, el seu llançament pot trigar hores):

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 
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 .
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
