Πώς να μην πυροβολήσετε τον εαυτό σας στο πόδι χρησιμοποιώντας το Liquibase

Δεν συνέβη ποτέ, και ιδού ξανά!

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

Αυτό το άρθρο περιλαμβάνει χρήσιμες συμβουλές και περιγραφές τριών από τις πιο προφανείς παγίδες στις οποίες μπορείτε να πέσετε όταν εργάζεστε με εργαλεία μετεγκατάστασης σχεσιακών βάσεων δεδομένων, ειδικότερα με το Liquibase. Σχεδιασμένο για προγραμματιστές Java Junior και Middle level, για πιο έμπειρους προγραμματιστές μπορεί να είναι ενδιαφέρον για τη δομή και την επανάληψη αυτού που είναι πιθανότατα ήδη γνωστό.

Πώς να μην πυροβολήσετε τον εαυτό σας στο πόδι χρησιμοποιώντας το Liquibase

Το Liquibase και το Flyway είναι οι κύριες ανταγωνιστικές τεχνολογίες για την επίλυση προβλημάτων ελέγχου έκδοσης σχεσιακών δομών στον κόσμο της Java. Το πρώτο είναι εντελώς δωρεάν, στην πράξη επιλέγεται πιο συχνά για χρήση, γι' αυτό και επιλέχθηκε η Liquibase ως ήρωας της έκδοσης. Ωστόσο, ορισμένες από τις πρακτικές που περιγράφονται μπορεί να είναι γενικές, ανάλογα με την αρχιτεκτονική της εφαρμογής σας.

Οι σχεσιακές μεταναστεύσεις είναι ένας αναγκαστικός τρόπος αντιμετώπισης της αδύναμης ευελιξίας των αποθηκών σχεσιακών δεδομένων. Στην εποχή της μόδας για το OOP, το στυλ εργασίας με τη βάση δεδομένων σήμαινε ότι θα περιγράφαμε το σχήμα μία φορά και δεν θα το ακουμπούσαμε ξανά. Αλλά η πραγματικότητα είναι πάντα ότι τα πράγματα αλλάζουν και απαιτούνται αρκετά συχνά αλλαγές στη δομή των πινάκων. Φυσικά, η ίδια η διαδικασία είναι επώδυνη και δυσάρεστη.

Δεν θα εμβαθύνω στην περιγραφή της τεχνολογίας και στις οδηγίες για την προσθήκη της βιβλιοθήκης στο έργο σας, έχουν γραφτεί αρκετά άρθρα σχετικά με αυτό το θέμα:

Επιπλέον, υπήρχε ήδη ένα υπέροχο άρθρο σχετικά με το θέμα των χρήσιμων συμβουλών:

Советы

Θέλω να μοιραστώ τις συμβουλές και τα σχόλιά μου, που γεννήθηκαν μέσα από τον ιδρώτα, το αίμα και τον πόνο της επίλυσης προβλημάτων με τη μετανάστευση.

1. Πριν ξεκινήσετε, θα πρέπει να διαβάσετε την ενότητα βέλτιστων πρακτικών Σε απευθείας σύνδεση Liquibase

Εκεί περιγράφονται απλά αλλά πολύ σημαντικά πράγματα, χωρίς τα οποία η χρήση της βιβλιοθήκης μπορεί να περιπλέξει τη ζωή σας. Για παράδειγμα, μια μη δομική προσέγγιση για τη διαχείριση συνόλων αλλαγών αργά ή γρήγορα θα οδηγήσει σε σύγχυση και σπασμένες μετεγκαταστάσεις. Εάν δεν αναπτύξετε αμοιβαία εξαρτώμενες αλλαγές στη δομή της βάσης δεδομένων και στη λογική των υπηρεσιών ταυτόχρονα, τότε υπάρχει μεγάλη πιθανότητα αυτό να οδηγήσει σε κόκκινες δοκιμές ή σε χαλασμένο περιβάλλον. Επιπλέον, οι συστάσεις για τη χρήση του Liquibase στον επίσημο ιστότοπο περιέχουν μια παράγραφο για την ανάπτυξη και την επαλήθευση των σεναρίων επαναφοράς μαζί με τα κύρια σενάρια μετεγκατάστασης. Λοιπόν, στο άρθρο https://habr.com/ru/post/178665/ υπάρχουν παραδείγματα κώδικα που σχετίζονται με τις μετεγκαταστάσεις και τον μηχανισμό επαναφοράς.

2. Εάν ξεκινήσατε να χρησιμοποιείτε εργαλεία μετεγκατάστασης, μην επιτρέψετε μη αυτόματες διορθώσεις στη δομή της βάσης δεδομένων

Όπως λέει και η παροιμία: "Μια φορά Persil, πάντα Persil." Εάν η διαχείριση της βάσης της εφαρμογής σας έχει αρχίσει να γίνεται από τα εργαλεία Liquibase, τυχόν μη αυτόματες αλλαγές οδηγούν αμέσως σε ασυνεπή κατάσταση και το επίπεδο εμπιστοσύνης στα σύνολα αλλαγών μηδενίζεται. Πιθανοί κίνδυνοι - αρκετές ώρες που αφιερώθηκαν στην αποκατάσταση της βάσης δεδομένων, στη χειρότερη περίπτωση - ένας νεκρός διακομιστής. Εάν η ομάδα σας έχει έναν αρχιτέκτονα DBA "παλιάς σχολής", εξηγήστε του υπομονετικά και στοχαστικά πόσο άσχημα θα είναι τα πράγματα αν απλώς επεξεργαστεί τη βάση δεδομένων με τον δικό του τρόπο από τον προγραμματιστή SQL Developer.

3. Εάν το σύνολο αλλαγών έχει ήδη μεταφερθεί στο χώρο αποθήκευσης, αποφύγετε την επεξεργασία

Εάν κάποιος άλλος προγραμματιστής τράβηξε και εφάρμοσε ένα σύνολο αλλαγών που θα επεξεργαστεί αργότερα, σίγουρα θα σας θυμάται με μια καλή λέξη όταν λάβει ένα σφάλμα κατά την εκκίνηση της εφαρμογής. Εάν η επεξεργασία του συνόλου αλλαγών με κάποιο τρόπο διαρρεύσει στην ανάπτυξη, θα πρέπει να ακολουθήσετε την ολισθηρή πλαγιά των επειγουσών επιδιορθώσεων. Η ουσία του προβλήματος βασίζεται στην επικύρωση των αλλαγών με άθροισμα κατακερματισμού - τον κύριο μηχανισμό του Liquibase. Κατά την επεξεργασία του κωδικού συνόλου αλλαγών, το άθροισμα κατακερματισμού αλλάζει. Η επεξεργασία συνόλων αλλαγών είναι δυνατή μόνο όταν είναι δυνατή η ανάπτυξη ολόκληρης της βάσης δεδομένων από την αρχή χωρίς απώλεια δεδομένων. Σε αυτήν την περίπτωση, η αναδιαμόρφωση του κώδικα SQL ή XML μπορεί, αντίθετα, να κάνει τη ζωή πιο εύκολη, να κάνει τις μετακινήσεις πιο ευανάγνωστες. Ένα παράδειγμα θα ήταν μια κατάσταση κατά την οποία, στην αρχή της εφαρμογής, το σχήμα της βάσης δεδομένων πηγής συντονιζόταν εντός της ομάδας.

4. Έχετε επαληθεύσει τα αντίγραφα ασφαλείας της βάσης δεδομένων εάν είναι δυνατόν

Εδώ, νομίζω, όλα είναι ξεκάθαρα. Εάν ξαφνικά η μετανάστευση ήταν ανεπιτυχής, όλα μπορούν να επιστραφούν πίσω. Το Liquibase έχει ένα εργαλείο επαναφοράς, αλλά τα σενάρια επαναφοράς γράφονται επίσης από τον ίδιο τον προγραμματιστή και μπορεί να έχουν προβλήματα με την ίδια πιθανότητα όπως στα κύρια σενάρια του συνόλου αλλαγών. Αυτό σημαίνει ότι το να παίζετε με ασφάλεια με αντίγραφα ασφαλείας είναι χρήσιμο σε κάθε περίπτωση.

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

Εάν αυτό δεν έρχεται σε αντίθεση με τα συμβόλαια και το απόρρητο, δεν υπάρχουν προσωπικά δεδομένα στη βάση δεδομένων και δεν ζυγίζει σαν δύο ήλιοι - προτού το εφαρμόσετε σε διακομιστές ζωντανής μετανάστευσης, μπορείτε να ελέγξετε πώς λειτουργεί στον υπολογιστή του προγραμματιστή και να υπολογίσετε σχεδόν το 100% πιθανών προβλημάτων κατά τη μετανάστευση.

6. Συνομιλήστε με άλλους προγραμματιστές της ομάδας

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

7. Σκέψου τι κάνεις!

Φαινομενικά αυτονόητες συμβουλές που ισχύουν για κάθε περίσταση. Ωστόσο, πολλά προβλήματα θα μπορούσαν να είχαν αποφευχθεί αν ο προγραμματιστής είχε αναλύσει για άλλη μια φορά τι έκανε και τι θα μπορούσε να επηρεάσει. Η εργασία με τις μεταναστεύσεις απαιτεί πάντα ιδιαίτερη προσοχή και ακρίβεια.

Παγίδες

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

Κατάσταση 1. Δύο προγραμματιστές προσπαθούν να προσθέσουν νέες ομάδες αλλαγών ταυτόχρονα

Πώς να μην πυροβολήσετε τον εαυτό σας στο πόδι χρησιμοποιώντας το Liquibase
Η Vasya και η Petya θέλουν να δημιουργήσουν ένα σύνολο αλλαγών έκδοσης 4 χωρίς να γνωρίζουν ο ένας για τον άλλον. Έκαναν αλλαγές στη δομή της βάσης δεδομένων και ανέπτυξαν ένα αίτημα έλξης, με διαφορετικά αρχεία συνόλου αλλαγών. Ο παρακάτω μηχανισμός προτείνεται παρακάτω:

Πώς να αποφασίσετε

  1. Κάπως έτσι, οι συνάδελφοι πρέπει να συμφωνήσουν για τη σειρά με την οποία θα πρέπει να πηγαίνουν τα σετ αλλαγών τους, ας πούμε ότι πρέπει να εφαρμοστεί πρώτα το Petin.
  2. Το ένα άτομο θα πρέπει να ρίξει το άλλο και να επισημάνει το σύνολο αλλαγών του Vasya με την έκδοση 5. Αυτό μπορεί να γίνει μέσω Cherry Pick ή μια τακτοποιημένη συγχώνευση.
  3. Μετά τις αλλαγές, φροντίστε να ελέγξετε την εγκυρότητα των ενεργειών που έγιναν.
    Στην πραγματικότητα, οι μηχανισμοί Liquibase θα σας επιτρέψουν να έχετε δύο σετ αλλαγών της έκδοσης 4 στο αποθετήριο, ώστε να μπορείτε να αφήσετε τα πάντα ως έχουν. Δηλαδή, απλά θα έχετε δύο αναθεωρήσεις της έκδοσης 4 με διαφορετικά ονόματα. Με αυτήν την προσέγγιση, οι εκδόσεις της βάσης δεδομένων γίνονται πολύ δύσκολο να πλοηγηθούν αργότερα.

Επιπλέον, το Liquibase, όπως και τα σπίτια των χόμπιτ, κρατά πολλά μυστικά. Ένα από αυτά είναι το κλειδί validCheckSum, το οποίο έχει εμφανιστεί από την έκδοση 1.7 και σας επιτρέπει να καθορίσετε μια έγκυρη τιμή κατακερματισμού για ένα συγκεκριμένο σύνολο αλλαγών, ανεξάρτητα από το τι είναι αποθηκευμένο στη βάση δεδομένων. Τεκμηρίωση https://www.liquibase.org/documentation/changeset.html λέει τα εξής:

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

Ναι, αυτό δεν συνιστάται. Αλλά μερικές φορές ένας δυνατός μάγος φωτός κατακτά επίσης σκοτεινές τεχνικές.

Περίπτωση 2: Μετανάστευση βάσει δεδομένων

Πώς να μην πυροβολήσετε τον εαυτό σας στο πόδι χρησιμοποιώντας το Liquibase

Ας υποθέσουμε ότι δεν μπορείτε να χρησιμοποιήσετε αντίγραφα ασφαλείας της βάσης δεδομένων από ζωντανούς διακομιστές. Ο Petya δημιούργησε ένα σύνολο αλλαγών, το δοκίμασε τοπικά και με πλήρη σιγουριά ότι είχε δίκιο, έκανε ένα αίτημα έλξης στον προγραμματιστή. Για κάθε ενδεχόμενο, ο επικεφαλής του έργου διευκρίνισε αν η Petya το έλεγξε και στη συνέχεια το έριξε. Αλλά η ανάπτυξη στον διακομιστή ανάπτυξης έχει πέσει.

Στην πραγματικότητα, αυτό είναι δυνατό και κανείς δεν έχει ανοσία από αυτό. Αυτό συμβαίνει εάν οι τροποποιήσεις της δομής του πίνακα συνδέονται με κάποιο τρόπο με συγκεκριμένα δεδομένα από τη βάση δεδομένων. Προφανώς, εάν η βάση δεδομένων του Petya είναι γεμάτη μόνο με δεδομένα δοκιμής, τότε ενδέχεται να μην καλύπτει όλες τις περιπτώσεις προβλημάτων. Για παράδειγμα, όταν διαγράφετε έναν πίνακα, αποδεικνύεται ότι υπάρχουν εγγραφές σε άλλους πίνακες από ξένο κλειδί που σχετίζονται με εγγραφές σε αυτόν που διαγράφεται. Ή κατά την αλλαγή του τύπου στήλης, αποδεικνύεται ότι δεν μπορεί να μετατραπεί το 100% των δεδομένων στον νέο τύπο.

Πώς να αποφασίσετε

  • Γράψτε ειδικά σενάρια που θα εφαρμοστούν μία φορά μαζί με τη μετεγκατάσταση και φέρτε τα δεδομένα στην κατάλληλη μορφή. Αυτός είναι ένας γενικός τρόπος επίλυσης του προβλήματος της μεταφοράς δεδομένων σε νέες δομές μετά την εφαρμογή των μετεγκαταστάσεων, αλλά κάτι παρόμοιο μπορεί να εφαρμοστεί πριν, σε ειδικές περιπτώσεις. Αυτή η διαδρομή, φυσικά, δεν είναι πάντα διαθέσιμη, γιατί η επεξεργασία δεδομένων σε ζωντανούς διακομιστές μπορεί να είναι επικίνδυνη και ακόμη και θανατηφόρα.
  • Ένας άλλος δύσκολος τρόπος είναι να επεξεργαστείτε ένα υπάρχον σύνολο αλλαγών. Η δυσκολία είναι ότι όλες οι βάσεις δεδομένων στις οποίες έχει ήδη εφαρμοστεί στην υπάρχουσα μορφή θα πρέπει να αποκατασταθούν. Είναι πολύ πιθανό ολόκληρη η ομάδα υποστήριξης να αναγκαστεί να δημιουργήσει τοπικά τη βάση δεδομένων από την αρχή.
  • Και ο πιο καθολικός τρόπος είναι να μεταφέρετε το πρόβλημα δεδομένων στο περιβάλλον του προγραμματιστή, να δημιουργήσετε ξανά την ίδια κατάσταση και να προσθέσετε ένα νέο σύνολο αλλαγών, σε ένα χαλασμένο, που θα παρακάμψει το πρόβλημα.
    Πώς να μην πυροβολήσετε τον εαυτό σας στο πόδι χρησιμοποιώντας το Liquibase

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

Κατάσταση 3. Το Liquibase αρχίζει να χρησιμοποιείται αφού μπει στην παραγωγή

Ας υποθέσουμε ότι ο αρχηγός της ομάδας ζήτησε από τον Petya να συμπεριλάβει τη Liquibase στο έργο, αλλά το έργο είναι ήδη σε παραγωγή και υπάρχει μια ήδη υπάρχουσα δομή βάσης δεδομένων.

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

Πώς να αποφασίσετε

Υπάρχουν επίσης διάφοροι τρόποι:

  • Το πρώτο και πιο προφανές είναι να έχετε ένα ξεχωριστό σενάριο που πρέπει να εφαρμόζεται χειροκίνητα κατά την προετοιμασία ενός νέου περιβάλλοντος.
  • Το δεύτερο, λιγότερο προφανές, είναι να έχετε μια μετεγκατάσταση Liquibase που βρίσκεται σε διαφορετικό πλαίσιο Liquibase και να την εφαρμόσετε. Μπορείτε να διαβάσετε περισσότερα για το Liquibase Context εδώ: https://www.liquibase.org/documentation/contexts.html. Γενικά, αυτός είναι ένας ενδιαφέρον μηχανισμός που μπορεί να εφαρμοστεί με επιτυχία, για παράδειγμα, για δοκιμές.
  • Το τρίτο μονοπάτι αποτελείται από πολλά βήματα. Αρχικά, πρέπει να δημιουργηθεί μια μετεγκατάσταση για υπάρχοντες πίνακες. Στη συνέχεια, πρέπει να εφαρμοστεί σε κάποιο περιβάλλον και έτσι θα ληφθεί το άθροισμα κατακερματισμού του. Το επόμενο βήμα είναι να αρχικοποιήσετε τους κενούς πίνακες Liquibase στον μη κενό διακομιστή μας και μπορείτε να τοποθετήσετε χειροκίνητα μια εγγραφή ενός συνόλου αλλαγών "σαν να εφαρμόζεται" με τις αλλαγές ήδη στη βάση δεδομένων στον πίνακα με το ιστορικό εφαρμογής συνόλων αλλαγών. Έτσι, σε έναν ήδη υπάρχοντα διακομιστή, το ιστορικό θα ξεκινά από την έκδοση 2 και όλα τα νέα περιβάλλοντα θα συμπεριφέρονται με τον ίδιο τρόπο.
    Πώς να μην πυροβολήσετε τον εαυτό σας στο πόδι χρησιμοποιώντας το Liquibase

Σενάριο 4: Οι μεταναστεύσεις γίνονται τεράστιες και δεν μπορούν να συμβαδίσουν

Στην αρχή της ανάπτυξης υπηρεσίας, κατά κανόνα, το Liquibase χρησιμοποιείται ως εξωτερική εξάρτηση και όλες οι μετεγκαταστάσεις υποβάλλονται σε επεξεργασία όταν ξεκινά η εφαρμογή. Ωστόσο, με την πάροδο του χρόνου, μπορεί να σκοντάψετε στις ακόλουθες περιπτώσεις:

  • Οι μεταναστεύσεις γίνονται τεράστιες και χρειάζονται πολύ χρόνο για να ολοκληρωθούν.
  • Υπάρχει ανάγκη μετεγκατάστασης σε κατανεμημένα περιβάλλοντα, για παράδειγμα, σε πολλές περιπτώσεις διακομιστών βάσεων δεδομένων ταυτόχρονα.
    Σε αυτήν την περίπτωση, η εφαρμογή μετεγκαταστάσεων για πολύ μεγάλο χρονικό διάστημα θα έχει ως αποτέλεσμα ένα χρονικό όριο κατά την εκκίνηση της εφαρμογής. Επίσης, η εφαρμογή μετεγκατάστασης ανά περίπτωση εφαρμογής μπορεί να έχει ως αποτέλεσμα διαφορετικοί διακομιστές να βρίσκονται σε κατάσταση εκτός συγχρονισμού.

Πώς να αποφασίσετε

Σε τέτοιες περιπτώσεις, το έργο σας είναι ήδη μεγάλο, ίσως ακόμη και ένας ενήλικας, και το Liquibase αρχίζει να λειτουργεί ως ξεχωριστό εξωτερικό εργαλείο. Το γεγονός είναι ότι το Liquibase, ως βιβλιοθήκη, συναρμολογείται σε ένα αρχείο jar και μπορεί να λειτουργήσει ως εξάρτηση εντός του έργου, καθώς και ως αυτόνομο.

Εκτός σύνδεσης, μπορείτε να αφήσετε την εφαρμογή μετεγκατάστασης στο περιβάλλον CI/CD σας ή στους ισχυρούς ώμους των sysadmin/deployers σας. Για να το κάνετε αυτό, χρειάζεστε τη γραμμή εντολών Liquibase https://www.liquibase.org/documentation/command_line.html. Σε αυτήν τη λειτουργία, καθίσταται δυνατή η εκκίνηση της εφαρμογής αφού ολοκληρωθούν όλες οι απαραίτητες μετεγκαταστάσεις.

Παραγωγή

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

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο