Αρχιτεκτονική και δυνατότητες του Tarantool Data Grid

Αρχιτεκτονική και δυνατότητες του Tarantool Data Grid

Το 2017, κερδίσαμε έναν διαγωνισμό για την ανάπτυξη του συναλλακτικού πυρήνα της επενδυτικής δραστηριότητας της Alfa-Bank και ξεκινήσαμε να εργαζόμαστε (στο HighLoad++ 2018 με μια αναφορά στον πυρήνα της επενδυτικής δραστηριότητας εκτελούνται Vladimir Drynkin, επικεφαλής του συναλλακτικού πυρήνα της επενδυτικής δραστηριότητας της Alfa Bank). Αυτό το σύστημα έπρεπε να συγκεντρώνει δεδομένα συναλλαγών από διαφορετικές πηγές σε διάφορες μορφές, να φέρνει τα δεδομένα σε ενοποιημένη μορφή, να τα αποθηκεύει και να παρέχει πρόσβαση σε αυτά.

Κατά τη διαδικασία ανάπτυξης, το σύστημα εξελίχθηκε και απέκτησε λειτουργικότητα, και κάποια στιγμή συνειδητοποιήσαμε ότι αποκρυσταλλώναμε κάτι πολύ περισσότερο από ένα απλό λογισμικό εφαρμογών που δημιουργήθηκε για να λύσει ένα αυστηρά καθορισμένο φάσμα εργασιών: τα καταφέραμε σύστημα για την κατασκευή κατανεμημένων εφαρμογών με μόνιμη αποθήκευση. Η εμπειρία που αποκτήσαμε αποτέλεσε τη βάση ενός νέου προϊόντος - Πλέγμα δεδομένων Tarantool (TDG).

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

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

Αρχιτεκτονική και δυνατότητες του Tarantool Data Grid

Connector

Ο Connector είναι υπεύθυνος για την επικοινωνία με τον έξω κόσμο. Το καθήκον του είναι να αποδεχτεί το αίτημα, να το αναλύσει και αν αυτό πετύχει, τότε να στείλει τα δεδομένα για επεξεργασία στον επεξεργαστή εισόδου. Υποστηρίζουμε μορφές HTTP, SOAP, Kafka, FIX. Η αρχιτεκτονική σάς επιτρέπει να προσθέτετε απλώς υποστήριξη για νέες μορφές, με την υποστήριξη για το IBM MQ σύντομα. Εάν η ανάλυση του αιτήματος απέτυχε, η εφαρμογή σύνδεσης θα εμφανίσει ένα σφάλμα. Διαφορετικά, θα απαντήσει ότι το αίτημα διεκπεραιώθηκε με επιτυχία, ακόμη και αν παρουσιάστηκε σφάλμα κατά την περαιτέρω επεξεργασία του. Αυτό έγινε ειδικά για να δουλέψουμε με συστήματα που δεν ξέρουν πώς να επαναλαμβάνουν αιτήματα - ή, αντίθετα, το κάνουν πολύ επίμονα. Για να μην χαθούν δεδομένα, χρησιμοποιείται μια ουρά επισκευής: το αντικείμενο πρώτα μπαίνει σε αυτό και μόνο μετά την επιτυχή επεξεργασία αφαιρείται από αυτό. Ο διαχειριστής μπορεί να λάβει ειδοποιήσεις σχετικά με αντικείμενα που παραμένουν στην ουρά επισκευής και αφού εξαλείψει ένα σφάλμα λογισμικού ή μια αποτυχία υλικού, δοκιμάστε ξανά.

Επεξεργαστής εισόδου

Ο επεξεργαστής εισόδου ταξινομεί τα δεδομένα που λαμβάνονται σύμφωνα με χαρακτηριστικά γνωρίσματα και καλεί κατάλληλους επεξεργαστές. Οι χειριστές είναι κώδικας Lua που εκτελείται σε ένα sandbox, επομένως δεν μπορούν να επηρεάσουν τη λειτουργία του συστήματος. Σε αυτό το στάδιο, τα δεδομένα μπορούν να μειωθούν στην απαιτούμενη μορφή και, εάν είναι απαραίτητο, μπορεί να ξεκινήσει ένας αυθαίρετος αριθμός εργασιών που μπορούν να εφαρμόσουν την απαραίτητη λογική. Για παράδειγμα, στο προϊόν MDM (Master Data Management) που είναι χτισμένο στο Tarantool Data Grid, όταν προσθέτουμε έναν νέο χρήστη, για να μην επιβραδύνουμε την επεξεργασία του αιτήματος, ξεκινάμε τη δημιουργία μιας χρυσής εγγραφής ως ξεχωριστή εργασία. Το sandbox υποστηρίζει αιτήματα για ανάγνωση, αλλαγή και προσθήκη δεδομένων, σας επιτρέπει να εκτελέσετε κάποια λειτουργία σε όλους τους ρόλους του τύπου αποθήκευσης και τη συγκέντρωση του αποτελέσματος (χάρτης/μείωση).

Οι χειριστές μπορούν να περιγραφούν σε αρχεία:

sum.lua

local x, y = unpack(...)
return x + y

Και μετά, δηλώθηκε στη διαμόρφωση:

functions:
  sum: { __file: sum.lua }

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

Αποθηκευτικός χώρος

Ο χώρος αποθήκευσης αποθηκεύει μόνιμα δεδομένα. Πριν την αποθήκευση, τα δεδομένα επικυρώνονται σε σχέση με το σχήμα δεδομένων. Για να περιγράψουμε το κύκλωμα χρησιμοποιούμε μια εκτεταμένη μορφή Apache Avro. Ένα παράδειγμα:

{
    "name": "User",
    "type": "record",
    "logicalType": "Aggregate",
    "fields": [ 
        { "name": "id", "type": "string"}, 
        {"name": "first_name", "type": "string"}, 
        {"name": "last_name", "type": "string"} 
    ], 
    "indexes": ["id"] 
}

Με βάση αυτήν την περιγραφή, το DDL (Γλώσσα ορισμού δεδομένων) δημιουργείται αυτόματα για το Tarantula DBMS και GraphQL σχήμα για πρόσβαση σε δεδομένα.

Υποστηρίζεται η ασύγχρονη αναπαραγωγή δεδομένων (υπάρχουν σχέδια για προσθήκη σύγχρονης).

Επεξεργαστής εξόδου

Μερικές φορές είναι απαραίτητο να ειδοποιούνται οι εξωτερικοί καταναλωτές για την άφιξη νέων δεδομένων· για το σκοπό αυτό, υπάρχει ο ρόλος του επεξεργαστή εξόδου. Αφού αποθηκευτούν τα δεδομένα, μπορούν να περάσουν στον αντίστοιχο χειριστή (για παράδειγμα, για να τα φέρει στη φόρμα που απαιτείται από τον καταναλωτή) - και στη συνέχεια να περάσει στην υποδοχή για αποστολή. Μια ουρά επιδιόρθωσης χρησιμοποιείται επίσης εδώ: εάν κανείς δεν αποδέχτηκε το αντικείμενο, ο διαχειριστής μπορεί να προσπαθήσει ξανά αργότερα.

Κλιμάκωση

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

Ιδιότητες δεδομένων

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

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

εργασίες

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

Αρχιτεκτονική και δυνατότητες του Tarantool Data Grid

Εδώ βλέπουμε έναν άλλο ρόλο - δρομέα. Αυτός ο ρόλος είναι ανιθαγενής και πρόσθετες παρουσίες εφαρμογής με αυτόν τον ρόλο μπορούν να προστεθούν στο σύμπλεγμα, όπως απαιτείται. Η ευθύνη του δρομέα είναι να ολοκληρώσει τις εργασίες. Όπως αναφέρθηκε, είναι δυνατή η δημιουργία νέων εργασιών από το sandbox. αποθηκεύονται σε μια ουρά στην αποθήκευση και στη συνέχεια εκτελούνται στο runner. Αυτός ο τύπος εργασίας ονομάζεται Job. Έχουμε επίσης έναν τύπο εργασίας που ονομάζεται Εργασία - αυτές είναι εργασίες που καθορίζονται από το χρήστη που εκτελούνται βάσει χρονοδιαγράμματος (χρησιμοποιώντας σύνταξη cron) ή κατά παραγγελία. Για την εκκίνηση και την παρακολούθηση τέτοιων εργασιών, έχουμε έναν βολικό διαχειριστή εργασιών. Για να είναι διαθέσιμη αυτή η λειτουργία, πρέπει να ενεργοποιήσετε τον ρόλο του προγραμματιστή. αυτός ο ρόλος έχει κατάσταση, άρα δεν κλιμακώνεται, κάτι που όμως δεν απαιτείται. Ταυτόχρονα, όπως όλοι οι άλλοι ρόλοι, μπορεί να έχει ένα αντίγραφο που αρχίζει να λειτουργεί εάν ο κύριος αρνηθεί ξαφνικά.

Καταγραφέας

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

Υπηρεσίες

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

Η υπηρεσία περιγράφεται στο αρχείο διαμόρφωσης:

services:
   sum:
      doc: "adds two numbers"
      function: sum
      return_type: int
      args:
         x: int
         y: int

Το GraphQL API δημιουργείται αυτόματα και η υπηρεσία γίνεται διαθέσιμη για κλήση:

query {
   sum(x: 1, y: 2) 
}

Αυτό θα καλέσει τον χειριστή sumπου θα επιστρέψει το αποτέλεσμα:

3

Ερωτήματα προφίλ και μετρήσεις

Για να κατανοήσουμε τη λειτουργία του συστήματος και τα αιτήματα δημιουργίας προφίλ, εφαρμόσαμε υποστήριξη για το πρωτόκολλο OpenTracing. Το σύστημα μπορεί να στείλει πληροφορίες κατόπιν ζήτησης σε εργαλεία που υποστηρίζουν αυτό το πρωτόκολλο, όπως το Zipkin, το οποίο θα σας επιτρέψει να κατανοήσετε πώς εκτελέστηκε το αίτημα:

Αρχιτεκτονική και δυνατότητες του Tarantool Data Grid

Φυσικά, το σύστημα παρέχει εσωτερικές μετρήσεις που μπορούν να συλλεχθούν χρησιμοποιώντας το Prometheus και να οπτικοποιηθούν χρησιμοποιώντας το Grafana.

Αναπτύσσω

Το Tarantool Data Grid μπορεί να αναπτυχθεί από πακέτα RPM ή ένα αρχείο, χρησιμοποιώντας ένα βοηθητικό πρόγραμμα από τη διανομή ή το Ansible, υπάρχει επίσης υποστήριξη για Kubernetes (Χειριστής Tarantool Kubernetes).

Η εφαρμογή που υλοποιεί την επιχειρηματική λογική (διαμόρφωση, χειριστές) φορτώνεται στο αναπτυγμένο σύμπλεγμα Tarantool Data Grid με τη μορφή αρχείου μέσω του UI ή χρησιμοποιώντας ένα σενάριο μέσω του API που παρέχεται από εμάς.

Πρωταγωνιστές της φιλοσοφίας

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

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

  1. Τα ρομπότ που συλλέγουν πληροφορίες από ανοιχτές πηγές θα είναι οι πηγές δεδομένων μας. Μπορείτε να λύσετε αυτό το πρόβλημα χρησιμοποιώντας έτοιμες λύσεις ή γράφοντας κώδικα σε οποιαδήποτε γλώσσα.
  2. Στη συνέχεια, το Tarantool Data Grid θα αποδεχτεί και θα αποθηκεύσει τα δεδομένα. Εάν η μορφή δεδομένων από διαφορετικές πηγές είναι διαφορετική, τότε μπορείτε να γράψετε κώδικα στο Lua που θα πραγματοποιήσει τη μετατροπή σε μία ενιαία μορφή. Στο στάδιο της προεπεξεργασίας, θα μπορείτε επίσης, για παράδειγμα, να φιλτράρετε διπλές προσφορές ή να ενημερώνετε επιπλέον πληροφορίες σχετικά με πράκτορες που εργάζονται στην αγορά στη βάση δεδομένων.
  3. Τώρα έχετε ήδη μια επεκτάσιμη λύση σε ένα σύμπλεγμα που μπορεί να γεμίσει με δεδομένα και να κάνει επιλογές δεδομένων. Στη συνέχεια, μπορείτε να εφαρμόσετε νέα λειτουργικότητα, για παράδειγμα, να γράψετε μια υπηρεσία που θα κάνει αίτημα για δεδομένα και θα δίνει την πιο συμφέρουσα προσφορά ανά ημέρα - αυτό θα απαιτήσει μερικές γραμμές στο αρχείο διαμόρφωσης και λίγο κωδικό Lua.

Ποιο είναι το επόμενο;

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

Δίνουμε επίσης μεγάλη προσοχή σε θέματα ασφάλειας. Αυτήν τη στιγμή υποβάλλονται σε πιστοποίηση από την FSTEC της Ρωσίας για να επιβεβαιώσουμε το υψηλό επίπεδο ασφάλειας και να πληρούμε τις απαιτήσεις για πιστοποίηση προϊόντων λογισμικού που χρησιμοποιούνται σε συστήματα πληροφοριών προσωπικών δεδομένων και κυβερνητικά συστήματα πληροφοριών.

Πηγή: www.habr.com

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