
Αυτό το άρθρο συνεχίζει την σχετικά με τη μετεγκατάσταση του RabbitMQ και είναι αφιερωμένο στο MongoDB. Δεδομένου ότι διατηρούμε πολλαπλά clusters Kubernetes και MongoDB, καταλήξαμε στη φυσική ανάγκη να μεταφέρουμε δεδομένα από τη μία εγκατάσταση στην άλλη και να το κάνουμε αυτό χωρίς διακοπές λειτουργίας. Τα κύρια σενάρια είναι τα ίδια: μετεγκατάσταση του MongoDB από έναν εικονικό/υλικό διακομιστή στο Kubernetes ή μετεγκατάσταση του MongoDB εντός ενός μόνο cluster Kubernetes (από έναν χώρο ονομάτων σε έναν άλλο).
Η συνταγή μας προορίζεται για περιπτώσεις όπου έχετε ένα παλιό σύμπλεγμα MongoDB (ας πούμε, 3 κόμβους και είτε ήδη σε K8s είτε σε παλιούς διακομιστές) που εκτελεί μια εφαρμογή που φιλοξενείται στο 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 κόμβων:

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

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

Χρησιμοποιούμε συχνά αυτό το σχήμα στην παραγωγή και για ευκολία χρήσης το έχουμε εφαρμόσει μέσα στην ενότητα για να (χρησιμοποιούμε αυτό το βοηθητικό πρόγραμμα ), το οποίο επιτρέπει την κατανομή τυπικών διαμορφώσεων 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 
Ας πάμε στο 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 
Πηγαίνοντας σε διαφορετικά 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 (αν υπάρχουν πολλά δεδομένα, η εκτόξευσή τους μπορεί να διαρκέσει ώρες):

Τώρα ας το κάνουμε exec σε ένα νέο pod και δείτε τη λίστα με τις βάσεις δεδομένων:
kubectl --namespace=mongo-new exec -ti mongo-new-mongodb-replicaset-0 mongo 
Δύο 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
