Tətbiqlərin Tarantool kartricində asan və təbii şəkildə yerləşdirilməsi (1-ci hissə)

Tətbiqlərin Tarantool kartricində asan və təbii şəkildə yerləşdirilməsi (1-ci hissə)

Biz artıq danışmışıq Tarantool kartuşu, bu, paylanmış proqramları inkişaf etdirməyə və onları paketləməyə imkan verir. Heç bir şey qalmayıb: bu proqramları necə yerləşdirməyi və idarə etməyi öyrənin. Narahat olmayın, biz hər şeyi düşünmüşük! Tarantool Cartridge ilə işləmək üçün bütün ən yaxşı təcrübələri bir araya topladıq və yazdıq məqbul rol, paketi serverlərə parçalayacaq, nümunələri işə salacaq, onları klasterdə birləşdirəcək, avtorizasiyanı konfiqurasiya edəcək, vshard yükləyəcək, avtomatik yüklənməni aktivləşdirəcək və klaster konfiqurasiyasını düzəldəcək.

Maraqlıdır? Sonra kəsimin altında soruşuram, hər şeyi söyləyəcəyik və göstərəcəyik.

Bir nümunə ilə başlayaq

Biz rolumuzun funksionallığının yalnız bir hissəsini əhatə edəcəyik. Siz həmişə onun bütün xüsusiyyətlərinin və giriş parametrlərinin tam təsvirini tapa bilərsiniz sənədləşdirmə. Ancaq yüz dəfə görməkdənsə, bir dəfə cəhd etmək daha yaxşıdır, ona görə də kiçik bir tətbiq yerləşdirək.

Tarantool kartrici var dərslik bank müştəriləri və onların hesabları haqqında məlumatları saxlayan, həmçinin HTTP vasitəsilə məlumatların idarə edilməsi üçün API təmin edən kiçik Kartric tətbiqi yaratmaq. Bunun üçün proqram iki mümkün rolu təsvir edir: api и storageinstansiyalara təyin edilə bilər.

Kartricin özü proseslərə necə başlamaq barədə heç nə demir, o, yalnız artıq işləyən nümunələri konfiqurasiya etmək imkanı verir. Qalanını istifadəçi özü etməlidir: konfiqurasiya fayllarını parçalamaq, xidmətləri işə salmaq və topologiyanı qurmaq. Amma bütün bunları biz etməyəcəyik, Ansible bizim yerimizə edəcək.

Sözlərdən əmələ

Beləliklə, tətbiqimizi iki virtual maşına yerləşdirək və sadə bir topologiya quraq:

  • Replikaset app-1 rolunu oynayacaq apirolu daxildir vshard-router. Burada yalnız bir nümunə olacaq.
  • replikaset storage-1 rolunu həyata keçirir storage (və eyni zamanda vshard-storage), burada müxtəlif maşınlardan iki nümunə əlavə edirik.

Tətbiqlərin Tarantool kartricində asan və təbii şəkildə yerləşdirilməsi (1-ci hissə)

Məsələni işə salmaq üçün bizə lazımdır Zərərli и Yoxdur (versiya 2.8 və ya daha sonra).

Rol özüdür Ansible Galaxy. Bu, işinizi paylaşmağa və hazır rollardan istifadə etməyə imkan verən bir depodur.

Anbarı bir nümunə ilə klonlayın:

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

Virtual maşınları qaldırırıq:

$ vagrant up

Tarantool Cartridge əsas rolunu quraşdırın:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Quraşdırılmış rolu işə salın:

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

Oyun kitabının icrasının sonunu gözləyirik, gedin http://localhost:8181/admin/cluster/dashboard və nəticədən həzz alın:

Tətbiqlərin Tarantool kartricində asan və təbii şəkildə yerləşdirilməsi (1-ci hissə)

Siz data tökə bilərsiniz. Əla, hə?

İndi bununla necə işləmək lazım olduğunu anlayaq və eyni zamanda topologiyaya başqa bir replika dəsti əlavə edək.

anlamağa başlayırıq

Bəs nə baş verdi?

Biz iki VM-ni işə saldıq və klasterimizi quran ansible playbook-u işə saldıq. Faylın məzmununa baxaq 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

Burada maraqlı heç nə baş vermir, biz adlanan ansible-rolu başlayırıq tarantool.cartridge.

Bütün ən vacibləri (yəni klaster konfiqurasiyası) yerləşir inventar-fayl 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:

Bizə lazım olan tək şey bu faylın məzmununu dəyişdirərək nümunələri və replikasetləri idarə etməyi öyrənməkdir. Sonra ona yeni bölmələr əlavə edəcəyik. Onları hara əlavə edəcəyinizi çaşdırmamaq üçün bu faylın son versiyasına baxa bilərsiniz, hosts.updated.yml, bu nümunə depodadır.

Nümunələrin idarə edilməsi

Ansible baxımından, hər bir nümunə bir hostdur (dəmir server ilə qarışdırılmamalıdır), yəni. Ansible-in idarə edəcəyi infrastruktur qovşağı. Hər bir host üçün biz əlaqə parametrlərini təyin edə bilərik (məsələn ansible_host и ansible_user), həmçinin nümunə konfiqurasiyası. Nümunələrin təsviri bölmədədir hosts.

Nümunə konfiqurasiyasını nəzərdən keçirin storage-1:

all:
  vars:
    ...

  # INSTANCES
  hosts:
    storage-1:
      config:
        advertise_uri: '172.19.0.2:3301'
        http_port: 8181

  ...

Dəyişəndə config nümunə parametrlərini təyin etdik - advertise URI и HTTP port.
Aşağıda nümunə parametrləri verilmişdir app-1 и storage-1-replica.

Ansible-a hər bir nümunə üçün əlaqə parametrlərini söyləməliyik. Nümunələri virtual maşın qruplarına qruplaşdırmaq məntiqli görünür. Bunun üçün nümunələr qruplara birləşdirilir. host1 и host2, və bölmədəki hər qrupda vars dəyərlər ansible_host и ansible_user bir virtual maşın üçün. Və bölmədə hosts - bu qrupa daxil olan hostlar (onlar nümunələrdir):

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:

Dəyişməyə başlayırıq hosts.yml. Daha iki misal əlavə edək, storage-2-replica ilk virtual maşında və storage-2 İkincidə:

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:  # <==
  ...

Anlamlı oyun kitabını işə salın:

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

Seçimə diqqət yetirin --limit. Hər bir klaster nümunəsi Ansible şərtlərində host olduğundan, kitabçanı işlədərkən hansı nümunələrin konfiqurasiya edilməli olduğunu açıq şəkildə təyin edə bilərik.

Veb UI səhifəsinə qayıt http://localhost:8181/admin/cluster/dashboard və yeni nümunələrimizi müşahidə edin:

Tətbiqlərin Tarantool kartricində asan və təbii şəkildə yerləşdirilməsi (1-ci hissə)

Biz uğurlarımızla kifayətlənməyəcəyik və topologiyaya nəzarəti mənimsəyəcəyik.

Topologiyanın idarə edilməsi

Gəlin yeni nümunələrimizi replikasetdə birləşdirək storage-2. Yeni qrup əlavə edin replicaset_storage_2 və onun dəyişənlərində replikasetin parametrlərini analoqu ilə təsvir edin replicaset_storage_1. Bölmədə hosts hansı nümunələrin bu qrupa daxil ediləcəyini müəyyən edin (yəni replika dəstimiz):

---
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:

Oyun kitabına yenidən başlayaq:

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

Parametrə görə --limit biz bu dəfə replikasetimizə uyğun gələn qrupun adını keçdik.

Seçimi nəzərdən keçirin tags.

Rolumuz ardıcıl olaraq aşağıdakı teqlərlə qeyd olunan müxtəlif tapşırıqları yerinə yetirir:

  • cartridge-instances: instansiyanın idarə edilməsi (konfiqurasiya, üzvlüklə əlaqə);
  • cartridge-replicasets: topologiyanın idarə edilməsi (replikatsetin idarə edilməsi və nümunələrin klasterdən daimi çıxarılması (çıxarılması));
  • cartridge-config: digər klaster parametrlərini idarə edin (vshard bootstrapping, avtomatik yüklənmə rejimi, avtorizasiya parametrləri və proqram konfiqurasiyası).

İşin hansı hissəsini görmək istədiyimizi açıq şəkildə göstərə bilərik, sonra rol qalan tapşırıqları atlayacaqdır. Bizim vəziyyətimizdə biz yalnız topologiya ilə işləmək istəyirik, ona görə də müəyyən etdik cartridge-replicasets.

Gəlin səylərimizin nəticəsini qiymətləndirək. Yeni replikaset tapılır http://localhost:8181/admin/cluster/dashboard.

Tətbiqlərin Tarantool kartricində asan və təbii şəkildə yerləşdirilməsi (1-ci hissə)

Yaşasın!

Nümunələrin və replikasetlərin yenidən konfiqurasiyası ilə sınaq keçirin və klaster topologiyasının necə dəyişdiyinə baxın. Siz müxtəlif əməliyyat ssenarilərini sınaya bilərsiniz, məsələn, yuvarlanan yeniləmə və ya artır memtx_memory. Rol tətbiqinizin mümkün dayanma müddətini azaltmaq üçün nümunəni yenidən başlatmadan bunu etməyə çalışacaq.

Qaçmağı unutmayın vagrant haltonlarla işiniz bitdikdə VM-ləri dayandırmaq üçün.

Başlıq altında nə var?

Burada eksperimentlərimiz zamanı ansible rolunun başlığı altında baş verənlər haqqında daha çox danışacağam.

Gəlin addım-addım Kartric tətbiqinin yerləşdirilməsinə nəzər salaq.

Paketin quraşdırılması və nümunələrin işə salınması

Əvvəlcə paketi serverə çatdırmalı və quraşdırmalısınız. İndi rol RPM və DEB paketləri ilə işləyə bilər.

Sonra, nümunələri işə salırıq. Burada hər şey çox sadədir: hər bir nümunə ayrıdır systemd-xidmət. Mən bir misaldan danışıram:

$ systemctl start myapp@storage-1

Bu əmr nümunəni işə salacaq storage-1 apps myapp. Başladılan nümunə onu axtaracaq konfiqurasiya в /etc/tarantool/conf.d/. Nümunə qeydləri istifadə edərək baxıla bilər journald.

Vahid faylı /etc/systemd/system/[email protected] sistemli xidmət üçün paketlə birlikdə çatdırılacaq.

Ansible paketləri quraşdırmaq və sistem xidmətlərini idarə etmək üçün daxili modullara malikdir, biz burada yeni heç nə icad etməmişik.

Klaster topologiyasının konfiqurasiyası

Və burada ən maraqlısı başlayır. Razılaşın, paketləri quraşdırmaq və işə salmaq üçün xüsusi bir rolla narahat olmaq qəribə olardı systemd-xidmetler.

Siz klasteri əl ilə qura bilərsiniz:

  • Birinci seçim: Veb UI-ni açın və düymələri basın. Bir neçə nümunənin birdəfəlik başlanğıcı üçün olduqca uyğundur.
  • İkinci seçim: GraphQl API-dən istifadə edə bilərsiniz. Burada artıq bir şeyi avtomatlaşdıra bilərsiniz, məsələn, Python-da skript yaza bilərsiniz.
  • Üçüncü seçim (ruh baxımından güclülər üçün): serverə gedin, istifadə edərək nümunələrdən birinə qoşulun tarantoolctl connect və Lua modulu ilə bütün lazımi manipulyasiyaları yerinə yetirin cartridge.

İxtiramızın əsas vəzifəsi bunu etməkdir, işin sizin üçün ən çətin hissəsidir.

Ansible sizə öz modulunuzu yazmağa və ondan bir rolda istifadə etməyə imkan verir. Bizim rolumuz klasterin müxtəlif komponentlərini idarə etmək üçün bu modullardan istifadə edir.

Bu necə işləyir? Siz deklarativ konfiqurasiyada klasterin istədiyiniz vəziyyətini təsvir edirsiniz və rol hər modula giriş kimi konfiqurasiya bölməsini verir. Modul klasterin cari vəziyyətini alır və onu girişlə müqayisə edir. Bundan sonra, nümunələrdən birinin yuvasından bir kod işlədilir, bu da klasteri istədiyiniz vəziyyətə gətirir.

Nəticələri

Bu gün biz Tarantool Cartridge-də tətbiqinizi necə yerləşdirməyi və sadə bir topologiya qurmağı izah etdik və göstərdik. Bunun üçün biz istifadəsi asan və eyni zamanda bir çox infrastruktur qovşaqlarını konfiqurasiya etməyə imkan verən güclü alət olan Ansible-dan istifadə etdik (bizim vəziyyətimizdə bunlar klaster nümunələridir).

Yuxarıda, biz Ansible istifadə edərək klaster konfiqurasiyasını təsvir etməyin bir çox yollarından birini nəzərdən keçirdik. Davam etməyə hazır olduğunuzu bildikdən sonra öyrənin ən yaxşı təcrübələr oyun kitabları yazmaq üçün. Siz topologiyanı idarə etməyi daha rahat tapa bilərsiniz group_vars и host_vars.

Tezliklə biz sizə nümunələri topologiyadan həmişəlik olaraq necə silmək (qovmaq), vshard yükləmək, avtomatik yüklənmə rejimini idarə etmək, avtorizasiyanı konfiqurasiya etmək və klaster konfiqurasiyasını yamaq barədə məlumat verəcəyik. Bu arada siz təkbaşına təhsil ala bilərsiniz sənədlər və klaster parametrlərinin dəyişdirilməsi ilə təcrübə aparın.

Bir şey işləmirsə, əmin olun məlumat vermək problem haqqında bizə. Biz onu tez sındıracağıq!

Mənbə: www.habr.com

Добавить комментарий