Kami telah berbicara tentang
Menarik? Lalu saya bertanya di bawah potongan, kami akan memberi tahu dan menunjukkan semuanya.
Mari kita mulai dengan sebuah contoh
Kami hanya akan membahas sebagian dari fungsi peran kami. Anda selalu dapat menemukan deskripsi lengkap dari semua fitur dan parameter inputnya di
Kartrid Tarantool punya api
и storage
yang dapat ditugaskan ke instance.
Kartrid itu sendiri tidak mengatakan apa-apa tentang cara memulai proses, ini hanya menyediakan kemampuan untuk mengonfigurasi instans yang sudah berjalan. Pengguna harus melakukan sisanya sendiri: menguraikan file konfigurasi, memulai layanan, dan mengatur topologi. Tapi kami tidak akan melakukan semua ini, Ansible akan melakukannya untuk kami.
Dari kata menjadi perbuatan
Jadi, mari terapkan aplikasi kita ke dua mesin virtual dan siapkan topologi sederhana:
- Set replika
app-1
akan memainkan peranapi
yang meliputi peranvshard-router
. Hanya akan ada satu contoh di sini. - replicaset
storage-1
mengimplementasikan peranstorage
(dan pada saat yang samavshard-storage
), di sini kita menambahkan dua instance dari mesin yang berbeda.
Untuk menjalankan contoh, kita perlu
Peran itu sendiri adalah
Kloning 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 virtual:
$ vagrant up
Instal peran Kartrid Tarantool yang memungkinkan:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Jalankan peran yang diinstal:
$ ansible-playbook -i hosts.yml playbook.yml
Kami sedang menunggu akhir dari eksekusi playbook, buka
Anda dapat menuangkan data. Keren kan?
Sekarang mari kita cari tahu cara bekerja dengan ini, dan pada saat yang sama menambahkan set replika lain ke topologi.
Kami mulai mengerti
Jadi apa yang terjadi?
Kami memiliki dua VM dan menjalankan buku pedoman yang memungkinkan untuk menyiapkan kluster kami. Mari kita lihat isi filenya 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
Tidak ada yang menarik terjadi di sini, kami memulai peran yang memungkinkan, yang disebut tarantool.cartridge
.
Semua yang paling penting (yaitu, konfigurasi cluster) 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:
Yang kita butuhkan hanyalah mempelajari cara mengelola instance dan kumpulan replika dengan mengubah konten file ini. Selanjutnya, kami akan menambahkan bagian baru ke dalamnya. Biar gak bingung mau nambahin dimana, kamu bisa intip versi final file ini, hosts.updated.yml
, yang ada di repositori contoh.
Manajemen contoh
Dalam hal Ansible, setiap instance adalah host (jangan bingung dengan server besi), yaitu. simpul infrastruktur yang akan dikelola Ansible. Untuk setiap host, kita dapat menentukan parameter koneksi (seperti ansible_host
и ansible_user
), serta konfigurasi instance. Deskripsi instance ada di bagian hosts
.
Pertimbangkan konfigurasi instance storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
Dalam sebuah variabel config
kami menentukan parameter instan - advertise URI
и HTTP port
.
Di bawah ini adalah parameter instance app-1
и storage-1-replica
.
Kami perlu memberi tahu Ansible parameter koneksi untuk setiap instance. Tampaknya logis untuk mengelompokkan instance ke dalam grup mesin virtual. Untuk melakukan ini, instance digabungkan ke dalam grup. host1
и host2
, dan di setiap grup di bagian tersebut vars
nilai-nilai ansible_host
и ansible_user
untuk satu mesin virtual. Dan di bagian hosts
- host (mereka adalah instance) yang termasuk dalam grup 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 mulai berubah hosts.yml
. Mari tambahkan dua contoh lagi, storage-2-replica
pada mesin virtual pertama dan storage-2
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 playbook yang memungkinkan:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Perhatikan opsinya --limit
. Karena setiap instance cluster adalah host dalam istilah Ansible, kami dapat secara eksplisit menentukan instance mana yang harus dikonfigurasi saat menjalankan playbook.
Kembali ke UI Web
Kami tidak akan berpuas diri dan akan menguasai kontrol topologi.
Manajemen topologi
Mari gabungkan instance baru kita ke dalam sebuah replicaset storage-2
. Tambahkan grup baru replicaset_storage_2
dan jelaskan dalam variabelnya parameter replikaset dengan analogi replicaset_storage_1
. Di bagian hosts
tentukan instance mana yang akan disertakan dalam grup ini (yaitu, kumpulan 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 kita mulai buku pedoman lagi:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Per opsi --limit
kami kali ini melewati nama grup yang sesuai dengan replicaset kami.
Pertimbangkan opsinya tags
.
Peran kami secara berurutan melakukan berbagai tugas, yang ditandai dengan tag berikut:
cartridge-instances
: manajemen instance (konfigurasi, koneksi ke keanggotaan);cartridge-replicasets
: manajemen topologi (manajemen replikaset dan penghapusan permanen (mengusir) instance dari cluster);cartridge-config
: mengelola parameter cluster lainnya (vshard bootstrap, mode failover otomatis, parameter otorisasi, dan konfigurasi aplikasi).
Kami dapat secara eksplisit menentukan bagian mana dari pekerjaan yang ingin kami lakukan, kemudian peran tersebut akan melewatkan tugas lainnya. Dalam kasus kami, kami hanya ingin bekerja dengan topologi, jadi kami tentukan cartridge-replicasets
.
Mari kita evaluasi hasil usaha kita. Menemukan replikaset baru
Hooray!
Bereksperimenlah dengan mengonfigurasi ulang instans dan replikaset Anda dan lihat bagaimana topologi klaster berubah. Anda dapat mencoba berbagai skenario operasional, misalnya, memtx_memory
. Peran tersebut akan mencoba melakukan ini tanpa memulai ulang instance untuk mengurangi kemungkinan waktu henti aplikasi Anda.
Jangan lupa berlari vagrant halt
untuk menghentikan VM setelah Anda selesai menggunakannya.
Dan apa yang ada di bawah tenda?
Di sini saya akan berbicara lebih banyak tentang apa yang terjadi di balik peran yang memungkinkan selama percobaan kami.
Mari kita lihat penggelaran aplikasi Kartrid selangkah demi selangkah.
Menginstal paket dan memulai instance
Pertama, Anda perlu mengirimkan paket ke server dan menginstalnya. Sekarang peran dapat bekerja dengan paket RPM dan DEB.
Selanjutnya, kami meluncurkan instance. Semuanya sangat sederhana di sini: setiap salinan terpisah systemd
-melayani. Saya berbicara tentang sebuah contoh:
$ systemctl start myapp@storage-1
Perintah ini akan meluncurkan instance storage-1
aplikasi myapp
. Instance yang diluncurkan akan mencarinya /etc/tarantool/conf.d/
. Log instan dapat dilihat menggunakan journald
.
Berkas satuan /etc/systemd/system/[email protected]
untuk layanan systemd akan dikirimkan bersama paket.
Ansible memiliki modul bawaan untuk menginstal paket dan mengelola layanan systemd, kami belum menemukan sesuatu yang baru di sini.
Konfigurasi topologi cluster
Dan di sini yang paling menarik dimulai. Setuju, akan aneh jika repot dengan peran khusus yang memungkinkan untuk menginstal paket dan menjalankannya systemd
-jasa.
Anda dapat menyiapkan kluster secara manual:
- Opsi pertama: buka UI Web dan klik tombol. Untuk satu kali start dari beberapa instance, ini cukup cocok.
- Opsi kedua: Anda dapat menggunakan GraphQl API. Di sini Anda sudah dapat mengotomatiskan sesuatu, misalnya menulis skrip dengan Python.
- Opsi ketiga (untuk yang berjiwa kuat): pergi ke server, sambungkan ke salah satu instance menggunakan
tarantoolctl connect
dan lakukan semua manipulasi yang diperlukan dengan modul Luacartridge
.
Tugas utama penemuan kami adalah melakukan ini, bagian tersulit dari pekerjaan untuk Anda.
Ansible memungkinkan Anda untuk menulis modul Anda sendiri dan menggunakannya dalam suatu peran. Peran kami menggunakan modul ini untuk mengelola berbagai komponen klaster.
Bagaimana itu bekerja? Anda mendeskripsikan status klaster yang diinginkan dalam konfigurasi deklaratif, dan peran tersebut memberikan setiap modul bagian konfigurasinya sebagai input. Modul menerima status cluster saat ini dan membandingkannya dengan input. Selanjutnya, sebuah kode dijalankan melalui soket salah satu instance, yang membawa cluster ke status yang diinginkan.
Hasil
Hari ini kami memberi tahu dan menunjukkan cara menerapkan aplikasi Anda di Kartrid Tarantool dan menyiapkan topologi sederhana. Untuk melakukan ini, kami menggunakan Ansible, alat canggih yang mudah digunakan dan memungkinkan Anda mengonfigurasi banyak node infrastruktur secara bersamaan (dalam kasus kami, ini adalah instance cluster).
Di atas, kami membahas salah satu dari banyak cara untuk mendeskripsikan konfigurasi cluster menggunakan Ansible. Setelah Anda tahu Anda siap untuk melanjutkan, pelajari group_vars
и host_vars
.
Segera kami akan memberi tahu Anda cara menghapus (mengusir) instance secara permanen dari topologi, bootstrap vshard, mengelola mode failover otomatis, mengonfigurasi otorisasi, dan menambal konfigurasi cluster. Sementara itu, Anda bisa belajar sendiri
Jika sesuatu tidak berhasil, pastikan
Sumber: www.habr.com