Tarantool картриджине тиркемелерди оңой жана табигый түрдө жайгаштырыңыз (1-бөлүк)

Tarantool картриджине тиркемелерди оңой жана табигый түрдө жайгаштырыңыз (1-бөлүк)

Биз буга чейин сүйлөшкөнбүз Tarantool картридж, бул бөлүштүрүлгөн тиркемелерди иштеп чыгууга жана аларды пакеттөөгө мүмкүндүк берет. Бул тиркемелерди кантип жайгаштырууну жана аларды башкарууну үйрөнүү гана калды. Кабатыр болбоңуз, бизде бардыгы камтылган! Биз Tarantool Cartridge менен иштөө боюнча бардык мыкты тажрыйбаларды чогултуп, жаздык негизги ролупакетти серверлерге таратып, инстанцияларды ишке киргизип, аларды кластерге бириктирип, авторизацияны конфигурациялайт, vshard жүктөө, автоматтык түрдө иштен чыгууну иштетет жана кластердин конфигурациясын жамоо.

Кызыктуубу? Анда сураныч, кесип астында, биз сага баарын айтып жана көрсөтөбүз.

Келгиле, бир мисал менен баштайлы

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

Tarantool картридж бар окуу куралы банк кардарлары жана алардын эсептери жөнүндө маалыматты сактаган, ошондой эле HTTP аркылуу маалыматтарды башкаруу үчүн API камсыз кылган кичинекей Картридж тиркемесин түзүү. Буга жетишүү үчүн, тиркеме эки мүмкүн болгон ролду сүрөттөйт: api и storage, инстанцияларга дайындалышы мүмкүн.

Картридждин өзү процесстерди кантип ишке киргизүү керектиги жөнүндө эч нерсе айтпайт, ал иштеп жаткан инстанцияларды конфигурациялоо мүмкүнчүлүгүн гана берет. Калганын колдонуучу өзү аткарышы керек: конфигурация файлдарын уюштуруу, кызматтарды баштоо жана топологияны конфигурациялоо. Бирок биз мунун баарын кылбайбыз; Ansible биз үчүн жасайт.

иш-аракет кылууга сөздөрдөн

Ошентип, келгиле, биздин тиркемени эки виртуалдык машинага жайгаштырып, жөнөкөй топологияны орнотолу:

  • Replicaset app-1 ролун ишке ашырат apiролун камтыйт vshard-router. Бул жерде бир гана мисал болот.
  • Replicaset storage-1 ролун ишке ашырат storage (жана ошол эле учурда vshard-storage), бул жерде биз ар кандай машиналардан эки нусканы кошобуз.

Tarantool картриджине тиркемелерди оңой жана табигый түрдө жайгаштырыңыз (1-бөлүк)

Мисал иштетүү үчүн бизге керек Бомж и Ansible (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, бул мисал репозиторийде.

Instance Management

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 ойнотуу китебин ишке киргизиңиз:

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

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

Веб интерфейсине кайтуу 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-бөлүк)

Ураа!

Инстанциялардын жана реплика топтомдорунун конфигурациясын өзгөртүү менен эксперимент жасап, кластердин топологиясы кандай өзгөрөрүн көрүңүз. Сиз ар кандай операциялык сценарийлерди сынап көрө аласыз, мис. жаңыртуу же көбөйтүү memtx_memory. Колдонмоңуздун мүмкүн болгон токтоп калуу убактысын азайтуу үчүн ролду инстанцияны кайра баштабастан аткарууга аракет кылат.

Чуркоону унутпаңыз vagrant haltалар менен иштеп бүткөндөн кийин виртуалдык машиналарды токтотуу үчүн.

Капоттун астында эмне бар?

Бул жерде мен биздин эксперименттер учурунда ansible ролу капоттун астында эмне болгондугу жөнүндө көбүрөөк айтып берем.

Картридж тиркемесин этап-этабы менен жайылтууну карап көрөлү.

Пакетти орнотуу жана инстанцияларды баштоо

Алгач пакетти серверге жеткирип, орнотуу керек. Учурда рол RPM жана DEB пакеттери менен иштей алат.

Андан кийин биз инстанцияларды ишке киргизебиз. Бул жерде баары абдан жөнөкөй: ар бир инстанция өзүнчө systemd-кызмат. Мен сизге бир мисал келтирейин:

$ systemctl start myapp@storage-1

Бул буйрук инстанцияны ишке киргизет storage-1 колдонмолор myapp. Ишке киргизилген инстанция аны издейт конфигурация в /etc/tarantool/conf.d/. Instance журналдарын колдонуу менен көрүүгө болот journald.

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

Ansible пакеттерди орнотуу жана системалык кызматтарды башкаруу үчүн орнотулган модулдары бар; биз бул жерде жаңы эч нерсе ойлоп тапкан жокпуз.

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

Бул кызыктуу жерде башталат. Макулмун, пакеттерди орнотуу жана иштетүү үчүн атайын Ansible ролу менен убара болуу кызык болот systemd-сервистер.

Сиз кластерди кол менен конфигурациялай аласыз:

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

Биздин ойлоп табуунун негизги милдети дал ушул ишти аткаруу, сиз үчүн иштин эң татаал бөлүгү.

Ansible өз модулуңузду жазууга жана аны ролдо колдонууга мүмкүндүк берет. Биздин ролубуз ар кандай кластердин компоненттерин башкаруу үчүн ушундай модулдарды колдонот.

Бул кандай иштейт? Сиз декларативдик конфигурацияда кластердин каалаган абалын сүрөттөп бересиз жана рол ар бир модулду киргизүү катары өзүнүн конфигурация бөлүмү менен камсыз кылат. Модуль кластердин учурдагы абалын алат жана аны киргизүү катары кабыл алынган менен салыштырат. Андан кийин инстанциялардын биринин розеткасынан код ишке киргизилет, ал кластерди керектүү абалга алып келет.

натыйжалары

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

Жогоруда биз Ansible аркылуу кластер конфигурациясын сүрөттөөнүн көптөгөн жолдорунун бирин карап чыктык. Уланууга даяр сезилгенден кийин, изилдеңиз мыкты тажрыйбалар окуу китептерин жазуу боюнча. Колдонуу менен топологияңызды башкаруу оңой болушу мүмкүн group_vars и host_vars.

Жакында биз сизге топологиядан инстанцияларды кантип биротоло жок кылууну (чыгаруу), bootstrap vshard, автоматтык түрдө жаңылыштык режимин башкаруу, авторизацияны конфигурациялоо жана кластердин конфигурациясын оңдоону айтып беребиз. Ал ортодо өз алдынча окууга болот документтештирүү жана кластердин параметрлерин өзгөртүү менен эксперимент.

Эгер бир нерсе иштебесе, сөзсүз түрдө аткарыңыз мага билдирип кой көйгөй тууралуу бизге. Биз баарын тез арада чечебиз!

Source: www.habr.com

Комментарий кошуу