Kami telah pun berbincang
Menarik? Kemudian saya bertanya di bawah potongan, kami akan memberitahu dan menunjukkan segala-galanya.
Mari kita mulakan dengan contoh
Kami akan meliputi hanya sebahagian daripada fungsi peranan kami. Anda sentiasa boleh mencari penerangan lengkap semua ciri dan parameter inputnya pada bila-bila masa
Tarantool Cartridge mempunyai api
ΠΈ storage
yang boleh diberikan kepada kejadian.
Kartrij sendiri tidak mengatakan apa-apa tentang cara memulakan proses, ia hanya menyediakan keupayaan untuk mengkonfigurasi keadaan yang sudah berjalan. Pengguna mesti melakukan selebihnya sendiri: menguraikan fail konfigurasi, memulakan perkhidmatan dan menyediakan topologi. Tetapi kami tidak akan melakukan semua ini, Ansible akan melakukannya untuk kami.
Dari perkataan kepada perbuatan
Jadi, mari gunakan aplikasi kami ke dua mesin maya dan sediakan topologi mudah:
- Replikaset
app-1
akan memainkan perananapi
yang merangkumi perananvshard-router
. Hanya akan ada satu contoh di sini. - replikat
storage-1
melaksanakan perananstorage
(dan pada masa yang samavshard-storage
), di sini kami menambah dua contoh daripada mesin yang berbeza.
Untuk menjalankan contoh, kita perlukan
Peranan itu sendiri adalah
Klon repositori dengan contoh:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Kami meningkatkan mesin maya:
$ vagrant up
Pasang peranan ansible Tarantool Cartridge:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Jalankan peranan yang dipasang:
$ ansible-playbook -i hosts.yml playbook.yml
Kami sedang menunggu penghujung pelaksanaan buku permainan, pergi ke
Anda boleh mencurahkan data. Sejuk kan?
Sekarang mari kita fikirkan cara untuk bekerja dengan ini, dan pada masa yang sama menambah set replika lain pada topologi.
Kita mula faham
Jadi apa yang berlaku?
Kami menyediakan dua VM dan menjalankan buku main yang boleh digunakan yang menyediakan kluster kami. Mari lihat kandungan fail tersebut 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
Tiada apa-apa yang menarik berlaku di sini, kami memulakan peranan ansible, yang dipanggil tarantool.cartridge
.
Semua yang paling penting (iaitu, konfigurasi kluster) terletak di 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:
Apa yang kita perlukan ialah mempelajari cara mengurus kejadian dan replika dengan menukar kandungan fail ini. Seterusnya, kami akan menambah bahagian baharu padanya. Untuk tidak keliru di mana untuk menambahnya, anda boleh mengintip versi akhir fail ini, hosts.updated.yml
, yang terdapat dalam repositori contoh.
Pengurusan Instance
Dari segi Ansible, setiap contoh adalah hos (tidak boleh dikelirukan dengan pelayan besi), i.e. nod infrastruktur yang akan diuruskan oleh Ansible. Untuk setiap hos, kami boleh menentukan parameter sambungan (seperti ansible_host
ΠΈ ansible_user
), serta konfigurasi contoh. Perihalan kejadian terdapat dalam bahagian hosts
.
Pertimbangkan konfigurasi contoh storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
Dalam pembolehubah config
kami menentukan parameter contoh - advertise URI
ΠΈ HTTP port
.
Di bawah ialah parameter contoh app-1
ΠΈ storage-1-replica
.
Kita perlu memberitahu Ansible parameter sambungan untuk setiap contoh. Nampaknya logik untuk mengumpulkan contoh ke dalam kumpulan mesin maya. Untuk melakukan ini, kejadian digabungkan ke dalam kumpulan. host1
ΠΈ host2
, dan dalam setiap kumpulan dalam bahagian vars
nilai ansible_host
ΠΈ ansible_user
untuk satu mesin maya. Dan dalam bahagian hosts
- hos (ia adalah contoh) yang termasuk dalam kumpulan ini:
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:
Kita mula berubah hosts.yml
. Mari tambah dua lagi contoh, storage-2-replica
pada mesin maya pertama dan storage-2
Pada yang kedua:
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: # <==
...
Jalankan buku permainan yang boleh:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Beri perhatian kepada pilihan --limit
. Memandangkan setiap tika kluster ialah hos dalam istilah Ansible, kami boleh menentukan secara eksplisit tika yang harus dikonfigurasikan semasa menjalankan buku main.
Kembali ke UI Web
Kami tidak akan berpuas hati dan akan menguasai kawalan topologi.
Pengurusan topologi
Mari gabungkan kejadian baharu kami ke dalam replikaset storage-2
. Tambah kumpulan baharu replicaset_storage_2
dan huraikan dalam pembolehubahnya parameter replikaset dengan analogi dengan replicaset_storage_1
. Dalam bahagian hosts
nyatakan contoh yang akan disertakan dalam kumpulan ini (iaitu set replika kami):
---
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:
Mari mulakan buku main semula:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Setiap parameter --limit
kami kali ini melepasi nama kumpulan yang sepadan dengan replikat kami.
Pertimbangkan pilihan tags
.
Peranan kami melaksanakan pelbagai tugas secara berurutan, yang ditandakan dengan tag berikut:
cartridge-instances
: pengurusan contoh (konfigurasi, sambungan kepada keahlian);cartridge-replicasets
: pengurusan topologi (pengurusan replikaset dan penyingkiran kekal (mengusir) kejadian daripada kelompok);cartridge-config
: menguruskan parameter kluster lain (vshard bootstrapping, mod failover automatik, parameter kebenaran dan konfigurasi aplikasi).
Kita boleh menentukan secara eksplisit bahagian kerja yang ingin kita lakukan, kemudian peranan itu akan melangkau tugasan yang lain. Dalam kes kami, kami mahu bekerja hanya dengan topologi, jadi kami nyatakan cartridge-replicasets
.
Mari kita nilai hasil usaha kita. Mencari replikaset baharu
Hooray!
Eksperimen dengan mengkonfigurasi semula kejadian dan replikat dan lihat cara topologi kluster berubah. Anda boleh mencuba senario operasi yang berbeza, contohnya, memtx_memory
. Peranan akan cuba melakukan ini tanpa memulakan semula contoh untuk mengurangkan kemungkinan masa henti aplikasi anda.
Jangan lupa berlari vagrant halt
untuk menghentikan VM apabila anda selesai dengannya.
Dan apa yang ada di bawah tudung?
Di sini saya akan bercakap lebih lanjut tentang apa yang berlaku di bawah hud peranan yang boleh dipercayai semasa eksperimen kami.
Mari kita lihat menggunakan aplikasi Kartrij langkah demi langkah.
Memasang pakej dan contoh permulaan
Mula-mula anda perlu menghantar pakej ke pelayan dan memasangnya. Kini peranan boleh berfungsi dengan pakej RPM dan DEB.
Seterusnya, kami melancarkan kejadian. Segala-galanya sangat mudah di sini: setiap contoh adalah berasingan systemd
-perkhidmatan. Saya bercakap tentang contoh:
$ systemctl start myapp@storage-1
Perintah ini akan melancarkan contoh storage-1
aplikasi myapp
. Contoh yang dilancarkan akan mencarinya /etc/tarantool/conf.d/
. Log contoh boleh dilihat menggunakan journald
.
Fail unit /etc/systemd/system/[email protected]
untuk perkhidmatan systemd akan dihantar bersama pakej.
Ansible mempunyai modul terbina dalam untuk memasang pakej dan mengurus perkhidmatan systemd, kami tidak mencipta sesuatu yang baharu di sini.
Mengkonfigurasi topologi kluster
Dan di sini yang paling menarik bermula. Setuju, ia akan menjadi pelik untuk mengganggu dengan ansible-peranan khas untuk memasang pakej dan berjalan systemd
-khidmat.
Anda boleh menyediakan kluster secara manual:
- Pilihan pertama: buka UI Web dan klik pada butang. Untuk permulaan satu kali beberapa keadaan, ia agak sesuai.
- Pilihan kedua: anda boleh menggunakan API GraphQl. Di sini anda sudah boleh mengautomasikan sesuatu, contohnya, menulis skrip dalam Python.
- Pilihan ketiga (untuk yang kuat semangat): pergi ke pelayan, sambung ke salah satu contoh menggunakan
tarantoolctl connect
dan lakukan semua manipulasi yang diperlukan dengan modul Luacartridge
.
Tugas utama ciptaan kami adalah untuk melakukan ini, bahagian kerja yang paling sukar untuk anda.
Ansible membolehkan anda menulis modul anda sendiri dan menggunakannya dalam peranan. Peranan kami menggunakan modul ini untuk mengurus pelbagai komponen kluster.
Bagaimana ia berfungsi? Anda menerangkan keadaan gugusan yang dikehendaki dalam konfigurasi deklaratif, dan peranan memberikan setiap modul bahagian konfigurasinya sebagai input. Modul menerima keadaan semasa kluster dan membandingkannya dengan input. Seterusnya, kod dijalankan melalui soket salah satu kejadian, yang membawa kluster ke keadaan yang dikehendaki.
Keputusan
Hari ini kami memberitahu dan menunjukkan cara untuk menggunakan aplikasi anda pada Tarantool Cartridge dan menyediakan topologi mudah. Untuk melakukan ini, kami menggunakan Ansible, alat berkuasa yang mudah digunakan dan membolehkan anda mengkonfigurasi banyak nod infrastruktur secara serentak (dalam kes kami, ini adalah contoh kelompok).
Di atas, kami menangani salah satu daripada banyak cara untuk menerangkan konfigurasi kluster menggunakan Ansible. Sebaik sahaja anda tahu anda bersedia untuk meneruskan, belajar group_vars
ΠΈ host_vars
.
Tidak lama lagi kami akan memberitahu anda cara untuk mengalih keluar (mengusir) kejadian secara kekal daripada topologi, bootstrap vshard, mengurus mod failover automatik, mengkonfigurasi kebenaran dan menampal konfigurasi kelompok. Sementara itu, anda boleh belajar sendiri
Jika sesuatu tidak berfungsi, pastikan
Sumber: www.habr.com