在 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 或更高版本)。

角色本身就是 Ansible星系。 这是一个存储库,允许您共享您的工作并使用现成的角色。

使用示例克隆存储库:

$ 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、管理自动故障转移模式、配置授权和修补集群配置。 在此期间,你可以自学 文件 并尝试改变集群参数。

如果有什么不起作用,请确保 通知 我们关于这个问题。 我们很快就会把它打破!

来源: habr.com

添加评论