Men-deploy Aplikasi dengan Mudah dan Alami di Kartrid Tarantool (Bagian 1)

Men-deploy Aplikasi dengan Mudah dan Alami di Kartrid Tarantool (Bagian 1)

Kami telah berbicara tentang Kartrid Tarantool, yang memungkinkan Anda mengembangkan aplikasi terdistribusi dan mengemasnya. Tidak ada yang tersisa: pelajari cara menerapkan dan mengelola aplikasi ini. Jangan khawatir, kami sudah memikirkan segalanya! Kami telah mengumpulkan semua praktik terbaik untuk bekerja dengan Kartrid Tarantool dan menulis peran-mungkin, yang akan mendekomposisi paket menjadi server, memulai instance, menyatukannya ke dalam cluster, mengonfigurasi otorisasi, bootstrap vshard, mengaktifkan failover otomatis, dan menambal konfigurasi cluster.

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 dokumentasi. Tetapi lebih baik mencoba sekali daripada melihat seratus kali, jadi mari terapkan aplikasi kecil.

Kartrid Tarantool punya tutorial untuk membuat aplikasi Cartridge kecil yang menyimpan informasi tentang nasabah bank dan rekening mereka, dan juga menyediakan API untuk mengelola data melalui HTTP. Untuk melakukan ini, aplikasi menjelaskan dua kemungkinan peran: api и storageyang 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 peran apiyang meliputi peran vshard-router. Hanya akan ada satu contoh di sini.
  • replicaset storage-1 mengimplementasikan peran storage (dan pada saat yang sama vshard-storage), di sini kita menambahkan dua instance dari mesin yang berbeda.

Men-deploy Aplikasi dengan Mudah dan Alami di Kartrid Tarantool (Bagian 1)

Untuk menjalankan contoh, kita perlu Gelandangan и Mungkin (versi 2.8 atau lebih baru).

Peran itu sendiri adalah Galaksi yang memungkinkan. Ini adalah repositori yang memungkinkan Anda berbagi pekerjaan dan menggunakan peran yang sudah jadi.

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 http://localhost:8181/admin/cluster/dashboard dan nikmati hasilnya:

Men-deploy Aplikasi dengan Mudah dan Alami di Kartrid Tarantool (Bagian 1)

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 inventaris-mengajukan 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 http://localhost:8181/admin/cluster/dashboard dan amati instance baru kami:

Men-deploy Aplikasi dengan Mudah dan Alami di Kartrid Tarantool (Bagian 1)

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 http://localhost:8181/admin/cluster/dashboard.

Men-deploy Aplikasi dengan Mudah dan Alami di Kartrid Tarantool (Bagian 1)

Hooray!

Bereksperimenlah dengan mengonfigurasi ulang instans dan replikaset Anda dan lihat bagaimana topologi klaster berubah. Anda dapat mencoba berbagai skenario operasional, misalnya, pembaruan bergulir atau meningkat memtx_memory. Peran tersebut akan mencoba melakukan ini tanpa memulai ulang instance untuk mengurangi kemungkinan waktu henti aplikasi Anda.

Jangan lupa berlari vagrant haltuntuk 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 konfigurasi в /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 Lua cartridge.

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 Praktik Terbaik untuk menulis buku pedoman. Anda mungkin merasa lebih nyaman untuk mengelola topologi 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 dokumentasi dan bereksperimen dengan mengubah parameter cluster.

Jika sesuatu tidak berhasil, pastikan memberitahukan kami tentang masalah tersebut. Kami akan membongkarnya dengan cepat!

Sumber: www.habr.com

Tambah komentar