Tarantool Cartridge дээр програмуудыг хялбар бөгөөд байгалийн байдлаар байрлуулах (1-р хэсэг)

Tarantool Cartridge дээр програмуудыг хялбар бөгөөд байгалийн байдлаар байрлуулах (1-р хэсэг)

Бид аль хэдийн ярьсан Tarantool сум, энэ нь тараагдсан програмуудыг хөгжүүлж, тэдгээрийг багцлах боломжийг олгодог. Юу ч үлдээгүй: эдгээр програмуудыг хэрхэн байрлуулж, удирдах талаар суралцаарай. Санаа зоволтгүй, бид бүгдийг бодсон! Бид Tarantool Cartridge-тэй ажиллах шилдэг туршлагуудыг нэгтгэж, бичсэн хариуцлагатай үүрэг, энэ нь багцыг сервер болгон задалж, жишээнүүдийг эхлүүлж, тэдгээрийг кластер болгон нэгтгэж, зөвшөөрлийг тохируулах, ачаалах vshard, автомат шилжүүлэлтийг идэвхжүүлж, кластерийн тохиргоог нөхөх болно.

Сонирхолтой юу? Дараа нь би захын доор асууж, бид бүгдийг хэлж, харуулах болно.

Нэг жишээгээр эхэлье

Бид үүргийнхээ зөвхөн нэг хэсгийг л авч үзэх болно. Та түүний бүх функцууд болон оролтын параметрүүдийн бүрэн тайлбарыг үргэлж эндээс олох боломжтой баримт бичиг. Гэхдээ зуу дахин үзсэнээс нэг удаа оролдсон нь дээр, тиймээс нэг жижиг хэрэглүүр ажиллуулъя.

Tarantool Cartridge байна заавар Банкны харилцагчид болон тэдний дансны талаарх мэдээллийг хадгалах, мөн HTTP-ээр дамжуулан өгөгдлийг удирдах API-ээр хангадаг жижиг Cartridge програмыг бий болгох. Үүнийг хийхийн тулд програм нь хоёр боломжит үүргийг тодорхойлсон: api и storageтохиолдлуудад оноож болно.

Cartridge нь өөрөө процессыг хэрхэн эхлүүлэх талаар юу ч хэлдэггүй бөгөөд энэ нь зөвхөн ажиллаж байгаа тохиолдлуудыг тохируулах боломжийг олгодог. Хэрэглэгч үлдсэнийг нь өөрөө хийх ёстой: тохиргооны файлуудыг задлах, үйлчилгээг эхлүүлэх, топологийг тохируулах. Гэхдээ бид энэ бүгдийг хийхгүй, Ansible бидний төлөө хийх болно.

Үгнээс нь үйлдэл хүртэл

Тиймээс, програмаа хоёр виртуал машинд байрлуулж, энгийн топологийг тохируулцгаая.

  • Хуулбарлах багц app-1 дүрд тоглох болно apiүүнд үүрэг багтдаг vshard-router. Энд зөвхөн нэг тохиолдол байх болно.
  • хуулбарласан багц storage-1 үүргийг хэрэгжүүлдэг storage (мөн нэгэн зэрэг vshard-storage), энд бид өөр өөр машинуудын хоёр жишээг нэмнэ.

Tarantool Cartridge дээр програмуудыг хялбар бөгөөд байгалийн байдлаар байрлуулах (1-р хэсэг)

Жишээ ажиллуулахын тулд бидэнд хэрэгтэй Vagrant и Алгасах (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 Cartridge-г суулгах боломжтой:

$ ansible-galaxy install tarantool.cartridge,1.0.1

Суулгасан үүргийг ажиллуулна уу:

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

Бид тоглоомын дэвтрийн гүйцэтгэлийн төгсгөлийг хүлээж байна, очно уу http://localhost:8181/admin/cluster/dashboard мөн үр дүнг таашаал аваарай:

Tarantool Cartridge дээр програмуудыг хялбар бөгөөд байгалийн байдлаар байрлуулах (1-р хэсэг)

Та өгөгдөл асгаж болно. Гайхалтай, тийм үү?

Одоо үүнтэй хэрхэн ажиллахаа олж мэдье, мөн үүнтэй зэрэгцэн топологид өөр нэг хуулбарыг нэмье.

Бид ойлгож эхэлдэг

Тэгээд юу болсон бэ?

Бид хоёр VM-ийг ажиллуулж, кластераа тохируулах боломжтой тоглоомын номыг ажиллуулж байна. Файлын агуулгыг харцгаая 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, энэ нь жишээ репозиторт байгаа.

Instance Management

Ansible-ийн хувьд жишээ бүр нь хост (төмөр сервертэй андуурч болохгүй), i.e. 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-ийн нэр томъёогоор хост байдаг тул бид тоглуулах номыг ажиллуулахдаа аль тохиолдлуудыг тохируулахыг тодорхой зааж өгч болно.

Вэб UI руу буцах http://localhost:8181/admin/cluster/dashboard мөн бидний шинэ тохиолдлуудыг ажигла:

Tarantool Cartridge дээр програмуудыг хялбар бөгөөд байгалийн байдлаар байрлуулах (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 Cartridge дээр програмуудыг хялбар бөгөөд байгалийн байдлаар байрлуулах (1-р хэсэг)

Баяртай!

Инстанцууд болон хуулбаруудыг дахин тохируулах талаар туршилт хийж, кластер топологи хэрхэн өөрчлөгдөж байгааг хараарай. Та янз бүрийн үйлдлийн хувилбаруудыг туршиж үзэж болно, жишээлбэл, гулсмал шинэчлэлт эсвэл нэмэгдүүлэх memtx_memory. Энэ үүрэг нь таны аппликешны сул зогсолтыг багасгахын тулд жишээг дахин эхлүүлэхгүйгээр үүнийг хийхийг оролдох болно.

Гүйхээ бүү мартаарай vagrant haltVM-уудыг ашиглаж дууссаны дараа зогсоох.

Дээлний доор юу байна?

Туршилтын үеэр би дүрийн далд дор юу тохиолдсон талаар энд дэлгэрэнгүй ярих болно.

Cartridge програмыг алхам алхмаар байршуулахыг харцгаая.

Багцыг суулгаж, жишээг эхлүүлж байна

Эхлээд та багцаа серверт хүргэж, суулгах хэрэгтэй. Одоо үүрэг нь RPM болон DEB багцуудтай ажиллах боломжтой.

Дараа нь бид тохиолдлуудыг эхлүүлнэ. Энд бүх зүйл маш энгийн: тохиолдол бүр тусдаа байдаг systemd-үйлчилгээ. Би жишээний тухай ярьж байна:

$ systemctl start myapp@storage-1

Энэ тушаал нь жишээг эхлүүлэх болно storage-1 апп-ууд myapp. Эхэлсэн инстанс нь түүнийг хайх болно тохиргоо в /etc/tarantool/conf.d/. Жишээ логуудыг ашиглан харж болно journald.

Нэгж файл /etc/systemd/system/[email protected] системийн үйлчилгээний хувьд багцын хамт хүргэгдэнэ.

Ansible нь багц суулгах, системийн үйлчилгээг удирдахад зориулагдсан модулиудтай тул бид энд шинэ зүйл зохион бүтээгээгүй.

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

Эндээс хамгийн сонирхолтой нь эхэлнэ. Зөвшөөрч байна, багцуудыг суулгах, ажиллуулах тусгай үүрэг хариуцлагын талаар санаа зовох нь хачирхалтай байх болно systemd-үйлчилгээ.

Та кластерыг гараар тохируулж болно:

  • Эхний сонголт: Web UI-г нээж, товчлуурууд дээр дарна уу. Хэд хэдэн тохиолдлыг нэг удаа эхлүүлэхэд энэ нь маш тохиромжтой.
  • Хоёрдахь сонголт: та GraphQl API ашиглаж болно. Энд та аль хэдийн ямар нэг зүйлийг автоматжуулж болно, жишээлбэл, Python дээр скрипт бичиж болно.
  • Гурав дахь сонголт (хүчирхэг хүмүүсийн хувьд): сервер рүү очиж, ашиглаж буй тохиолдлуудын аль нэгэнд холбогдоно уу tarantoolctl connect мөн Lua модулийн тусламжтайгаар шаардлагатай бүх залруулга хийх cartridge.

Бидний шинэ бүтээлийн гол ажил бол үүнийг хийх явдал бөгөөд таны хувьд ажлын хамгийн хэцүү хэсэг юм.

Ansible нь танд өөрийн модулийг бичиж, дүрд ашиглах боломжийг олгодог. Бидний үүрэг эдгээр модулиудыг кластерын янз бүрийн бүрэлдэхүүн хэсгүүдийг удирдахад ашигладаг.

Хэрхэн ажилладаг? Та кластерын хүссэн төлөвийг тунхаглалын тохиргоонд дүрслэх ба үүрэг нь модуль бүрийг өөрийн тохиргооны хэсгийг оролт болгон өгдөг. Модуль нь кластерын одоогийн төлөвийг хүлээн авч, оролттой харьцуулдаг. Дараа нь жишээнүүдийн аль нэгнийх нь залгуураар кодыг ажиллуулж, кластерыг хүссэн төлөвт хүргэдэг.

Үр дүн

Өнөөдөр бид Tarantool Cartridge дээр програмаа хэрхэн байрлуулж, энгийн топологийг тохируулах талаар хэлж, үзүүлэв. Үүнийг хийхийн тулд бид ашиглахад хялбар хүчирхэг хэрэгсэл болох Ansible-г ашигласан бөгөөд олон дэд бүтцийн зангилаануудыг нэгэн зэрэг тохируулах боломжийг олгодог (манай тохиолдолд эдгээр нь кластерийн тохиолдол юм).

Дээр бид Ansible ашиглан кластерийн тохиргоог тайлбарлах олон арга замуудын нэгийг авч үзсэн. Та цааш явахад бэлэн гэдгээ мэдсэнийхээ дараа сур шилдэг туршлагууд тоглоомын ном бичихэд зориулагдсан. Та топологийг удирдах нь илүү тохиромжтой гэж үзэж болно group_vars и host_vars.

Тун удахгүй бид танд топологиос инстанцуудыг хэрхэн бүрмөсөн устгах (хөөх), ачаалах vshard, автомат ажиллагаагүй горимыг удирдах, зөвшөөрлийг тохируулах, кластерийн тохиргоог нөхөх талаар танд хэлэх болно. Энэ хооронд та өөрөө суралцах боломжтой баримт бичиг мөн кластерийн параметрүүдийг өөрчлөх туршилт хийх.

Хэрэв ямар нэг зүйл ажиллахгүй байвал итгэлтэй байгаарай мэдээлэх асуудлын талаар бидэнд. Бид үүнийг хурдан задлах болно!

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх