Қолданбаларды Tarantool картриджіне оңай және табиғи түрде орналастырыңыз (1-бөлім)

Қолданбаларды Tarantool картриджіне оңай және табиғи түрде орналастырыңыз (1-бөлім)

Біз бұған дейін айтқанбыз Tarantool картриджі, бұл таратылған қолданбаларды әзірлеуге және оларды бумалауға мүмкіндік береді. Бұл қолданбаларды қолдануды және оларды басқаруды үйрену ғана қалды. Уайымдамаңыз, бізде бәрі бар! Біз Tarantool картриджімен жұмыс істеудің барлық жақсы тәжірибелерін жинап, жаздық жауапты рөл, ол буманы серверлерге таратады, даналарды іске қосады, оларды кластерге біріктіреді, авторизацияны конфигурациялайды, vshard жүктейді, автоматты ауыстырып қосуды қосады және кластер конфигурациясын түзетеді.

Қызықты? Олай болса, кесудің астында біз сізге бәрін айтып, көрсетеміз.

Мысалдан бастайық

Біз рөліміздің функционалдығының бір бөлігін ғана қарастырамыз. Сіз әрқашан оның барлық мүмкіндіктері мен енгізу параметрлерінің толық сипаттамасын таба аласыз құжаттама. Бірақ оны жүз рет көргенше, бір рет көрген дұрыс, сондықтан шағын қолданбаны орналастырайық.

Tarantool картриджі бар оқу құралы банк клиенттері мен олардың шоттары туралы ақпаратты сақтайтын, сондай-ақ HTTP арқылы деректерді басқару үшін API қамтамасыз ететін шағын Cartridge қолданбасын жасау. Бұған қол жеткізу үшін қосымша екі ықтимал рөлді сипаттайды: api и storage, ол даналарға тағайындалуы мүмкін.

Картридждің өзі процестерді іске қосу туралы ештеңе айтпайды, ол тек іске қосылған даналарды конфигурациялау мүмкіндігін береді. Қалғанын пайдаланушы өзі орындауы керек: конфигурация файлдарын реттеу, қызметтерді іске қосу және топологияны конфигурациялау. Бірақ біз мұның бәрін жасамаймыз; Ansible мұны біз үшін жасайды.

Сөзден іске

Сонымен, қосымшаны екі виртуалды машинаға орналастырып, қарапайым топологияны орнатайық:

  • Репликасет app-1 рөлін жүзеге асыратын болады apiрөлді қамтиды vshard-router. Мұнда бір ғана мысал болады.
  • Репликасет storage-1 рөлін жүзеге асырады storage (және сонымен бірге vshard-storage), мұнда біз әртүрлі машиналардан екі дананы қосамыз.

Қолданбаларды Tarantool картриджіне оңай және табиғи түрде орналастырыңыз (1-бөлім)

Мысалды іске қосу үшін бізге қажет Вагрант и Қажет (2.8 немесе одан жоғары нұсқасы).

Рөлдің өзі Ansible Galaxy. Бұл жұмысыңызды бөлісуге және дайын рөлдерді пайдалануға мүмкіндік беретін репозиторий.

Репозиторийді мысалмен клондаймыз:

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

Біз виртуалды машиналарды көтереміз:

$ vagrant up

Tarantool картриджінің маңызды рөлін орнатыңыз:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Орнатылған рөлді іске қосыңыз:

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

Ойын кітабының орындалуын күтеміз, өтіңіз http://localhost:8181/admin/cluster/dashboard және нәтижеден ләззат алыңыз:

Қолданбаларды Tarantool картриджіне оңай және табиғи түрде орналастырыңыз (1-бөлім)

Деректерді жүктеп салуға болады. Керемет, иә?

Енді онымен қалай жұмыс істеу керектігін анықтап алайық және сонымен бірге топологияға басқа реплика жиынтығын қосамыз.

Оны анықтауға кірісейік

Сонымен не болды?

Біз екі виртуалды машинаны орнаттық және кластерді конфигурациялайтын түсінікті ойын кітабын іске қостық. Файлдың мазмұнын қарастырайық 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

Бұл жерде қызық ештеңе болмайды, келіңіздер деп аталатын ансибилді рөлді іске қосайық tarantool.cartridge.

Барлық маңызды нәрселер (атап айтқанда, кластер конфигурациясы) орналасқан түгендеу-файл 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:

Бізге қажет нәрсе - осы файлдың мазмұнын өзгерту арқылы даналарды және көшірмелерді басқаруды үйрену. Содан кейін біз оған жаңа бөлімдерді қосамыз. Оларды қайда қосу керектігін шатастырмау үшін сіз осы файлдың соңғы нұсқасын көре аласыз, hosts.updated.yml, ол мысал репозиторийінде орналасқан.

Даналарды басқару

Ansible терминдерінде әрбір данасы хост (аппараттық сервермен шатастырмау керек), яғни. Ansible басқаратын инфрақұрылымдық түйін. Әрбір хост үшін біз қосылым параметрлерін көрсете аламыз (мысалы ansible_host и ansible_user), сонымен қатар дананың конфигурациясы. Даналардың сипаттамасы бөлімде берілген hosts.

Дана конфигурациясын қарастырайық storage-1:

all:
  vars:
    ...

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

  ...

Айнымалыда config біз дананың параметрлерін анықтадық - advertise URI и HTTP port.
Төменде дананың параметрлері берілген app-1 и storage-1-replica.

Біз Ansible-ге әрбір данаға қосылым параметрлерін айтуымыз керек. Даналарды виртуалды машина топтарына топтау қисынды болып көрінеді. Осы мақсатта мысалдар топтарға біріктіріледі host1 и host2, және бөлімдегі әр топта vars мәндері көрсетілген ansible_host и ansible_user бір виртуалды машина үшін. Және бөлімде hosts — осы топқа кіретін хосттар (басқа даналар):

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:

Біз өзгере бастаймыз hosts.yml. Тағы екі дананы қосайық, storage-2-replica бірінші виртуалды машинада және storage-2 Екіншісінде:

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

Ойнату кітабын іске қосыңыз:

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

Опцияға назар аударыңыз --limit. Әрбір кластер данасы Ansible терминдерінде хост болғандықтан, оқу кітабын орындау кезінде қандай даналарды конфигурациялау керектігін нақты көрсете аламыз.

Web UI дегенге оралу http://localhost:8181/admin/cluster/dashboard және біздің жаңа мысалдарды қараңыз:

Қолданбаларды Tarantool картриджіне оңай және табиғи түрде орналастырыңыз (1-бөлім)

Осымен тоқтап қалмай, топологияны басқаруды меңгерейік.

Топологияны басқару

Жаңа даналарды реплика жиынына біріктірейік storage-2. Жаңа топ қосайық replicaset_storage_2 және ұқсастығы бойынша оның айнымалыларындағы репликасет параметрлерін сипаттаңыз replicaset_storage_1. Бөлімде hosts Осы топқа қандай даналардың қосылатынын көрсетейік (яғни біздің реплика жинағы):

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

Ойын кітабын қайтадан бастайық:

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

Параметрде --limit Бұл жолы біз репликасетімізге сәйкес топтың атын бердік.

Опцияны қарастырайық tags.

Біздің рөліміз келесі тегтермен белгіленген әртүрлі тапсырмаларды ретімен орындайды:

  • cartridge-instances: даналарды басқару (конфигурация, мүшелікке қосылу);
  • cartridge-replicasets: топологияны басқару (репликасеттерді басқару және кластерден даналарды біржола жою (шығару));
  • cartridge-config: басқа кластер параметрлерін басқару (vshard жүктеу, автоматты ауыстырып қосу режимі, авторизация параметрлері және қолданба конфигурациясы).

Біз жұмыстың қай бөлігін орындағымыз келетінін нақты көрсете аламыз, содан кейін рөл қалған тапсырмаларды өткізіп жібереді. Біздің жағдайда біз тек топологиямен жұмыс жасағымыз келеді, сондықтан біз белгіледік cartridge-replicasets.

Еңбегіміздің нәтижесін бағалайық. Жаңа көшірме жиынын табамыз http://localhost:8181/admin/cluster/dashboard.

Қолданбаларды Tarantool картриджіне оңай және табиғи түрде орналастырыңыз (1-бөлім)

Hooray!

Даналардың және реплика жиындарының конфигурациясын өзгертумен тәжірибе жасап, кластер топологиясының қалай өзгеретінін көріңіз. Сіз әртүрлі операциялық сценарийлерді сынап көре аласыз, мысалы: жылжымалы жаңарту немесе көбейтіңіз memtx_memory. Рөл қолданбаңыздың ықтимал тоқтау уақытын азайту үшін дананы қайта іске қоспай-ақ мұны істеуге тырысады.

Жүгіруді ұмытпаңыз vagrant haltвиртуалды машиналармен жұмыс істеуді аяқтаған кезде оларды тоқтату үшін.

Сорғыштың астында не бар?

Мұнда мен сізге эксперименттер кезінде ансильдік рөлдің астында не болғаны туралы көбірек айтып беремін.

Картридж қолданбасын қадам бойынша қолдануды қарастырайық.

Буманы орнату және даналарды іске қосу

Алдымен пакетті серверге жеткізіп, орнату керек. Қазіргі уақытта рөл RPM және DEB пакеттерімен жұмыс істей алады.

Әрі қарай біз даналарды іске қосамыз. Мұнда бәрі өте қарапайым: әрбір данасы бөлек systemd-қызмет. Мен сізге мысал келтіремін:

$ systemctl start myapp@storage-1

Бұл пәрмен дананы іске қосады storage-1 бағдарламалар myapp. Іске қосылған данасы оны іздейді конфигурация в /etc/tarantool/conf.d/. Дана журналдарын пайдалану арқылы көруге болады journald.

Бірлік файлы /etc/systemd/system/[email protected] systemd қызметі пакетпен бірге жеткізіледі.

Ansible пакеттерін орнатуға және жүйелік қызметтерді басқаруға арналған кірістірілген модульдерге ие; біз мұнда жаңа ештеңе ойлап тапқан жоқпыз.

Кластер топологиясын орнату

Қызық осы жерден басталады. Келісемін, пакеттерді орнату және іске қосу үшін арнайы Ansible рөлімен алаңдау таңқаларлық болар еді systemd-қызметтер.

Кластерді қолмен конфигурациялауға болады:

  • Бірінші опция: Web UI ашыңыз және түймелерді басыңыз. Бұл бірнеше даналарды бір реттік бастау үшін өте қолайлы.
  • Екінші нұсқа: GraphQl API пайдалануға болады. Мұнда сіз әлдеқашан бір нәрсені автоматтандыруға болады, мысалы, Python тілінде сценарий жазу.
  • Үшінші нұсқа (еріксіздер үшін): серверге өтіңіз, пайдаланып даналардың біріне қосылыңыз tarantoolctl connect және Lua модулімен барлық қажетті манипуляцияларды орындаңыз cartridge.

Біздің өнертабыстың басты міндеті - дәл осы, сіз үшін жұмыстың ең қиын бөлігі.

Ansible өзіңіздің модуліңізді жазуға және оны рөлде пайдалануға мүмкіндік береді. Біздің рөліміз әртүрлі кластер құрамдастарын басқару үшін осындай модульдерді пайдаланады.

Бұл қалай жұмыс істейді? Декларативті конфигурацияда кластердің қалаған күйін сипаттайсыз және рөл әрбір модульді кіріс ретінде конфигурация бөлімімен қамтамасыз етеді. Модуль кластердің ағымдағы күйін алады және оны кіріс ретінде алынғанмен салыстырады. Әрі қарай, кластерді қажетті күйге әкелетін даналардың бірінің ұясы арқылы код іске қосылады.

Нәтижелері

Бүгін біз Tarantool картриджіне қосымшаңызды қалай орналастыру керектігін және қарапайым топологияны орнатуды айттық және көрсеттік. Мұны істеу үшін біз Ansible-ді қолдандық - пайдалану оңай және бір уақытта көптеген инфрақұрылым түйіндерін (біздің жағдайда кластер даналары) конфигурациялауға мүмкіндік беретін қуатты құрал.

Жоғарыда біз Ansible көмегімен кластер конфигурациясын сипаттаудың көптеген тәсілдерінің бірін қарастырдық. Жалғастыруға дайын сезінген кезде, зерттеңіз үздік тәжірибе ойын кітаптарын жазу туралы. Топологияңызды пайдалану арқылы басқару оңайырақ болуы мүмкін group_vars и host_vars.

Жақында біз сізге топологиядан даналарды біржола жою (шығарып тастау), vshard жүктеуді, автоматты ауыстырып қосу режимін басқаруды, авторизацияны конфигурациялауды және кластер конфигурациясын түзетуді айтамыз. Әзірше өз бетінше оқуға болады құжаттама және кластер параметрлерін өзгертумен тәжірибе жасаңыз.

Егер бірдеңе жұмыс істемесе, міндетті түрде орындаңыз маған білдір мәселе туралы бізге. Біз бәрін тез реттейміз!

Ақпарат көзі: www.habr.com

пікір қалдыру