Tarantool カートリッジにアプリケーションを簡単に簡単にデプロイする (パート 1)

Tarantool カートリッジにアプリケーションを簡単に簡単にデプロイする (パート 1)

すでに話した タランツールカートリッジこれにより、分散アプリケーションを開発し、パッケージ化することができます。残っているのは、これらのアプリケーションを展開および管理する方法を学ぶことだけです。心配しないでください。私たちが対応します! Tarantoolカートリッジの使用に関するベストプラクティスをすべて収集し、 ansible ロールこれにより、パッケージがサーバーに配布され、インスタンスが起動され、それらがクラスターに結合され、認証が構成され、vshard がブートストラップされ、自動フェイルオーバーが有効になり、クラスター構成にパッチが適用されます。

面白い?それでは、読み進めてください。すべてをお伝えし、お見せします。

例から始めましょう

ここでは、私たちの役割の機能の一部だけを見ていきます。すべての機能と入力パラメータの詳細な説明は、 ドキュメンテーション。しかし、100 回試してみるよりも、1 回試してみる方が良いので、小さなアプリケーションをデプロイしてみましょう。

タランツールカートリッジには チュートリアル 銀行の顧客とその口座に関する情報を保存し、HTTP 経由でデータを管理するための API を提供する小さなカートリッジ アプリケーションの作成について説明します。この目的のために、付録では 2 つの役割について説明します。 api и storageインスタンスに割り当てることができます。

カートリッジ自体は、プロセスを起動する方法については何も述べておらず、すでに実行中のインスタンスを構成する機能のみを提供します。残りの作業はユーザーが自分で行う必要があります。つまり、構成ファイルをレイアウトし、サービスを開始し、トポロジを設定する必要があります。しかし、これらすべてを私たちが行う必要はありません。Ansible が代わりに実行します。

言葉から行動へ

それでは、アプリケーションを 2 台の仮想マシンにデプロイし、シンプルなトポロジを設定しましょう。

  • レプリカセット app-1 役割を遂行する api、役割を含む vshard-router。ここではインスタンスは 1 つだけになります。
  • レプリカセット storage-1 役割を実装する storage (そして同時に vshard-storage)、ここでは異なるマシンから 2 つのインスタンスを追加します。

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)

データを流し込むことができます。かっこいいですよね?

次に、これをどのように操作するかを考え、同時に別のレプリカ セットをトポロジに追加してみましょう。

さあ、理解してみましょう

それで何が起こったのですか?

2 台の仮想マシンをセットアップし、クラスターをセットアップする 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ロールを起動します。 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 1 台の仮想マシンに対して。そして、このセクションでは 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。さらに2つの例を追加してみましょう。 storage-2-replica 最初の仮想マシン上で storage-2 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 の用語ではホストであるため、プレイブックを実行するときにどのインスタンスを構成するかを明示的に指定できます。

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)

万歳!

インスタンスとレプリカ セットの構成を変更して実験し、クラスター トポロジがどのように変化するかを確認します。次のようなさまざまな運用シナリオを試すことができます。 ローリングアップデート または増加 memtx_memory。ロールは、アプリケーションの潜在的なダウンタイムを削減するために、インスタンスを再起動せずにこれを実行しようとします。

走るのを忘れないで vagrant halt仮想マシンでの作業が終了したら、仮想マシンを停止します。

ボンネットの下には何があるのでしょうか?

ここでは、実験中に Ansible ロールの内部で何が起こっていたのかを詳しく説明します。

カートリッジ アプリケーションの展開を段階的に見てみましょう。

パッケージのインストールとインスタンスの起動

まず、パッケージをサーバーに配信してインストールする必要があります。このロールは、RPM および DEB パッケージで動作できるようになりました。

次にインスタンスを起動します。ここではすべてが非常にシンプルです。各インスタンスは独立しています systemd-サービス。例を挙げてみましょう:

$ systemctl start myapp@storage-1

このコマンドはインスタンスを起動します storage-1 アプリケーション myapp。起動されたインスタンスは、 構成 в /etc/tarantool/conf.d/。インスタンスログは以下を使用して表示できます。 journald.

ユニットファイル /etc/systemd/system/myapp@.sevice systemd サービス用のパッケージが提供されます。

Ansible にはパッケージをインストールし、systemd サービスを管理するためのモジュールが組み込まれていますが、ここでは何も新しいものは発明されていません。

クラスタートポロジの設定

そしてここから最も興味深い部分が始まります。同意します。パッケージのインストールと実行のために特別なAnsibleロールを用意するのは奇妙です。 systemd-サービス。

クラスターを手動で構成できます。

  • 最初のオプション: Web UI を開いてボタンをクリックします。複数のインスタンスを一度に起動するのに非常に適しています。
  • 2 番目のオプション: GraphQl API を使用できます。ここでは、たとえば Python でスクリプトを記述するなど、何かを自動化することができます。
  • 3番目のオプション(強い意志を持つ人向け):サーバーに行き、 tarantoolctl connect そして、Luaモジュールで必要な操作をすべて実行します cartridge.

私たちの発明の主な目的は、仕事の中で最も難しいこの部分をお客様に代わって行うことです。

Ansible を使用すると、独自のモジュールを記述し、それをロールで使用することができます。私たちの役割は、このようなモジュールを使用してクラスターのさまざまなコンポーネントを管理することです。

これはどのように作動しますか?宣言型構成でクラスターの望ましい状態を記述し、ロールは各モジュールに構成セクションを入力として提供します。モジュールはクラスターの現在の状態を受信し、それを入力で受信したものと比較します。次に、インスタンスの 1 つのソケットを介してコードが起動され、クラスターが目的の状態になります。

結果

今日は、Tarantool Cartridge にアプリケーションをデプロイし、シンプルなトポロジを設定する方法について説明しました。これを実現するために、私たちは Ansible を使用しました。これは使いやすく、複数のインフラストラクチャ ノード (この場合はクラスター インスタンス) を同時に構成できる強力なツールです。

上記では、Ansible を使用してクラスター構成を記述するさまざまな方法の 1 つについて説明しました。次のステップに進む準備ができたら、勉強しましょう ベストプラクティス プレイブックの作成について。トポロジーを管理するには、 group_vars и host_vars.

すぐに、トポロジからインスタンスを永久に削除 (排除) する方法、vshard をブートストラップする方法、自動フェイルオーバー モードを管理する方法、認証を構成する方法、クラスター構成にパッチを適用する方法について説明します。その間、自分で勉強することができます ドキュメンテーション クラスターパラメータを変更して実験します。

何かがうまくいかない場合は、必ず 知らせる 問題についてご連絡ください。すぐに全て解決します!

出所: habr.com

DDoS 保護機能を備えた信頼性の高いサイト用ホスティング、VPS VDS サーバーを購入する 🔥 DDoS攻撃対策付きの信頼性の高いウェブサイトホスティング、VPS/VDSサーバーを購入しましょう | ProHoster