Penerapan aplikasi yang mudah dan santai di Tarantool Cartridge (bagian 1)


Kami sudah bicara tentang Tarantool Cartridge , yang memungkinkan Anda mengembangkan aplikasi terdistribusi dan mengemasnya. Yang tersisa adalah mempelajari cara menggunakan aplikasi ini dan mengelolanya. Jangan khawatir, kami telah menyediakan segalanya! Kami menyatukan semua praktik terbaik untuk bekerja dengan Tarantool Cartridge dan menulis peran yang memungkinkan yang menguraikan paket ke server, meluncurkan instance, menggabungkannya ke dalam sebuah cluster, mengkonfigurasi otorisasi, memulai vshard, memungkinkan failover otomatis dan menambal konfigurasi cluster.


Menarik? Lalu saya minta potongan, kami akan kirim dan tunjukkan semuanya.


Mari kita mulai dengan sebuah contoh.


Kami hanya akan mempertimbangkan bagian dari fungsionalitas peran kami. Anda selalu dapat menemukan deskripsi lengkap dari semua fitur dan parameter input dalam dokumentasi . Tetapi lebih baik mencoba sekali daripada melihat seratus kali, jadi mari kita instal aplikasi kecil.


Tarantool Cartridge memiliki tutorial tentang cara membuat aplikasi Cartridge kecil yang menyimpan informasi tentang pelanggan bank dan akun mereka, dan juga menyediakan API untuk mengelola data melalui HTTP. Untuk melakukan ini, aplikasi menjelaskan dua peran yang mungkin: api dan storage , yang dapat ditugaskan ke instance.


Cartridge sendiri tidak mengatakan apa pun tentang cara memulai proses, ia hanya menyediakan kemampuan untuk mengonfigurasi instans yang sudah berjalan. Pengguna harus melakukan sisanya: menguraikan file konfigurasi, memulai layanan dan mengkonfigurasi topologi. Tetapi kami tidak akan melakukan semua ini, Ansible akan melakukannya untuk kami.


Harap dicatat bahwa jika Anda mengembangkan aplikasi Anda pada OS X, kemudian mengemasnya pada mesin lokal dan kemudian gagal menginstalnya pada Centos atau Debian akan gagal, karena paket tersebut akan berisi modul-modul rock dan file yang dapat dieksekusi khusus untuk OS X. Dalam hal ini, Anda harus membuat pengemasan pada sistem target.


Dari kata-kata hingga perbuatan


Jadi, mari kita instal aplikasi kita pada dua mesin virtual dan mengatur topologi sederhana:


  • app-1 replika app-1 akan mengimplementasikan peran api , yang mencakup peran vshard-router . Hanya akan ada satu contoh.
  • Replika storage-1 mengimplementasikan peran storage (dan pada saat yang sama vshard-storage ), di sini kami menambahkan dua contoh dari mesin yang berbeda.


Untuk menjalankan contoh, kita membutuhkan Vagrant dan Ansible (versi 2.8 atau yang lebih baru).


Peran itu sendiri ada di Ansible Galaxy . Ini adalah repositori yang memungkinkan Anda berbagi praktik terbaik dan menggunakan peran yang sudah jadi.


Kami mengkloning repositori dengan sebuah contoh:


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

Angkat mesin virtual:


 $ vagrant up 

Instal peran yang memungkinkan Tarantool Cartridge:


 $ ansible-galaxy install tarantool.cartridge,1.0.1 

Jalankan peran yang diinstal:


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

Kami menunggu penyelesaian playbook, buka http: // localhost: 8181 / admin / cluster / dashboard dan nikmati hasilnya:



Anda bisa menuangkan data. Keren kan?


Sekarang mari kita mencari cara untuk bekerja dengan ini, dan pada saat yang sama menambahkan set replika lain ke topologi.


Mulai mengerti


Jadi apa yang terjadi?


Kami mengambil dua mesin virtual dan meluncurkan buku pedoman yang memungkinkan yang mengonfigurasi kluster kami. Mari kita lihat isi file 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 meluncurkan peran yang tarantool.cartridge disebut tarantool.cartridge .


Semua yang paling penting (yaitu, konfigurasi cluster) ada di file inventaris 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 perlu kita lakukan adalah mempelajari cara mengelola instance dan replaset dengan memodifikasi konten file ini. Selanjutnya kami akan menambahkan bagian baru untuk itu. Agar tidak bingung harus menambahkan di mana, Anda bisa mengintip versi final file ini, hosts.updated.yml , yang terletak di repositori dengan sebuah contoh.


Manajemen instance


Dalam hal Ansible, setiap instance adalah host (jangan dikacaukan dengan server besi), mis. Node infrastruktur yang Ansible akan kelola. Untuk setiap host, kita dapat menentukan parameter koneksi (seperti ansible_host dan 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 variabel config , kami menentukan parameter instance - advertise URI dan HTTP port .
Di bawah ini adalah parameter instance app-1 dan storage-1-replica .


Kami perlu memberikan parameter koneksi Ansible untuk setiap instance. Tampaknya logis untuk mengelompokkan instance ke dalam grup mesin virtual. Untuk melakukan ini, instance dikelompokkan ke dalam kelompok host1 dan host2 , dan di setiap grup di bagian vars nilai-nilai ansible_host dan ansible_user untuk satu vars ditunjukkan. Dan di bagian hosts ada 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: 

Kami mulai mengubah hosts.yml . Tambahkan dua contoh lagi, storage-2-replica pada mesin virtual 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 playbook yang memungkinkan:


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

Perhatikan opsi --limit . Karena setiap instance dari cluster adalah host dalam hal Ansible, kami dapat secara eksplisit menunjukkan instance mana yang harus dikonfigurasikan saat memainkan buku pedoman.


Sekali lagi, buka http UI Web : // localhost: 8181 / admin / cluster / dashboard dan amati contoh baru kami:



Kami tidak akan memikirkan apa yang telah dicapai dan menguasai manajemen topologi.


Manajemen topologi


Gabungkan instance baru kami ke dalam storage-2 . Tambahkan grup baru replicaset_storage_2 dan jelaskan parameter replicaset dalam variabelnya, mirip dengan replicaset_storage_1 . Di bagian hosts , kami menunjukkan instance mana yang akan dimasukkan dalam grup ini (yaitu, 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: 

Mulai playbook lagi:


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

Kali ini, kami memberikan nama grup yang sesuai dengan replicaset kami ke parameter --limit.


Pertimbangkan opsi tags .


Peran kami secara konsisten melakukan berbagai tugas, yang ditandai dengan tag berikut:


  • cartridge-instances : manajemen instance (pengaturan, koneksi ke keanggotaan);
  • cartridge-replicasets : manajemen topologi (mengelola replaset dan secara permanen menghapus (mengeluarkan) instance dari cluster);
  • cartridge-config : manajemen parameter cluster yang tersisa (bootstrap vshard, mode failover otomatis, parameter otorisasi, dan konfigurasi aplikasi).

Kita dapat secara eksplisit menunjukkan bagian pekerjaan yang ingin kita lakukan, kemudian peran tersebut akan melewatkan eksekusi tugas yang tersisa. Dalam kasus kami, kami hanya ingin bekerja dengan topologi, oleh karena itu kami menunjukkan cartridge-replicasets .


Mari kita evaluasi hasil dari upaya kita. Temukan set replika baru di http: // localhost: 8181 / admin / cluster / dashboard .



Hore!


Lakukan percobaan dengan mengubah konfigurasi instans dan replika serta lihat bagaimana topologi klaster berubah. Anda dapat mencoba berbagai skenario operasional, misalnya, memutakhirkan pembaruan atau menambah memtx_memory . Peran akan mencoba melakukan ini tanpa memulai ulang instance untuk mengurangi kemungkinan downtime aplikasi Anda.


Jangan lupa untuk memulai vagrant halt untuk menghentikan vagrant halt ketika Anda selesai bekerja dengan mereka.


Dan apa yang ada di bawah tenda?


Di sini saya akan bercerita lebih banyak tentang apa yang terjadi di bawah tenda peran yang mungkin selama percobaan kami.


Pertimbangkan langkah-langkah penerapan aplikasi Cartridge.


Menginstal paket dan memulai instance


Pertama, Anda perlu mengirimkan paket ke server dan menginstalnya. Sekarang perannya dapat bekerja dengan paket RPM dan DEB.


Selanjutnya, jalankan instance. Semuanya sangat sederhana di sini: setiap contoh adalah layanan systemd terpisah. Saya katakan dengan sebuah contoh:


 $ systemctl start myapp@storage-1 

Perintah ini akan meluncurkan instance storage-1 dari myapp . Instance yang sedang berjalan akan mencari konfigurasinya di /etc/tarantool/conf.d/ . journald dapat dilihat menggunakan journald .


File unit /etc/systemd/system/myapp@.sevice untuk layanan systemd akan dikirimkan bersama paket.


Ansible memiliki modul bawaan untuk menginstal paket dan mengelola layanan systemd, di sini kami belum menemukan sesuatu yang baru.


Konfigurasikan Topologi Cluster


Dan di sini kesenangan dimulai. Setuju, akan aneh untuk repot dengan peran khusus yang mungkin untuk menginstal paket dan menjalankan layanan systemd .


Anda dapat mengkonfigurasi kluster secara manual:


  • Opsi pertama: buka Web UI dan klik tombol. Untuk permulaan beberapa kali, ini sangat cocok.
  • Opsi kedua: Anda dapat menggunakan GraphQl API. Di sini Anda sudah dapat mengotomatisasi sesuatu, misalnya, menulis skrip dengan Python.
  • Opsi ketiga (bagi mereka yang berkemauan keras): kita pergi ke server, tarantoolctl connect ke salah satu contoh menggunakan tarantoolctl connect dan melakukan semua manipulasi yang diperlukan dengan modul Lua cartridge .

Tujuan utama dari penemuan kami adalah untuk melakukan hal ini, bagian paling sulit dari pekerjaan untuk Anda.


Ansible memungkinkan Anda untuk menulis modul Anda dan menggunakannya dalam suatu peran. Peran kami menggunakan modul tersebut untuk mengelola berbagai komponen kluster.


Bagaimana cara kerjanya? Anda menjelaskan keadaan yang diinginkan dari cluster dalam konfigurasi deklaratif, dan peran memasukkan bagian konfigurasinya ke input setiap modul. Modul menerima status cluster saat ini dan membandingkannya dengan apa yang masuk. Kemudian, melalui soket salah satu instance, kode diluncurkan yang membawa cluster ke keadaan yang diinginkan.


Ringkasan


Hari ini kami berbicara dan menunjukkan cara menggunakan aplikasi Anda di Tarantool Cartridge dan membuat topologi sederhana. Untuk melakukan ini, kami menggunakan Ansible, alat yang ampuh yang mudah digunakan dan memungkinkan Anda untuk secara bersamaan mengkonfigurasi banyak node infrastruktur (dalam kasus kami, ini adalah contoh cluster).


Di atas, kami menemukan salah satu dari banyak cara untuk menggambarkan konfigurasi cluster menggunakan Ansible. Setelah Anda menyadari bahwa Anda siap untuk melanjutkan, pelajari praktik terbaik untuk menulis buku pedoman. Anda mungkin merasa lebih nyaman untuk mengelola topologi dengan group_vars dan host_vars .


Di bagian selanjutnya, kita akan belajar cara menghapus secara permanen (mengeluarkan) instance dari topologi, bootstrap vshard, mengelola mode failover otomatis, mengkonfigurasi otorisasi, dan menambal konfigurasi cluster. Jangan berhenti di situ, terus mempelajari dokumentasi dan bereksperimen dengan mengubah parameter cluster.


Jika sesuatu tidak berhasil, pastikan untuk memberi tahu kami tentang masalahnya. Kami akan segera menghancurkan segalanya!

Source: https://habr.com/ru/post/id478710/


All Articles