Ανάπτυξη εφαρμογών Εύκολα και Φυσικά στο Tarantool Cartridge (Μέρος 1)

Ανάπτυξη εφαρμογών Εύκολα και Φυσικά στο Tarantool Cartridge (Μέρος 1)

Έχουμε ήδη μιλήσει για Φυσίγγιο Tarantool, το οποίο σας επιτρέπει να αναπτύσσετε κατανεμημένες εφαρμογές και να τις πακετάρετε. Δεν υπάρχει τίποτα άλλο: μάθετε πώς να αναπτύσσετε και να διαχειρίζεστε αυτές τις εφαρμογές. Μην ανησυχείτε, τα έχουμε σκεφτεί όλα! Συγκεντρώσαμε όλες τις βέλτιστες πρακτικές για την εργασία με το Tarantool Cartridge και γράψαμε άξιος-ρόλος, το οποίο θα αποσυνθέσει το πακέτο σε διακομιστές, θα ξεκινήσει τις παρουσίες, θα τις συνδυάσει σε ένα σύμπλεγμα, θα ρυθμίσει την εξουσιοδότηση, θα εκκινήσει το vshard, θα ενεργοποιήσει την αυτόματη ανακατεύθυνση και θα διορθώσει τη διαμόρφωση του συμπλέγματος.

Ενδιαφέρων? Μετά ρωτάω κάτω από το κόψιμο, θα τα πούμε και θα τα δείξουμε όλα.

Ας ξεκινήσουμε με ένα παράδειγμα

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

Το Tarantool Cartridge έχει φροντιστήριο για να δημιουργήσετε μια μικρή εφαρμογή Cartridge που αποθηκεύει πληροφορίες σχετικά με πελάτες τραπεζών και τους λογαριασμούς τους και παρέχει επίσης ένα API για τη διαχείριση δεδομένων μέσω HTTP. Για να γίνει αυτό, η εφαρμογή περιγράφει δύο πιθανούς ρόλους: api и storageπου μπορούν να αντιστοιχιστούν σε περιπτώσεις.

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

Από τα λόγια στις πράξεις

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

  • Replicaset app-1 θα παίξει το ρόλο apiπου περιλαμβάνει τον ρόλο vshard-router. Θα υπάρχει μόνο ένα παράδειγμα εδώ.
  • αντίγραφο storage-1 υλοποιεί το ρόλο storage (και ταυτόχρονα vshard-storage), εδώ προσθέτουμε δύο στιγμιότυπα από διαφορετικά μηχανήματα.

Ανάπτυξη εφαρμογών Εύκολα και Φυσικά στο Tarantool Cartridge (Μέρος 1)

Για να εκτελέσουμε το παράδειγμα, χρειαζόμαστε Απαγορεύεται и Πιθανό (έκδοση 2.8 ή νεότερη).

Ο ίδιος ο ρόλος είναι Αβίαστος γαλαξίας. Αυτό είναι ένα αποθετήριο που σας επιτρέπει να μοιραστείτε την εργασία σας και να χρησιμοποιήσετε έτοιμους ρόλους.

Κλωνοποιήστε το αποθετήριο με ένα παράδειγμα:

$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0

Αναπτύσσουμε εικονικές μηχανές:

$ vagrant up

Εγκαταστήστε το ρόλο του Tarantool Cartridge:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Εκτελέστε τον εγκατεστημένο ρόλο:

$ ansible-playbook -i hosts.yml playbook.yml

Περιμένουμε το τέλος της εκτέλεσης του βιβλίου παιχνιδιού, μεταβείτε στο http://localhost:8181/admin/cluster/dashboard και απολαύστε το αποτέλεσμα:

Ανάπτυξη εφαρμογών Εύκολα και Φυσικά στο Tarantool Cartridge (Μέρος 1)

Μπορείτε να ρίξετε δεδομένα. Cool, σωστά;

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

Αρχίζουμε να καταλαβαίνουμε

Λοιπόν τι έγινε?

Δημιουργήσαμε δύο εικονικά μηχανήματα και λειτουργήσαμε ένα βιβλίο που δημιούργησε το σύμπλεγμα μας. Ας δούμε τα περιεχόμενα του αρχείου playbook.yml:

---
- name: Deploy my Tarantool Cartridge app
  hosts: all
  become: true
  become_user: root
  tasks:
  - name: Import Tarantool Cartridge role
    import_role:
      name: tarantool.cartridge

Δεν συμβαίνει τίποτα ενδιαφέρον εδώ, ξεκινάμε το ansible-role, που ονομάζεται tarantool.cartridge.

Όλα τα πιο σημαντικά (δηλαδή, η διαμόρφωση του συμπλέγματος) βρίσκονται στο απογραφή-αρχείο hosts.yml:

---
all:
  vars:
    # common cluster variables
    cartridge_app_name: getting-started-app
    cartridge_package_path: ./getting-started-app-1.0.0-0.rpm  # path to package

    cartridge_cluster_cookie: app-default-cookie  # cluster cookie

    # common ssh options
    ansible_ssh_private_key_file: ~/.vagrant.d/insecure_private_key
    ansible_ssh_common_args: '-o IdentitiesOnly=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

  # INSTANCES
  hosts:
    storage-1:
      config:
        advertise_uri: '172.19.0.2:3301'
        http_port: 8181

    app-1:
      config:
        advertise_uri: '172.19.0.3:3301'
        http_port: 8182

    storage-1-replica:
      config:
        advertise_uri: '172.19.0.3:3302'
        http_port: 8183

  children:
    # GROUP INSTANCES BY MACHINES
    host1:
      vars:
        # first machine connection options
        ansible_host: 172.19.0.2
        ansible_user: vagrant

      hosts:  # instances to be started on the first machine
        storage-1:

    host2:
      vars:
        # second machine connection options
        ansible_host: 172.19.0.3
        ansible_user: vagrant

      hosts:  # instances to be started on the second machine
        app-1:
        storage-1-replica:

    # GROUP INSTANCES BY REPLICA SETS
    replicaset_app_1:
      vars:  # replica set configuration
        replicaset_alias: app-1
        failover_priority:
          - app-1  # leader
        roles:
          - 'api'

      hosts:  # replica set instances
        app-1:

    replicaset_storage_1:
      vars:  # replica set configuration
        replicaset_alias: storage-1
        weight: 3
        failover_priority:
          - storage-1  # leader
          - storage-1-replica
        roles:
          - 'storage'

      hosts:   # replica set instances
        storage-1:
        storage-1-replica:

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

Διαχείριση περιπτώσεων

Από την άποψη του Ansible, κάθε στιγμιότυπο είναι ένας κεντρικός υπολογιστής (δεν πρέπει να συγχέεται με έναν διακομιστή σιδήρου), π.χ. τον κόμβο υποδομής που θα διαχειριστεί η Ansible. Για κάθε κεντρικό υπολογιστή, μπορούμε να καθορίσουμε παραμέτρους σύνδεσης (όπως π ansible_host и ansible_user), καθώς και τη διαμόρφωση του στιγμιότυπου. Η περιγραφή των περιπτώσεων βρίσκεται στην ενότητα hosts.

Εξετάστε τη διαμόρφωση του στιγμιότυπου storage-1:

all:
  vars:
    ...

  # INSTANCES
  hosts:
    storage-1:
      config:
        advertise_uri: '172.19.0.2:3301'
        http_port: 8181

  ...

Σε μια μεταβλητή config καθορίσαμε τις παραμέτρους του στιγμιότυπου - advertise URI и HTTP port.
Παρακάτω είναι οι παράμετροι του στιγμιότυπου app-1 и storage-1-replica.

Πρέπει να πούμε στο Ansible τις παραμέτρους σύνδεσης για κάθε περίπτωση. Φαίνεται λογικό να ομαδοποιούνται οι παρουσίες σε ομάδες εικονικών μηχανών. Για να γίνει αυτό, οι περιπτώσεις συνδυάζονται σε ομάδες. host1 и host2, και σε κάθε ομάδα στην ενότητα vars αξίες ansible_host и ansible_user για μια εικονική μηχανή. Και στην ενότητα hosts - οικοδεσπότες (είναι περιπτώσεις) που περιλαμβάνονται σε αυτήν την ομάδα:

all:
  vars:
    ...
  hosts:
    ...
  children:
    # GROUP INSTANCES BY MACHINES
    host1:
      vars:
        # first machine connection options
        ansible_host: 172.19.0.2
        ansible_user: vagrant
       hosts:  # instances to be started on the first machine
        storage-1:

     host2:
      vars:
        # second machine connection options
        ansible_host: 172.19.0.3
        ansible_user: vagrant
       hosts:  # instances to be started on the second machine
        app-1:
        storage-1-replica:

Αρχίζουμε να αλλάζουμε hosts.yml. Ας προσθέσουμε δύο ακόμη περιπτώσεις, storage-2-replica στην πρώτη εικονική μηχανή και storage-2 Στο δεύτερο:

all:
  vars:
    ...

  # INSTANCES
  hosts:
    ...
    storage-2:  # <==
      config:
        advertise_uri: '172.19.0.3:3303'
        http_port: 8184

    storage-2-replica:  # <==
      config:
        advertise_uri: '172.19.0.2:3302'
        http_port: 8185

  children:
    # GROUP INSTANCES BY MACHINES
    host1:
      vars:
        ...
      hosts:  # instances to be started on the first machine
        storage-1:
        storage-2-replica:  # <==

    host2:
      vars:
        ...
      hosts:  # instances to be started on the second machine
        app-1:
        storage-1-replica:
        storage-2:  # <==
  ...

Εκτέλεση ansible playbook:

$ ansible-playbook -i hosts.yml 
                   --limit storage-2,storage-2-replica 
                   playbook.yml

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

Επιστροφή στη διεπαφή χρήστη Web http://localhost:8181/admin/cluster/dashboard και παρατηρήστε τα νέα μας περιστατικά:

Ανάπτυξη εφαρμογών Εύκολα και Φυσικά στο Tarantool Cartridge (Μέρος 1)

Δεν θα επαναπαυθούμε στις δάφνες μας και θα κατακτήσουμε τον έλεγχο της τοπολογίας.

Διαχείριση τοπολογίας

Ας συγχωνεύσουμε τις νέες μας παρουσίες σε ένα replicaset storage-2. Προσθήκη νέας ομάδας replicaset_storage_2 και να περιγράψει στις μεταβλητές του τις παραμέτρους του συνόλου αντιγραφής κατ' αναλογία με replicaset_storage_1. Στο τμήμα hosts καθορίστε ποιες παρουσίες θα συμπεριληφθούν σε αυτήν την ομάδα (δηλαδή, το σύνολο αντιγράφων μας):

---
all:
  vars:
    ...
  hosts:
    ...
  children:
    ...
    # GROUP INSTANCES BY REPLICA SETS
    ...
    replicaset_storage_2:  # <==
      vars:  # replicaset configuration
        replicaset_alias: storage-2
        weight: 2
        failover_priority:
          - storage-2
          - storage-2-replica
        roles:
          - 'storage'

      hosts:   # replicaset instances
        storage-2:
        storage-2-replica:

Ας ξεκινήσουμε πάλι το playbook:

$ ansible-playbook -i hosts.yml 
                   --limit replicaset_storage_2 
                   --tags cartridge-replicasets 
                   playbook.yml

Ανά επιλογή --limit αυτή τη φορά περάσαμε το όνομα της ομάδας που αντιστοιχεί στο replicaset μας.

Εξετάστε την επιλογή tags.

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

  • cartridge-instances: διαχείριση παρουσίας (διαμόρφωση, σύνδεση με τη συνδρομή).
  • cartridge-replicasets: διαχείριση τοπολογίας (διαχείριση συνόλων αντιγραφής και μόνιμη αφαίρεση (αποβολή) παρουσιών από το σύμπλεγμα).
  • cartridge-config: διαχείριση άλλων παραμέτρων συμπλέγματος (vshard bootstrapping, αυτόματη λειτουργία ανακατεύθυνσης, παραμέτρους εξουσιοδότησης και διαμόρφωση εφαρμογής).

Μπορούμε να καθορίσουμε ρητά ποιο μέρος της εργασίας θέλουμε να κάνουμε, τότε ο ρόλος θα παρακάμψει τις υπόλοιπες εργασίες. Στην περίπτωσή μας, θέλουμε να δουλέψουμε μόνο με την τοπολογία, έτσι προσδιορίσαμε cartridge-replicasets.

Ας αξιολογήσουμε το αποτέλεσμα των προσπαθειών μας. Εύρεση νέου συνόλου αντιγράφων http://localhost:8181/admin/cluster/dashboard.

Ανάπτυξη εφαρμογών Εύκολα και Φυσικά στο Tarantool Cartridge (Μέρος 1)

Ζήτω!

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

Μην ξεχάσετε να τρέξετε vagrant haltγια να σταματήσετε τα VM όταν τελειώσετε με αυτά.

Και τι υπάρχει κάτω από την κουκούλα;

Εδώ θα μιλήσω περισσότερο για το τι συνέβη κάτω από την κουκούλα του ansible ρόλο κατά τη διάρκεια των πειραμάτων μας.

Ας ρίξουμε μια ματιά στην ανάπτυξη μιας εφαρμογής Cartridge βήμα προς βήμα.

Εγκατάσταση του πακέτου και εκκίνηση παρουσιών

Πρώτα πρέπει να παραδώσετε το πακέτο στον διακομιστή και να το εγκαταστήσετε. Τώρα ο ρόλος μπορεί να λειτουργήσει με πακέτα RPM και DEB.

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

$ systemctl start myapp@storage-1

Αυτή η εντολή θα ξεκινήσει την παρουσία storage-1 εφαρμογές myapp. Το εκκινημένο παράδειγμα θα το αναζητήσει διαμόρφωση в /etc/tarantool/conf.d/. Τα αρχεία καταγραφής παρουσιών μπορούν να προβληθούν χρησιμοποιώντας journald.

Αρχείο μονάδας /etc/systemd/system/[email protected] για μια υπηρεσία systemd θα παραδοθεί μαζί με το πακέτο.

Το Ansible έχει ενσωματωμένες μονάδες για την εγκατάσταση πακέτων και τη διαχείριση υπηρεσιών systemd, δεν έχουμε εφεύρει τίποτα νέο εδώ.

Διαμόρφωση της τοπολογίας συμπλέγματος

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

Μπορείτε να ρυθμίσετε το σύμπλεγμα με μη αυτόματο τρόπο:

  • Η πρώτη επιλογή: ανοίξτε το Web UI και κάντε κλικ στα κουμπιά. Για μια εφάπαξ έναρξη πολλών περιπτώσεων, είναι αρκετά κατάλληλο.
  • Δεύτερη επιλογή: μπορείτε να χρησιμοποιήσετε το GraphQl API. Εδώ μπορείτε ήδη να αυτοματοποιήσετε κάτι, για παράδειγμα, να γράψετε ένα σενάριο στην Python.
  • Η τρίτη επιλογή (για τους δυνατούς στο πνεύμα): μεταβείτε στον διακομιστή, συνδεθείτε σε μία από τις περιπτώσεις χρησιμοποιώντας tarantoolctl connect και εκτελέστε όλους τους απαραίτητους χειρισμούς με τη μονάδα Lua cartridge.

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

Το Ansible σάς επιτρέπει να γράψετε τη δική σας ενότητα και να τη χρησιμοποιήσετε σε ρόλο. Ο ρόλος μας χρησιμοποιεί αυτές τις ενότητες για τη διαχείριση των διαφόρων στοιχείων του συμπλέγματος.

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

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

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

Παραπάνω, ασχοληθήκαμε με έναν από τους πολλούς τρόπους περιγραφής της διαμόρφωσης συμπλέγματος χρησιμοποιώντας το Ansible. Μόλις καταλάβετε ότι είστε έτοιμοι να προχωρήσετε, μάθετε βέλτιστες πρακτικές για τη συγγραφή βιβλίων. Ίσως σας φανεί πιο βολικό να διαχειριστείτε την τοπολογία με group_vars и host_vars.

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

Εάν κάτι δεν λειτουργεί, να είστε σίγουροι πληροφορώ μας για το πρόβλημα. Θα το αναλύσουμε γρήγορα!

Πηγή: www.habr.com

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