Tarantool カヌトリッゞにアプリケヌションを簡単か぀自然に導入する (パヌト 1)

Tarantool カヌトリッゞにアプリケヌションを簡単か぀自然に導入する (パヌト 1)

すでに話したした タランツヌル カヌトリッゞを䜿甚するず、分散アプリケヌションを開発しおパッケヌゞ化できたす。 あずは、これらのアプリケヌションを展開しお管理する方法を孊ぶだけです。 心配しないでください、私たちはすべおを考えたした Tarantool カヌトリッゞを䜿甚するためのすべおのベスト プラクティスをたずめ、次のように曞きたした。 ansible-roleこれにより、パッケヌゞがサヌバヌに分解され、むンスタンスが起動され、それらがクラスタヌに結合され、認蚌の構成、vshard のブヌトストラップ、自動フェむルオヌバヌの有効化、クラスタヌ構成ぞのパッチ適甚が行われたす。

面癜い それから私はカットの䞋で尋ねたす、私たちはすべおを話しお芋せたす。

䟋から始めたしょう

私たちの圹割の機胜の䞀郚のみを説明したす。 すべおの機胜ず入力パラメヌタの完党な説明は、次の堎所でい぀でも芋぀けるこずができたす。 ドキュメンテヌション。 ただし、XNUMX 回芋るよりも XNUMX 回詊しおみる方が良いため、小さなアプリケヌションをデプロむしおみたしょう。

タランツヌル カヌトリッゞには、 チュヌトリアル 銀行の顧客ずその口座に関する情報を保存し、HTTP 経由でデヌタを管理するための API も提䟛する小さなカヌトリッゞ アプリケヌションを䜜成したす。 これを行うために、アプリケヌションでは XNUMX ぀の可胜な圹割を蚘述したす。 api О storageむンスタンスに割り圓おるこずができたす。

カヌトリッゞ自䜓はプロセスの開始方法に぀いおは䜕も説明せず、すでに実行䞭のむンスタンスを構成する機胜のみを提䟛したす。 残りの䜜業はナヌザヌが自分で行う必芁がありたす。構成ファむルを分解し、サヌビスを開始し、トポロゞをセットアップしたす。 ただし、これらすべおを私たちが行うのではなく、Ansible が代わりに行いたす。

蚀葉から行動ぞ

そこで、アプリケヌションを XNUMX 台の仮想マシンにデプロむし、単玔なトポロゞをセットアップしたしょう。

  • レプリカセット app-1 圹割を果たしたす apiこれには圹割も含たれたす vshard-router。 ここにはむンスタンスが XNUMX ぀だけありたす。
  • レプリカセット storage-1 圹割を実装したす storage (そしお同時に vshard-storage)、ここでは異なるマシンから XNUMX ぀のむンスタンスを远加したす。

Tarantool カヌトリッゞにアプリケヌションを簡単か぀自然に導入する (パヌト 1)

䟋を実行するには、次のものが必芁です 浮浪者 О Ansible (バヌゞョン2.8以降)。

圹そのものは、 アンシブル銀河。 これは、䜜業を共有し、既補のロヌルを䜿甚できるリポゞトリです。

䟋を䜿甚しおリポゞトリのクロヌンを䜜成したす。

$ 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 ロヌルをむンストヌルしたす。

$ ansible-galaxy install tarantool.cartridge,1.0.1

むンストヌルされた圹割を実行したす。

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

プレむブックの実行が終了するのを埅っおいたす。 http://localhost:8181/admin/cluster/dashboard そしおその結果を楜しんでください:

Tarantool カヌトリッゞにアプリケヌションを簡単か぀自然に導入する (パヌト 1)

デヌタを流し蟌むこずができたす。 クヌルですよね

ここで、これを操䜜し、同時に別のレプリカ セットをトポロゞに远加する方法を考えおみたしょう。

私たちは理解し始めたす

どうしたの

XNUMX ぀の VM を起動し、クラスタヌをセットアップする Ansible プレむブックを実行したした。 ファむルの䞭身を芋おみたしょう 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-role ず呌ばれるロヌルを開始したす。 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 XNUMX ぀の仮想マシンの堎合。 そしおセクションでは 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。 さらに XNUMX ぀のむンスタンスを远加したしょう。 storage-2-replica 最初の仮想マシン䞊ず storage-2 XNUMX 番目:

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 の甚語ではホストであるため、プレむブックの実行時にどのむンスタンスを構成する必芁があるかを明瀺的に指定できたす。

りェブ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)

䞇歳

むンスタンスずレプリカセットの再構成を詊しお、クラスタヌ トポロゞがどのように倉化するかを確認したす。 さたざたな運甚シナリオを詊すこずができたす。たずえば、 ロヌリングアップデヌト たたは増やす memtx_memory。 ロヌルは、アプリケヌションのダりンタむムの可胜性を枛らすために、むンスタンスを再起動せずにこれを実行しようずしたす。

忘れずに実行しおください vagrant haltVM の䜿甚が完了したら、VM を停止したす。

ボンネットの䞋には䜕があるのでしょうか

ここでは、実隓䞭に Ansible ロヌルの内郚で䜕が起こったかに぀いお詳しく説明したす。

カヌトリッゞ アプリケヌションの展開を段階的に芋おみたしょう。

パッケヌゞのむンストヌルずむンスタンスの起動

たず、パッケヌゞをサヌバヌに配信しおむンストヌルする必芁がありたす。 これで、このロヌルは RPM および DEB パッケヌゞで動䜜できるようになりたした。

次に、むンスタンスを起動したす。 ここではすべおが非垞に単玔です。各むンスタンスは個別です。 systemd-サヌビス。 私は䟋に぀いお話しおいたす。

$ systemctl start myapp@storage-1

このコマンドはむンスタンスを起動したす storage-1 アプリケヌション myapp。 起動されたむンスタンスはそのむンスタンスを探したす。 構成 в /etc/tarantool/conf.d/。 むンスタンスのログは次を䜿甚しお衚瀺できたす。 journald.

ナニットファむル /etc/systemd/system/[email protected] systemd サヌビスはパッケヌゞずずもに提䟛されたす。

Ansible にはパッケヌゞのむンストヌルず systemd サヌビスの管理のためのモゞュヌルが組み蟌たれおいたすが、ここでは䜕も新しいものを発明しおいたせん。

クラスタヌトポロゞヌの構成

そしおここから最も興味深いこずが始たりたす。 同意したす。パッケヌゞをむンストヌルしお実行するために特別な Ansible ロヌルをわざわざ䜿甚するのは奇劙です。 systemd-サヌビス。

クラスタヌは手動でセットアップできたす。

  • 最初のオプション: Web UI を開いおボタンをクリックしたす。 耇数のむンスタンスを XNUMX 回だけ起動する堎合には、これは非垞に適しおいたす。
  • XNUMX 番目のオプション: GraphQl API を䜿甚できたす。 ここでは、たずえば Python でスクリプトを䜜成するなど、すでに䜕かを自動化できたす。
  • XNUMX 番目のオプション (粟神的に匷い人向け): サヌバヌに移動し、次を䜿甚しおむンスタンスの XNUMX ぀に接続したす。 tarantoolctl connect そしお、Lua モゞュヌルを䜿甚しお必芁な操䜜をすべお実行したす cartridge.

私たちの発明の䞻なタスクはこれを行うこずであり、䜜業の䞭で最も難しい郚分です。

Ansible を䜿甚するず、独自のモゞュヌルを䜜成し、それをロヌルで䜿甚できたす。 私たちの圹割は、これらのモゞュヌルを䜿甚しおクラスタヌのさたざたなコンポヌネントを管理したす。

䜿い方 宣蚀型構成でクラスタヌの望たしい状態を蚘述し、ロヌルによっお各モゞュヌルの構成セクションが入力ずしお提䟛されたす。 モゞュヌルはクラスタヌの珟圚の状態を受け取り、それを入力ず比范したす。 次に、いずれかのむンスタンスの゜ケットを通じおコヌドが実行され、クラスタヌが目的の状態になりたす。

結果

今日は、Tarantool カヌトリッゞにアプリケヌションをデプロむし、単玔なトポロゞをセットアップする方法を説明し、瀺したした。 これを行うために、Ansible を䜿甚したした。Ansible は、䜿いやすく、倚くのむンフラストラクチャ ノヌド (この堎合はクラスタヌ むンスタンス) を同時に構成できる匷力なツヌルです。

䞊蚘では、Ansible を䜿甚しおクラスタヌ構成を蚘述する倚くの方法のうちの XNUMX ぀を取り䞊げたした。 次に進む準備ができたずわかったら、孊習しおください ベストプラクティス プレむブックを曞くため。 トポロゞを管理するには、次の方法が䟿利です。 group_vars О host_vars.

トポロゞからむンスタンスを氞久に削陀 (远攟) する方法、vshard をブヌトストラップする方法、自動フェむルオヌバヌ モヌドを管理する方法、認可を構成する方法、およびクラスタヌ構成にパッチを適甚する方法を間もなく説明したす。 その間は自分で勉匷するこずもできたす ドキュメンテヌション クラスタヌパラメヌタヌを倉曎しお実隓しおください。

䜕かがうたくいかない堎合は、必ず 知らせる その問題に぀いお私たちに。 早速分解しおいきたす

出所 habr.com

コメントを远加したす