Барномаҳоро ба Cartridge Tarantool ба осонӣ ва табиӣ ҷойгир кунед (қисми 1)

Барномаҳоро ба Cartridge Tarantool ба осонӣ ва табиӣ ҷойгир кунед (қисми 1)

Мо аллакай дар бораи он сухан ронда будем Картриджи Tarantool, ки ба шумо имкон медиҳад барномаҳои тақсимшуда ва бастабандии онҳо. Танҳо омӯхтани ин барномаҳо ва идоракунии онҳо аст. Парво накунед, мо ҳама чизро фаро гирифтем! Мо ҳама таҷрибаҳои беҳтаринро барои кор бо Cartridge Tarantool ҷамъ кардем ва навиштем роли асосй, ки бастаро ба серверҳо тақсим мекунад, мисолҳоро оғоз мекунад, онҳоро ба кластер муттаҳид мекунад, авторизатсияро танзим мекунад, vshard bootstrap, имкони нокомии худкор ва часби конфигуратсияи кластер.

Ҷолиб? Пас, лутфан, дар зери буриш, мо ба шумо мегӯям ва ҳама чизро ба шумо нишон медиҳем.

Биёед бо як мисол оғоз кунем

Мо танҳо як қисми функсияи нақши худро дида мебароем. Шумо ҳамеша метавонед тавсифи пурраи тамоми қобилиятҳо ва параметрҳои вуруди онро дар хуччатхо. Аммо беҳтар аст, ки як маротиба кӯшиш кунед, то сад маротиба дидан кунед, пас биёед як барномаи хурдро ҷойгир кунем.

Картриджи Tarantool дорад дастур барои эҷоди як замимаи хурди Cartridge, ки маълумот дар бораи мизоҷони бонкӣ ва ҳисобҳои онҳоро нигоҳ медорад ва инчунин API-ро барои идоракунии маълумот тавассути HTTP таъмин мекунад. Барои ноил шудан ба ин, замима ду нақши имконпазирро тавсиф мекунад: api и storage, ки ба инстансияҳо таъин кардан мумкин аст.

Худи картридж дар бораи чӣ гуна оғоз кардани равандҳо чизе намегӯяд, он танҳо қобилияти танзим кардани мисолҳои аллакай иҷрошавандаро фароҳам меорад. Истифодабаранда бояд боқимондаро худаш анҷом диҳад: файлҳои конфигуратсияро тартиб диҳад, хидматҳоро оғоз кунад ва топологияро танзим кунад. Аммо мо ин ҳамаро иҷро намекунем; Ansible онро барои мо мекунад.

Аз гуфтор ба амал

Пас, биёед замимаи худро дар ду мошини виртуалӣ ҷойгир кунем ва топологияи оддиро насб кунем:

  • Маҷмӯаи нусхабардорӣ app-1 рольро ба амал мебарорад api, ки рольро дарбар мегирад vshard-router. Дар ин ҷо танҳо як мисол хоҳад буд.
  • Маҷмӯаи нусхабардорӣ storage-1 рольро ба амал мебарорад storage (ва дар айни замон vshard-storage), дар ин ҷо мо ду мисолро аз мошинҳои гуногун илова мекунем.

Барномаҳоро ба Cartridge Tarantool ба осонӣ ва табиӣ ҷойгир кунед (қисми 1)

Барои иҷро кардани мисол ба мо лозим аст Оворагард и Фаҳмост (версияи 2.8 ё калонтар).

Худи роль дар он аст Galaxy Ansible. Ин як анборест, ки ба шумо имкон медиҳад, ки кори худро мубодила кунед ва нақшҳои тайёрро истифода баред.

Биёед анборро бо мисол клон кунем:

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

Мо мошинҳои виртуалиро баланд мебардорем:

$ vagrant up

Нақши имконпазири Cartridge Tarantool-ро насб кунед:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Нақши насбшударо оғоз кунед:

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

Мо интизорем, ки китоби бозӣ ба анҷом расад, ба http://localhost:8181/admin/cluster/dashboard ва аз натиҷа лаззат баред:

Барномаҳоро ба Cartridge 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

Дар ин ҷо ҳеҷ чизи ҷолибе рӯй намедиҳад, биёед нақши ansible бо номи худро оғоз кунем 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 ва мисолҳои нави моро бубинед:

Барномаҳоро ба Cartridge 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 bootstrapping, ҳолати нокомии худкор, параметрҳои авторизатсия ва конфигуратсияи барнома).

Мо метавонем ба таври возеҳ муайян кунем, ки кадом қисми кореро, ки мо иҷро кардан мехоҳем, пас нақш аз боқимондаи вазифаҳо мегузарад. Дар ҳолати мо, мо мехоҳем танҳо бо топология кор кунем, бинобар ин мо муайян кардем cartridge-replicasets.

Биёед, ба натицаи саъю кушиши худ бахо дихем. Мо як нусхаи навро дар он пайдо мекунем http://localhost:8181/admin/cluster/dashboard.

Барномаҳоро ба Cartridge 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-ро кушоед ва тугмаҳоро клик кунед. Он барои оғози якдафъаинаи якчанд маврид хеле мувофиқ аст.
  • Варианти дуюм: шумо метавонед API-и GraphQl -ро истифода баред. Дар ин ҷо шумо аллакай метавонед чизеро автоматӣ кунед, масалан, дар Python скрипт нависед.
  • Варианти сеюм (барои иродаи қавӣ): ба сервер равед, ба яке аз инстансияҳо пайваст шавед tarantoolctl connect ва бо модули Lua ҳама амалҳои заруриро иҷро кунед cartridge.

Вазифаи асосии ихтироъкории мо махз хамин аст, ки барои шумо душвортарин кисми кор.

Ansible ба шумо имкон медиҳад, ки модули худро нависед ва онро дар нақш истифода баред. Нақши мо чунин модулҳоро барои идоракунии ҷузъҳои гуногуни кластер истифода мебарад.

Он чӣ гуна кор мекунад? Шумо ҳолати дилхоҳи кластерро дар конфигуратсияи декларативӣ тавсиф мекунед ва нақш ҳар як модулро бо бахши конфигуратсияи худ ҳамчун вуруд таъмин мекунад. Модул ҳолати кунунии кластерро қабул мекунад ва онро бо он чизе, ки ҳамчун вуруд гирифта шудааст, муқоиса мекунад. Баъдан, код тавассути розеткаи яке аз инстансияҳо оғоз карда мешавад, ки кластерро ба ҳолати дилхоҳ меорад.

Натиҷаҳо

Имрӯз мо гуфтем ва нишон додем, ки чӣ гуна барномаи худро дар Cartridge Tarantool ҷойгир кардан ва топологияи оддиро насб кардан лозим аст. Барои ин, мо Ansible - як абзори пурқувватеро истифода бурдем, ки истифодааш осон аст ва ба шумо имкон медиҳад ҳамзамон бисёр гиреҳҳои инфрасохторро танзим кунед (дар ҳолати мо, мисолҳои кластер).

Дар боло мо яке аз роҳҳои зиёди тавсифи конфигуратсияи кластерро бо истифода аз Ansible дида баромадем. Вақте ки шумо худро барои ҳаракат кардан омода ҳис мекунед, кашф кунед беҳтарин таҷрибаҳо дар бораи навиштани китобҳои бозӣ. Шумо метавонед бо истифода аз идоракунии топологияи худ осонтар шавед group_vars и host_vars.

Ба зудӣ мо ба шумо мегӯям, ки чӣ гуна инстанҳоро аз топология ба таври доимӣ нест кардан (хориҷ кардан), bootstrap vshard, идора кардани режими интиқоли худкор, танзим кардани авторизатсия ва часпонидани конфигуратсияи кластер. Дар айни замон, шумо метавонед мустақилона таҳсил кунед ҳуҷҷатҳо ва таҷриба бо тағир додани параметрҳои кластер.

Агар чизе кор накунад, боварӣ ҳосил кунед маро огоҳ кунед мо дар бораи мушкилот. Мо ҳама чизро зуд ҳал мекунем!

Манбаъ: will.com

Илова Эзоҳ