在 Tarantool Cartridge 上輕鬆自然地部署應用程序(第 1 部分)

在 Tarantool Cartridge 上輕鬆自然地部署應用程序(第 1 部分)

我們已經討論過 Tarantool 墨盒,它允許您開發分佈式應用程序並將其打包。 沒有什麼剩下了:學習如何部署和管理這些應用程序。 別擔心,我們已經想好了一切! 我們匯總了使用 Tarantool Cartridge 的所有最佳實踐,並撰寫了 ansible 角色,它將把包分解為服務器,啟動實例,將它們組合成集群,配置授權,引導 vshard,啟用自動故障轉移並修補集群配置。

有趣的? 然後我問下切,我們會告訴並展示一切。

讓我們從一個例子開始

我們將僅涵蓋我們角色的部分功能。 您始終可以在中找到其所有功能和輸入參數的完整描述 文件。 但嘗試一次勝過看一百次,所以讓我們部署一個小型應用程序。

Tarantool 墨盒有 教程 創建一個小型 Cartridge 應用程序,用於存儲有關銀行客戶及其帳戶的信息,並提供用於通過 HTTP 管理數據的 API。 為此,該應用程序描述了兩種可能的角色: api и storage可以分配給實例。

Cartridge 本身沒有說明如何啟動進程,它只提供配置已運行實例的功能。 用戶必須自己完成剩下的工作:分解配置文件、啟動服務並設置拓撲。 但我們不會做這一切,Ansible 會為我們做。

從言語到行動

因此,讓我們將應用程序部署到兩個虛擬機並設置一個簡單的拓撲:

  • 複製集 app-1 將扮演角色 api其中包括角色 vshard-router。 這裡只有一個實例。
  • 複製集 storage-1 執行角色 storage (同時 vshard-storage),這裡我們添加來自不同機器的兩個實例。

在 Tarantool Cartridge 上輕鬆自然地部署應用程序(第 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 Cartridge ansible 角色:

$ ansible-galaxy install tarantool.cartridge,1.0.1

運行已安裝的角色:

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

我們等待playbook執行結束,進入 http://localhost:8181/admin/cluster/dashboard 並享受結果:

在 Tarantool Cartridge 上輕鬆自然地部署應用程序(第 1 部分)

可以倒數據。 很酷,對吧?

現在讓我們弄清楚如何使用它,同時將另一個副本集添加到拓撲中。

我們開始明白

所以發生了什麼事?

我們啟動了兩個虛擬機並運行一個 ansible playbook 來設置我們的集群。 我們看一下文件的內容 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 而言,每個實例都是一個主機(不要與 Iron 服務器混淆),即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 術語中都是一個主機,因此我們可以明確指定在運行 playbook 時應配置哪些實例。

返回網頁用戶界面 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 halt當您使用完虛擬機後停止它們。

引擎蓋下是什麼?

在這裡,我將更多地討論我們實驗期間 ansible 角色背後發生的事情。

讓我們逐步看一下如何部署 Cartridge 應用程序。

安裝包並啟動實例

首先,您需要將包傳送到服務器並安裝它。 現在該角色可以使用 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 並單擊按鈕。 對於一次性啟動多個實例來說,是相當合適的。
  • 第二個選項:您可以使用 GraphQl API。 在這裡,您已經可以自動化某些操作,例如,用 Python 編寫腳本。
  • 第三種選擇(對於精神堅強的人):轉到服務器,使用以下命令連接到實例之一 tarantoolctl connect 並使用 Lua 模塊執行所有必要的操作 cartridge.

我們發明的主要任務就是為您完成這項工作中最困難的部分。

Ansible 允許您編寫自己的模塊並在角色中使用它。 我們的角色使用這些模塊來管理集群的各個組件。

怎麼運行的? 您在聲明性配置中描述集群的所需狀態,角色將其配置部分作為輸入提供給每個模塊。 該模塊接收集群的當前狀態並將其與輸入進行比較。 接下來,通過其中一個實例的套接字運行代碼,這將使集群達到所需的狀態。

結果

今天我們講述並展示瞭如何在 Tarantool Cartridge 上部署應用程序並設置簡單的拓撲。 為此,我們使用了 Ansible,這是一個功能強大的工具,易於使用,允許您同時配置許多基礎設施節點(在我們的例子中,這些是集群實例)。

上面,我們討論了使用 Ansible 描述集群配置的多種方法之一。 一旦您知道自己已準備好繼續前進,請學習 最佳實踐 用於編寫劇本。 您可能會發現管理拓撲更方便 group_vars и host_vars.

很快我們將告訴您如何從拓撲中永久刪除(驅逐)實例、引導 vshard、管理自動故障轉移模式、配置授權和修補集群配置。 在此期間,你可以自學 文件 並嘗試改變集群參數。

如果有什麼不起作用,請確保 通知 我們關於這個問題。 我們很快就會把它打破!

來源: www.habr.com

添加評論