Meletakkan Aplikasi Dengan Mudah dan Semulajadi pada Katrij Tarantool (Bahagian 1)

Meletakkan Aplikasi Dengan Mudah dan Semulajadi pada Katrij Tarantool (Bahagian 1)

Kami telah pun berbincang Kartrij Tarantool, yang membolehkan anda membangunkan aplikasi yang diedarkan dan membungkusnya. Tiada apa-apa lagi: pelajari cara menggunakan dan mengurus aplikasi ini. Jangan risau, kami telah memikirkan segala-galanya! Kami telah mengumpulkan semua amalan terbaik untuk bekerja dengan Tarantool Cartridge dan menulis ansible-peranan, yang akan menguraikan pakej menjadi pelayan, memulakan kejadian, menggabungkannya menjadi kluster, mengkonfigurasi kebenaran, bootstrap vshard, mendayakan failover automatik dan menampal konfigurasi kluster.

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

Tarantool Cartridge mempunyai tutorial untuk mencipta aplikasi Kartrij kecil yang menyimpan maklumat tentang pelanggan bank dan akaun mereka, dan juga menyediakan API untuk mengurus data melalui HTTP. Untuk melakukan ini, aplikasi menerangkan dua peranan yang mungkin: api ΠΈ storageyang 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 peranan apiyang merangkumi peranan vshard-router. Hanya akan ada satu contoh di sini.
  • replikat storage-1 melaksanakan peranan storage (dan pada masa yang sama vshard-storage), di sini kami menambah dua contoh daripada mesin yang berbeza.

Meletakkan Aplikasi Dengan Mudah dan Semulajadi pada Katrij Tarantool (Bahagian 1)

Untuk menjalankan contoh, kita perlukan Vagrant ΠΈ Ansible (versi 2.8 atau lebih baru).

Peranan itu sendiri adalah Galaxy Ansible. Ini ialah repositori yang membolehkan anda berkongsi kerja anda dan menggunakan peranan sedia.

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

Meletakkan Aplikasi Dengan Mudah dan Semulajadi pada Katrij Tarantool (Bahagian 1)

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 inventori-fail 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 http://localhost:8181/admin/cluster/dashboard dan perhatikan contoh baharu kami:

Meletakkan Aplikasi Dengan Mudah dan Semulajadi pada Katrij Tarantool (Bahagian 1)

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

Meletakkan Aplikasi Dengan Mudah dan Semulajadi pada Katrij Tarantool (Bahagian 1)

Hooray!

Eksperimen dengan mengkonfigurasi semula kejadian dan replikat dan lihat cara topologi kluster berubah. Anda boleh mencuba senario operasi yang berbeza, contohnya, kemas kini bergulir atau bertambah memtx_memory. Peranan akan cuba melakukan ini tanpa memulakan semula contoh untuk mengurangkan kemungkinan masa henti aplikasi anda.

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

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 amalan terbaik untuk menulis buku permainan. Anda mungkin mendapati lebih mudah untuk menguruskan topologi dengan 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 dokumentasi dan bereksperimen dengan menukar parameter kelompok.

Jika sesuatu tidak berfungsi, pastikan maklumkan kami tentang masalah tersebut. Kami akan memecahkannya dengan cepat!

Sumber: www.habr.com

Tambah komen