Έχουμε ήδη μιλήσει για
Ενδιαφέρων? Μετά ρωτάω κάτω από το κόψιμο, θα τα πούμε και θα τα δείξουμε όλα.
Ας ξεκινήσουμε με ένα παράδειγμα
Θα καλύψουμε μόνο ένα μέρος της λειτουργικότητας του ρόλου μας. Μπορείτε πάντα να βρείτε μια πλήρη περιγραφή όλων των δυνατοτήτων και των παραμέτρων εισαγωγής στο
Το Tarantool Cartridge έχει api
и storage
που μπορούν να αντιστοιχιστούν σε περιπτώσεις.
Το ίδιο το Cartridge δεν λέει τίποτα σχετικά με τον τρόπο εκκίνησης των διεργασιών, παρέχει μόνο τη δυνατότητα διαμόρφωσης παρουσιών που ήδη εκτελούνται. Ο χρήστης πρέπει να κάνει τα υπόλοιπα μόνος του: να αποσυνθέσει τα αρχεία ρυθμίσεων, να ξεκινήσει τις υπηρεσίες και να ρυθμίσει την τοπολογία. Αλλά δεν θα τα κάνουμε όλα αυτά, ο Ansible θα τα κάνει για εμάς.
Από τα λόγια στις πράξεις
Λοιπόν, ας αναπτύξουμε την εφαρμογή μας σε δύο εικονικές μηχανές και ας ρυθμίσουμε μια απλή τοπολογία:
- Replicaset
app-1
θα παίξει το ρόλοapi
που περιλαμβάνει τον ρόλοvshard-router
. Θα υπάρχει μόνο ένα παράδειγμα εδώ. - αντίγραφο
storage-1
υλοποιεί το ρόλοstorage
(και ταυτόχροναvshard-storage
), εδώ προσθέτουμε δύο στιγμιότυπα από διαφορετικά μηχανήματα.
Για να εκτελέσουμε το παράδειγμα, χρειαζόμαστε
Ο ίδιος ο ρόλος είναι
Κλωνοποιήστε το αποθετήριο με ένα παράδειγμα:
$ 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
Περιμένουμε το τέλος της εκτέλεσης του βιβλίου παιχνιδιού, μεταβείτε στο
Μπορείτε να ρίξετε δεδομένα. 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
Δεν θα επαναπαυθούμε στις δάφνες μας και θα κατακτήσουμε τον έλεγχο της τοπολογίας.
Διαχείριση τοπολογίας
Ας συγχωνεύσουμε τις νέες μας παρουσίες σε ένα 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
.
Ας αξιολογήσουμε το αποτέλεσμα των προσπαθειών μας. Εύρεση νέου συνόλου αντιγράφων
Ζήτω!
Πειραματιστείτε με την αναδιαμόρφωση παρουσιών και συνόλων αντιγραφής και δείτε πώς αλλάζει η τοπολογία του συμπλέγματος. Μπορείτε να δοκιμάσετε διαφορετικά επιχειρησιακά σενάρια, για παράδειγμα, 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
και εκτελέστε όλους τους απαραίτητους χειρισμούς με τη μονάδα Luacartridge
.
Το κύριο καθήκον της εφεύρεσής μας είναι να το κάνουμε αυτό, το πιο δύσκολο κομμάτι της δουλειάς για εσάς.
Το Ansible σάς επιτρέπει να γράψετε τη δική σας ενότητα και να τη χρησιμοποιήσετε σε ρόλο. Ο ρόλος μας χρησιμοποιεί αυτές τις ενότητες για τη διαχείριση των διαφόρων στοιχείων του συμπλέγματος.
Πως δουλεύει? Περιγράφετε την επιθυμητή κατάσταση του συμπλέγματος σε μια δηλωτική διαμόρφωση και ο ρόλος δίνει σε κάθε λειτουργική μονάδα την ενότητα διαμόρφωσής της ως είσοδο. Η μονάδα λαμβάνει την τρέχουσα κατάσταση του συμπλέγματος και τη συγκρίνει με την είσοδο. Στη συνέχεια, ένας κώδικας εκτελείται μέσω της υποδοχής μιας από τις παρουσίες, που φέρνει το σύμπλεγμα στην επιθυμητή κατάσταση.
Αποτελέσματα της
Σήμερα είπαμε και δείξαμε πώς να αναπτύξετε την εφαρμογή σας στο Tarantool Cartridge και να ρυθμίσετε μια απλή τοπολογία. Για να γίνει αυτό, χρησιμοποιήσαμε το Ansible, ένα ισχυρό εργαλείο που είναι εύκολο στη χρήση και σας επιτρέπει να διαμορφώνετε ταυτόχρονα πολλούς κόμβους υποδομής (στην περίπτωσή μας, πρόκειται για στιγμιότυπα συμπλέγματος).
Παραπάνω, ασχοληθήκαμε με έναν από τους πολλούς τρόπους περιγραφής της διαμόρφωσης συμπλέγματος χρησιμοποιώντας το Ansible. Μόλις καταλάβετε ότι είστε έτοιμοι να προχωρήσετε, μάθετε group_vars
и host_vars
.
Πολύ σύντομα θα σας πούμε πώς να αφαιρέσετε μόνιμα (αποβάλετε) παρουσίες από την τοπολογία, να κάνετε bootstrap vshard, να διαχειριστείτε τη λειτουργία αυτόματης ανακατεύθυνσης, να διαμορφώσετε την εξουσιοδότηση και να επιδιορθώσετε τη διαμόρφωση συμπλέγματος. Στο μεταξύ, μπορείτε να μελετήσετε μόνοι σας
Εάν κάτι δεν λειτουργεί, να είστε σίγουροι
Πηγή: www.habr.com