Σύστημα διαχείρισης διαμόρφωσης δικτύου φιλτραρίσματος Qrator

Σύστημα διαχείρισης διαμόρφωσης δικτύου φιλτραρίσματος Qrator

TL? DR: Περιγραφή της αρχιτεκτονικής πελάτη-διακομιστή του εσωτερικού μας συστήματος διαχείρισης διαμόρφωσης δικτύου, QControl. Βασίζεται σε ένα πρωτόκολλο μεταφοράς δύο επιπέδων που λειτουργεί με μηνύματα γεμάτα gzip χωρίς αποσυμπίεση μεταξύ των τελικών σημείων. Οι κατανεμημένοι δρομολογητές και τα τελικά σημεία λαμβάνουν ενημερώσεις διαμόρφωσης και το ίδιο το πρωτόκολλο επιτρέπει την εγκατάσταση τοπικών ενδιάμεσων ρελέ. Το σύστημα βασίζεται στην αρχή διαφορικό αντίγραφο ασφαλείας ("πρόσφατο-σταθερό", εξηγείται παρακάτω) και χρησιμοποιεί τη γλώσσα ερωτημάτων JMESpath μαζί με τη μηχανή προτύπων Jinja για την απόδοση των αρχείων διαμόρφωσης.

Η Qrator Labs λειτουργεί ένα παγκόσμιο δίκτυο μετριασμού επιθέσεων. Το δίκτυό μας λειτουργεί με την αρχή anycast και τα υποδίκτυα διαφημίζονται μέσω BGP. Όντας ένα δίκτυο BGP anycast που βρίσκεται φυσικά σε πολλές περιοχές της Γης, μπορούμε να επεξεργαστούμε και να φιλτράρουμε την παράνομη κίνηση πιο κοντά στον πυρήνα του Διαδικτύου - τους χειριστές Tier-1.

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

Εν άρχή ήν ό λόγος. Γρήγορα έγινε ένα πρωτόκολλο επικοινωνίας που χρειάζεται ενημέρωση.


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

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

Η ποιότητα της σύνδεσης στο Διαδίκτυο εξακολουθεί να διαφέρει σε μεγάλο βαθμό σε όλο τον κόσμο - για να δείξουμε αυτό το σημείο, ας δούμε ένα απλό MTR από την Πράγα, την Τσεχική Δημοκρατία έως τη Σιγκαπούρη και το Χονγκ Κονγκ.

Σύστημα διαχείρισης διαμόρφωσης δικτύου φιλτραρίσματος Qrator
MTR από Πράγα προς Σιγκαπούρη

Σύστημα διαχείρισης διαμόρφωσης δικτύου φιλτραρίσματος Qrator
Το ίδιο και στο Χονγκ Κονγκ

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

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

Πρόσφατο-σταθερό σχέδιο

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

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

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

Αρχιτεκτονική μεταφοράς δύο επιπέδων

Γιατί φτιάξαμε τη μεταφορά μας σε δύο επίπεδα; Η απάντηση είναι αρκετά απλή - θέλαμε να αποσυνδέσουμε τη δρομολόγηση από τη λογική υψηλού επιπέδου, αντλώντας έμπνευση από το μοντέλο OSI με τα επίπεδα μεταφοράς και εφαρμογής. Χρησιμοποιήσαμε το Thrift για το ρόλο του πρωτοκόλλου μεταφοράς και τη μορφή σειριοποίησης msgpack για τη μορφή υψηλού επιπέδου των μηνυμάτων ελέγχου. Αυτός είναι ο λόγος για τον οποίο ο δρομολογητής (που εκτελεί πολλαπλή μετάδοση/μετάδοση/αναμετάδοση) δεν κοιτάζει μέσα στο msgpack, δεν αποσυσκευάζει ή συσκευάζει τα περιεχόμενα πίσω και προωθεί μόνο δεδομένα.

Το Thrift (από τα αγγλικά - "thrift", προφέρεται [θrift]) είναι μια γλώσσα περιγραφής διεπαφής που χρησιμοποιείται για τον ορισμό και τη δημιουργία υπηρεσιών για διαφορετικές γλώσσες προγραμματισμού. Είναι ένα πλαίσιο για κλήσεις απομακρυσμένης διαδικασίας (RPC). Συνδυάζει μια διοχέτευση λογισμικού με μια μηχανή δημιουργίας κώδικα για την ανάπτυξη υπηρεσιών που λειτουργούν περισσότερο ή λιγότερο αποτελεσματικά και εύκολα μεταξύ των γλωσσών.

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

Σύστημα διαχείρισης διαμόρφωσης δικτύου φιλτραρίσματος QratorΥπάρχουν και άλλες επιλογές, όπως το protobuf / gRPC, ωστόσο, όταν ξεκινήσαμε το έργο μας, το gRPC ήταν αρκετά καινούργιο και δεν τολμούσαμε να το λάβουμε υπόψη.

Φυσικά, θα μπορούσαμε (και μάλιστα θα έπρεπε) να φτιάξουμε το δικό μας ποδήλατο. Θα ήταν ευκολότερο να δημιουργήσουμε ένα πρωτόκολλο για αυτό που χρειαζόμαστε, επειδή η αρχιτεκτονική πελάτη-διακομιστή είναι σχετικά απλή στην εφαρμογή σε σύγκριση με την κατασκευή ενός δρομολογητή στο Thrift. Με τον ένα ή τον άλλο τρόπο, υπάρχει μια παραδοσιακή προκατάληψη προς τα αυτογραφόμενα πρωτόκολλα και τις υλοποιήσεις δημοφιλών βιβλιοθηκών (για καλό λόγο), επιπλέον, κατά τη διάρκεια των συζητήσεων τίθεται πάντα το ερώτημα: "Πώς θα το μεταφέρουμε αυτό σε άλλες γλώσσες;" Έτσι πετάξαμε αμέσως την ιδέα ενός ποδηλάτου.

Το Msgpack είναι παρόμοιο με το JSON, αλλά πιο γρήγορο και μικρότερο. Είναι μια δυαδική μορφή σειριοποίησης δεδομένων που επιτρέπει την ανταλλαγή δεδομένων μεταξύ πολλών γλωσσών.

Στο πρώτο επίπεδο έχουμε το Thrift με τις ελάχιστες πληροφορίες που απαιτούνται για να προωθήσει το μήνυμα ο δρομολογητής. Στο δεύτερο επίπεδο υπάρχουν συσκευασμένες δομές msgpack.

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

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

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

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

Για παράδειγμα:

---
selector: "[@][[email protected]._meta.version == `42`] | items([0].fft_config || `{}`)"
destination_filename: "fft/{{ match[0] }}.json"
file_mode: 0644
reload_daemons: [fft] ...
{{ dict(match[1]) | json(indent=2, sort_keys=True) }}

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

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

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

Ευχαριστώ για τη βοήθειά σας στη συγγραφή του υλικού. VolanDamrod, Serenheit, Μη.

αγγλική έκδοση Θέση.

Πηγή: www.habr.com

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