Menyebarkan aplikasi Tarantool Cartridge tanpa usaha (Bagian 1)



Kami telah menghadirkan Tarantool Cartridge yang memungkinkan Anda untuk mengembangkan dan mengemas aplikasi yang didistribusikan. Sekarang mari kita belajar bagaimana menggunakan dan mengendalikan aplikasi ini. Jangan panik, semuanya terkendali! Kami telah menggabungkan semua praktik terbaik dari bekerja dengan Tarantool Cartridge dan menulis peran Ansible , yang akan menyebarkan paket ke server, memulai dan menggabungkan instance ke dalam set replika, mengkonfigurasi otorisasi, vshard bootstrap, mengaktifkan failover otomatis dan konfigurasi tambalan cluster.

Menarik, ya? Menyelam, periksa detail di bawah luka.

Mulai dengan sampel


Biarkan kami memandu Anda hanya melalui beberapa fungsi peran. Anda selalu dapat menemukan deskripsi lengkap dari semua fitur dan parameter input dalam dokumentasi . Namun, mencoba sekali lebih baik daripada melihatnya ratusan kali, jadi mari kita gunakan aplikasi kecil.

Tarantool Cartridge memiliki tutorial untuk membuat aplikasi Cartridge kecil yang menyimpan informasi tentang pelanggan bank dan akun mereka, serta menyediakan API untuk manajemen data melalui HTTP. Untuk tujuan ini, aplikasi menjelaskan dua peran yang memungkinkan yang dapat ditetapkan untuk instance: api dan storage .

Cartridge sendiri tidak mengatakan apa-apa tentang cara memulai proses - hanya memberikan kesempatan untuk mengkonfigurasi instance yang sedang berjalan. Jadi, sisanya terserah kepada pengguna: mendistribusikan file konfigurasi, menjalankan layanan, dan mengkonfigurasi topologi. Tetapi kita tidak akan melakukan semua itu - Ansible akan melakukannya untuk kita.

Mulai beraksi


Pertama, mari kita gunakan aplikasi kita di dua mesin virtual dan buat topologi sederhana:

  • Set replika app-1 akan mewakili peran api yang berisi peran vshard-router . Hanya akan ada satu contoh.
  • Set replika storage-1 akan mewakili peran storage (termasuk peran vshard-storage ) - di sini kita akan menambahkan dua instance dari mesin yang berbeda.



Untuk menjalankan sampel, kita akan membutuhkan Vagrant dan Ansible (versi 2.8 atau lebih tinggi).

Peran itu sendiri disimpan di Ansible Galaxy - repositori yang memungkinkan Anda berbagi pekerjaan dan menggunakan peran yang sudah jadi.

Sekarang klon repositori sampel:

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

Kemudian gunakan mesin virtual:

 $ vagrant up 

Setelah itu, instal peran Tarantool Cartridge Ansible:

 $ ansible-galaxy install tarantool.cartridge,1.0.1 

Dan mulai peran yang diinstal:

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

Sekarang tunggu sampai proses playbook selesai, buka http: // localhost: 8181 / admin / cluster / dashboard dan nikmati hasilnya:



Anda dapat mengunggah data sekarang. Luar biasa, bukan?

Sekarang mari kita mencari cara untuk bekerja dengannya, dan kita juga bisa menambahkan set replika lain ke topologi.

Lebih detail


Jadi, apa yang terjadi?

Kami menjalankan dua mesin virtual dan menjalankan dan meluncurkan buku pedoman yang memungkinkan yang mengonfigurasi kluster kami. Sekarang mari kita lihat ke dalam 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; mari kita luncurkan peran tarantool.cartridge disebut tarantool.cartridge .

Hal 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 set replika dengan memodifikasi file ini. Nanti, kami akan menambahkan bagian baru untuk itu. Untuk menghindari kebingungan saat menambahkan bagian, lihat versi final file ini, atau hosts.updated.yml , yang terletak di repositori sampel.

Mengelola instance


Dalam istilah Ansible, setiap instance adalah host (jangan dikacaukan dengan server fisik), mis. Simpul infrastruktur yang akan dikelola oleh Ansible. Untuk setiap host, kita dapat menentukan parameter koneksi (seperti ansible_host dan ansible_user ) dan konfigurasi instance. Deskripsi contoh ada di bagian hosts .

Mari kita lihat 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 dari instance app-1 dan storage-1-replica .

Kami harus menyediakan parameter koneksi Ansible untuk setiap instance. Tampaknya masuk akal untuk mengelompokkan instance oleh mesin virtual. Untuk tujuan ini, instance dikelompokkan bersama di bawah host1 dan host2 , dan setiap grup di bagian vars berisi nilai parameter ansible_user dan ansible_user untuk satu mesin virtual. Dan bagian hosts berisi host (atau 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: 

Mari kita mulai mengedit hosts.yml . Sekarang kita menambahkan 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: # <== ... 

Mulai playbook Ansible:

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

Perhatikan opsi --limit . Karena setiap instance cluster adalah host dalam hal Ansible, kami dapat secara eksplisit menentukan instance mana yang harus dikonfigurasikan saat menjalankan playbook.

Jadi kita kembali ke UI web di http: // localhost: 8181 / admin / cluster / dashboard dan lihat contoh baru kami:



Selanjutnya, mari kita menguasai manajemen topologi.

Mengelola topologi


Biarkan kami mengelompokkan instance baru kami ke dalam set replika storage-2 , menambahkan grup baru replicaset_storage_2 , dan menjelaskan parameter set replika dalam variabel seperti yang kami lakukan untuk replicaset_storage_1 . Di bagian hosts , kami menentukan instance mana yang harus 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: 

Lalu kami menjalankan lagi buku pedoman:

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

Kali ini kami memberikan nama grup yang sesuai dengan set replika kami di parameter --limit .

Mari kita lihat opsi tags .

Peran kami berturut-turut menjalankan berbagai tugas yang ditandai dengan tag berikut:

  • cartridge-instances : manajemen instance (konfigurasi, keanggotaan);
  • cartridge-replicasets : manajemen topologi (manajemen set replika dan penghapusan permanen (mengeluarkan) instance dari cluster);
  • cartridge-config : kontrol parameter cluster lainnya (bootstrap vshard, failover otomatis, parameter otorisasi, dan konfigurasi aplikasi).

Kami dapat secara eksplisit menentukan bagian mana dari pekerjaan yang ingin kami lakukan - dan peran akan melewati sisa tugas. Dalam hal ini, kami hanya ingin bekerja dengan topologi, jadi kami menentukan cartridge-replicasets .

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



Yay

Coba ubah konfigurasi instans dan set replika dan lihat bagaimana topologi klaster berubah. Anda dapat mencoba berbagai kasus penggunaan, seperti pembaruan bergulir atau peningkatan memtx_memory . Peran akan mencoba melakukan ini tanpa memulai ulang instance untuk mengurangi kemungkinan downtime aplikasi Anda.

Jangan lupa menjalankan vagrant halt untuk menghentikan mesin virtual ketika Anda selesai menggunakannya.

Apa yang ada di dalam?


Di sini saya akan bercerita lebih banyak tentang apa yang terjadi di bawah tenda peran Ansible selama pengujian kami.
Mari pertimbangkan langkah-langkah penerapan aplikasi Cartridge.

Menginstal paket dan memulai instance


Hal pertama yang harus dilakukan adalah mengirimkan paket ke server dan menginstalnya. Sekarang perannya dapat bekerja dengan paket RPM dan paket DEB.

Selanjutnya, kami meluncurkan instance. Ini sangat sederhana: setiap contoh adalah layanan systemd terpisah. Sebagai contoh:

 $ systemctl start myapp@storage-1 

Perintah ini meluncurkan instance storage-1 dari myapp
aplikasi. Instance yang sedang berjalan mencari konfigurasinya di /etc/tarantool/conf.d/ . Anda dapat melihat log contoh menggunakan journald .

File Unit /etc/systemd/systemd/myapp@.sevice untuk layanan systemd dikirimkan bersama paket.

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

Mengkonfigurasi topologi klaster


Hal paling menyenangkan terjadi di sini. Saya yakin Anda akan setuju bahwa aneh untuk repot dengan peran khusus yang mungkin untuk menginstal paket dan menjalankan layanan systemd .

Anda dapat mengkonfigurasi kluster secara manual:

  • Opsi pertama adalah membuka UI Web dan mengklik tombol. Ini sangat cocok untuk memulai satu kali beberapa kali.
  • Opsi kedua adalah menggunakan GraphQL API. Di sini Anda sudah dapat mengotomatisasi sesuatu, misalnya, menulis skrip dengan Python.
  • Pilihan ketiga adalah untuk yang berani: pergi ke server, hubungkan ke salah satu contoh dengan bantuan tarantoolctl connect dan melakukan semua tindakan yang diperlukan dengan modul Lua cartridge .

Tugas utama penemuan kami adalah melakukan bagian tersulit dari pekerjaan ini untuk Anda.

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

Bagaimana cara kerjanya? Anda menggambarkan keadaan yang diinginkan dari cluster dalam konfigurasi deklaratif, dan peran memberikan masing-masing modul bagian konfigurasi sendiri sebagai input. Modul menerima status cluster saat ini dan membandingkannya dengan input. Kemudian kode untuk negara cluster yang diperlukan diluncurkan menggunakan soket dari salah satu instance.

Hasil


Hari ini kami telah menunjukkan kepada Anda cara menggunakan aplikasi Tarantool Cartridge Anda dan mengonfigurasi topologi sederhana. Untuk melakukan ini, kami menggunakan Ansible, alat yang ampuh yang mudah digunakan dan memungkinkan Anda untuk mengonfigurasi beberapa node infrastruktur secara bersamaan (dalam kasus kami, instance cluster).

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

Segera, kami akan memberi tahu Anda cara menghapus (mengeluarkan) instance dari topologi secara permanen, bootstrap vshard, mengelola failover otomatis, mengkonfigurasi otorisasi, dan konfigurasi patch cluster. Sementara itu, Anda dapat meninjau sendiri dokumentasi dan mencoba mengubah pengaturan cluster.

Jika terjadi kesalahan, pastikan untuk memberi tahu kami tentang masalahnya. Kami akan melakukan yang terbaik untuk menyelesaikan masalah apa pun!

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


All Articles