
すでに話した これにより、分散アプリケーションを開発し、パッケージ化することができます。残っているのは、これらのアプリケーションを展開および管理する方法を学ぶことだけです。心配しないでください。私たちが対応します! Tarantoolカートリッジの使用に関するベストプラクティスをすべて収集し、 これにより、パッケージがサーバーに配布され、インスタンスが起動され、それらがクラスターに結合され、認証が構成され、vshard がブートストラップされ、自動フェイルオーバーが有効になり、クラスター構成にパッチが適用されます。
面白い?それでは、読み進めてください。すべてをお伝えし、お見せします。
例から始めましょう
ここでは、私たちの役割の機能の一部だけを見ていきます。すべての機能と入力パラメータの詳細な説明は、 。しかし、100 回試してみるよりも、1 回試してみる方が良いので、小さなアプリケーションをデプロイしてみましょう。
タランツールカートリッジには 銀行の顧客とその口座に関する情報を保存し、HTTP 経由でデータを管理するための API を提供する小さなカートリッジ アプリケーションの作成について説明します。この目的のために、付録では 2 つの役割について説明します。 api и storageインスタンスに割り当てることができます。
カートリッジ自体は、プロセスを起動する方法については何も述べておらず、すでに実行中のインスタンスを構成する機能のみを提供します。残りの作業はユーザーが自分で行う必要があります。つまり、構成ファイルをレイアウトし、サービスを開始し、トポロジを設定する必要があります。しかし、これらすべてを私たちが行う必要はありません。Ansible が代わりに実行します。
言葉から行動へ
それでは、アプリケーションを 2 台の仮想マシンにデプロイし、シンプルなトポロジを設定しましょう。
- レプリカセット
app-1役割を遂行するapi、役割を含むvshard-router。ここではインスタンスは 1 つだけになります。 - レプリカセット
storage-1役割を実装するstorage(そして同時にvshard-storage)、ここでは異なるマシンから 2 つのインスタンスを追加します。

この例を実行するには、 и (バージョン2.8以降)。
役割自体は 。これは、開発内容を共有し、既製のロールを使用できるストレージ機能です。
例を使用してリポジトリをクローンしてみましょう。
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0仮想マシンを育てます:
$ vagrant upTarantool カートリッジ Ansible ロールをインストールします。
$ ansible-galaxy install tarantool.cartridge,1.0.1インストールされたロールを起動します。
$ ansible-playbook -i hosts.yml playbook.ymlプレイブックの実行が完了するのを待ってから、 そしてその結果を楽しんでください:

データを流し込むことができます。かっこいいですよね?
次に、これをどのように操作するかを考え、同時に別のレプリカ セットをトポロジに追加してみましょう。
さあ、理解してみましょう
それで何が起こったのですか?
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に戻る そして新しいインスタンスが表示されます:

そこで止まらず、トポロジ管理をマスターしましょう。
トポロジ管理
新しいインスタンスをレプリカセットに結合しましょう 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.
私たちの努力の結果を評価しましょう。新しいレプリカセットを発見 .

万歳!
インスタンスとレプリカ セットの構成を変更して実験し、クラスター トポロジがどのように変化するかを確認します。次のようなさまざまな運用シナリオを試すことができます。 または増加 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
