Ομαλή μετεγκατάσταση του MongoDB στο Kubernetes

Ομαλή μετεγκατάσταση του MongoDB στο Kubernetes

Αυτό το άρθρο συνεχίζει την πρόσφατο υλικό σχετικά με τη μετεγκατάσταση του RabbitMQ και είναι αφιερωμένο στο MongoDB. Δεδομένου ότι διατηρούμε πολλαπλά clusters Kubernetes και MongoDB, καταλήξαμε στη φυσική ανάγκη να μεταφέρουμε δεδομένα από τη μία εγκατάσταση στην άλλη και να το κάνουμε αυτό χωρίς διακοπές λειτουργίας. Τα κύρια σενάρια είναι τα ίδια: μετεγκατάσταση του MongoDB από έναν εικονικό/υλικό διακομιστή στο Kubernetes ή μετεγκατάσταση του MongoDB εντός ενός μόνο cluster Kubernetes (από έναν χώρο ονομάτων σε έναν άλλο).

Η συνταγή μας προορίζεται για περιπτώσεις όπου έχετε ένα παλιό σύμπλεγμα MongoDB (ας πούμε, 3 κόμβους και είτε ήδη σε K8s είτε σε παλιούς διακομιστές) που εκτελεί μια εφαρμογή που φιλοξενείται στο Kubernetes:

Ομαλή μετεγκατάσταση του MongoDB στο Kubernetes

Πώς μπορούμε να μεταφέρουμε ένα τέτοιο σύμπλεγμα σε μια νέα παραγωγή στο Kubernetes;

Θεωρία

Ο γενικός αλγόριθμος μετεγκατάστασης είναι παρόμοιος με αυτόν που περιγράφεται στην περίπτωση με το RabbitMQ.

Είναι σημαντικό να σημειωθεί ότι η μετεγκατάσταση απαιτεί οι διακομιστές που εκτελούν MongoDB και Kubernetes να βρίσκονται στο ίδιο δίκτυο. Οι κόμβοι συμπλέγματος MongoDB θα επικοινωνούν μεταξύ τους μέσω της διεύθυνσης IP των παλιών διακομιστών (όπου βρίσκονται οι παλιές εγκαταστάσεις MongoDB) και μέσω των ονομάτων DNS των pods με MongoDB σε K8s. Επομένως, σε διακομιστές υλικού (με παλιές εγκαταστάσεις), θα χρειαστεί να προωθήσετε διαδρομές στα pods και, στη συνέχεια, να τα ρυθμίσετε ώστε να χρησιμοποιούν τον διακομιστή DNS που εκτελείται στο Kubernetes (ή να γράψετε τα απαραίτητα ονόματα στο /etc/hosts, αν και γενικά είναι καλύτερο να αποφεύγεται αυτή η πιθανότητα).

Το επόμενο βήμα είναι να δημιουργήσουμε ένα cluster MongoDB σε pods Kubernetes. Στην περίπτωσή μας, το σύμπλεγμα βάσης δεδομένων αποτελείται από 3 κόμβους και κάθε κόμβος βρίσκεται σε ξεχωριστό pod K8s - ωστόσο, ο αριθμός τους μπορεί να διαφέρει. Στο ConfigMap, πρέπει να καθορίσετε τη διεύθυνση του κύριου MongoDB από την παλιά εγκατάσταση: στη συνέχεια, οι κόμβοι MongoDB που βρίσκονται σε pod στο K8s θα ξεκινήσουν αμέσως να συγχρονίζονται με αυτόν.

Μόλις ολοκληρωθούν όλα τα pod, δημιουργείται ένα cluster MongoDB 6 κόμβων:

Ομαλή μετεγκατάσταση του MongoDB στο Kubernetes

Λάβετε υπόψη ότι τα pod θα χρειαστούν πολύ χρόνο για να ξεκινήσουν, καθώς κάθε pod ξεκινά με τη σειρά του και κατά την εκκίνηση συγχρονίζει τα δεδομένα με το master.

Μετά από αυτό, μπορείτε να αλλάξετε την εφαρμογή ώστε να χρησιμοποιεί τους νέους διακομιστές MongoDB:

Ομαλή μετεγκατάσταση του MongoDB στο Kubernetes

Το μόνο που απομένει είναι να αφαιρεθούν οι παλιοί κόμβοι από το σύμπλεγμα MongoDB, μετά την οποία η μετακίνηση μπορεί να θεωρηθεί ολοκληρωμένη:

Ομαλή μετεγκατάσταση του MongoDB στο Kubernetes

Χρησιμοποιούμε συχνά αυτό το σχήμα στην παραγωγή και για ευκολία χρήσης το έχουμε εφαρμόσει μέσα στην ενότητα για να addon-operator (χρησιμοποιούμε αυτό το βοηθητικό πρόγραμμα ανακοινώθηκε πρόσφατα), το οποίο επιτρέπει την κατανομή τυπικών διαμορφώσεων MongoDB σε πολλαπλά clusters. Σχεδιάζουμε να δημοσιεύσουμε σύντομα τις ενότητες μας, αλλά προς το παρόν παρουσιάζουμε ξεχωριστές οδηγίες με τις οποίες μπορείτε να δοκιμάσετε την προτεινόμενη λύση στην πράξη και χωρίς να χρησιμοποιήσετε τον πρόσθετο-τελεστή.

Ας το δοκιμάσουμε στην πράξη

Απαιτήσεις

Καθέκαστα:

  • Το σύμπλεγμα Kubernetes (το minikube θα λειτουργήσει επίσης).
  • Σύμπλεγμα MongoDB (μπορεί να αναπτυχθεί σε γυμνό μέταλλο ή να κατασκευαστεί ως κανονικό σύμπλεγμα στο Kubernetes από το επίσημο διάγραμμα Helm).

Στο παρακάτω παράδειγμα, το παλιό σύμπλεγμα με MongoDB θα ονομαστεί mongo-old και εγκαταστάθηκε στο ίδιο σύμπλεγμα Kubernetes, όπου αργότερα θα εγκαταστήσουμε το νέο (mongo-new).

Προετοιμασία του παλιού συμπλέγματος

1. Ως παράδειγμα που δείχνει το περιγραφόμενο σχήμα σε δράση, θα δημιουργήσουμε ένα «παλιό» (δηλαδή, υπόκειται σε μετεγκατάσταση) σύμπλεγμα MongoDB απευθείας στο Kubernetes (στην πραγματικότητα, μπορεί επίσης να βρίσκεται σε ξεχωριστούς διακομιστές εκτός του K8s). Για να το κάνετε αυτό, κατεβάστε το διάγραμμα Helm:

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

Μετά από αυτό, θα ξεκινήσει μια δοκιμαστική "παλιά" εγκατάσταση του MongoDB:

kubectl --namespace=mongo-old get pods

Ομαλή μετεγκατάσταση του MongoDB στο Kubernetes

Ας πάμε στο pod με το master του και ας δημιουργήσουμε μια βάση δοκιμών:

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

Ομαλή μετεγκατάσταση του MongoDB στο Kubernetes

Πηγαίνοντας σε διαφορετικά pods, ανακάλυψα ότι ο master είναι mongo-old-mongodb-replicaset-0. Ωστόσο, για μια πιο βολική λύση σε αυτό το πρόβλημα, μετά την εγκατάσταση του γραφήματος Helm, εμφανίζεται μια εντολή σχετικά με τον τρόπο προσδιορισμού 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

Αυτό ολοκληρώνει την προετοιμασία της παλιάς εγκατάστασης MongoDB, τα δεδομένα από την οποία θα μετεγκατασταθούν.

Μετεγκατάσταση ενός συμπλέγματος MongoDB

Τώρα ας αναπτύξουμε μια νέα εγκατάσταση MongoDB που θα βρίσκεται στο Kubernetes και θα χρησιμοποιείται από την εφαρμογή στην παραγωγή.

NBΛάβετε υπόψη ότι πρέπει να χρησιμοποιηθεί η ίδια έκδοση του MongoDB όπως και πριν. Διαφορετικά, υπάρχει κίνδυνος προβλημάτων συμβατότητας.

Κατ' αναλογία με την προηγούμενη ενότητα (όπου προσομοιώσαμε την «παλιά» εγκατάσταση MongoDB), ας πάρουμε το ήδη αναφερθέν διάγραμμα Helm (χρησιμοποιώντας την εντολή helm fetch) και να διαμορφώσετε την εξουσιοδότηση, καθώς και άλλες παραμέτρους, εάν χρησιμοποιούνται. Επίσης, ας διορθώσουμε το αρχείο init/on-start.sh, προσθέτοντας προσωρινά σε αυτό στη γραμμή 165 την κύρια διεύθυνση που αποκτήσατε στο προηγούμενο βήμα (ή που σας είναι γνωστή από την εγκατάσταση του MongoDB σε ξεχωριστούς διακομιστές):

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

Είμαστε έτοιμοι να δημιουργήσουμε μια νέα εγκατάσταση MongoDB:

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

Περιμένουμε μέχρι να ξεκινήσουν όλα τα pods (αν υπάρχουν πολλά δεδομένα, η εκτόξευσή τους μπορεί να διαρκέσει ώρες):

Ομαλή μετεγκατάσταση του MongoDB στο Kubernetes

Τώρα ας το κάνουμε exec σε ένα νέο pod και δείτε τη λίστα με τις βάσεις δεδομένων:

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

Ομαλή μετεγκατάσταση του MongoDB στο Kubernetes

Δύο clusters MongoDB συνδυάζονται σε ένα που αποτελείται από 6 κόμβους.

Σε αυτό το σημείο, μπορείτε ήδη να αλλάξετε την εφαρμογή στο νέο σύμπλεγμα, αλλά απομένουν ακόμη μερικά βήματα για να ολοκληρωθεί η μετεγκατάσταση.

Από αρχείο init/on-start.sh στη νέα εγκατάσταση αφαιρούμε τη γραμμή που προσθέσαμε:

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

Τώρα ας πάμε στον παλιό master του cluster και ας τον "ανατρέψουμε" - τότε θα διοριστεί ένας νέος master στο cluster. Μπαίνουμε στο pod με το master του MongoDB:

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Από προεπιλογή, όλοι οι κόμβοι MongoDB έχουν προτεραιότητα 1. Παραπάνω, αυξάνουμε την προτεραιότητα του κόμβου που χρειαζόμαστε σε 2. Έτσι, ο συνολικός κύριος κόμβος είναι σίγουρα μέλος του νέου συμπλέγματος. Μπορείτε να διαβάσετε περισσότερα σχετικά με τον τρόπο με τον οποίο είναι διατεταγμένοι αυτοί οι μηχανισμοί στο MongoDB στη διεύθυνση τεκμηρίωση.

Ας απενεργοποιήσουμε την παλιά εγκατάσταση MongoDB και, στη συνέχεια, ας πάμε στον νέο κύριο κόμβο και ας διαγράψουμε τους παλιούς κόμβους:

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

Μετά από αυτό, η μετεγκατάσταση μπορεί να θεωρηθεί ολοκληρωμένη: έχουμε μεταβεί με επιτυχία από το παλιό cluster MongoDB στο νέο!

Αποτελέσματα της

Το περιγραφόμενο σχήμα είναι κατάλληλο για σχεδόν όλες τις περιπτώσεις όπου χρειάζεται να μετεγκαταστήσετε το MongoDB ή απλώς να μετακινηθείτε σε ένα νέο σύμπλεγμα.

Ίσως η κύρια λεπτομέρεια κατά τη μεταφορά είναι η ανάγκη προώθησης των διευθύνσεων IP των νέων pods στους διακομιστές της παλιάς εγκατάστασης MongoDB, εάν βρίσκεται εκτός του K8s, και η σωστή ονομασία τους στο DNS (ή /etc/hosts). Στο παράδειγμα, αυτά τα βήματα δεν ήταν απαραίτητα επειδή η μετεγκατάσταση έγινε μεταξύ διαφορετικών χώρων ονομάτων του ίδιου συμπλέγματος Kubernetes.

PS

Διαβάστε επίσης στο blog μας:

Πηγή: www.habr.com

Αγοράστε αξιόπιστη φιλοξενία για ιστότοπους με προστασία DDoS, διακομιστές VPS VDS 🔥 Αγοράστε αξιόπιστη φιλοξενία ιστοσελίδων με προστασία DDoS, διακομιστές VPS VDS | ProHoster