零担部署Tarantool Cartridge应用程序(第1部分)



我们已经介绍了Tarantool弹药筒 ,使您可以开发和打包分布式应用程序。 现在让我们学习如何部署和控制这些应用程序。 不用担心,一切都在掌控之中! 我们汇集了使用Tarantool Cartridge的所有最佳实践,并编写了Ansible角色 ,该角色将软件包部署到服务器,将实例启动和加入副本集,配置授权,引导vshard,启用自动故障转移和补丁集群配置。

有趣吧? 潜入,检查切口下的详细信息。

从样本开始


让我们仅带您了解角色的某些功能。 您始终可以在文档中找到其所有功能和输入参数的完整说明。 但是,尝试一次总比看到一百次更好,因此让我们部署一个小型应用程序。

Tarantool Cartridge提供了一个教程,用于创建一个小的Cartridge应用程序,该应用程序存储有关银行客户及其帐户的信息,并提供通过HTTP进行数据管理的API。 为此,该应用程序描述了可以分配给实例的两个可能的角色: apistorage

盒式磁带本身没有说明如何启动进程,仅提供了配置运行中实例的机会。 因此,其余的一切取决于用户:分发配置文件,运行服务和配置拓扑。 但是我们不会做所有的事情-Ansible会为我们做这件事。

采取行动


首先,让我们将应用程序部署到两个虚拟机上并设置一个简单的拓扑:

  • app-1副本集将代表包含vshard-router角色的api角色。 只有一个实例。
  • storage-1副本集将代表storage角色(包括vshard-storage角色)-在这里,我们将添加来自不同计算机的两个实例。



要运行该示例,我们需要VagrantAnsible (2.8或更高版本)。

角色本身存储在Ansible Galaxy中 -一个存储库,可让您共享工作并使用现成的角色。

现在克隆样本存储库:

 $ 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 

现在,等到剧本处理完成后,转到http://本地主机:8181 / admin / cluster /仪表板并享受结果:



您现在可以上传数据。 太好了,不是吗?

现在让我们弄清楚如何使用它,我们也可以向拓扑中添加另一个副本集。

深入细节


那么,发生了什么事?

我们启动并运行了两个虚拟机,并启动了配置集群的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 

这里没有有趣的事情发生。 让我们启动名为tarantool.cartridge的Ansible角色。

最重要的事情(即集群配置)在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_hostansible_user )和实例配置。 实例描述在hosts部分中。

让我们研究一下storage-1实例的配置:

 all: vars: ... # INSTANCES hosts: storage-1: config: advertise_uri: '172.19.0.2:3301' http_port: 8181 ... 

config变量中,我们指定了实例参数: advertise URIHTTP port

以下是app-1storage-1-replica实例的参数。

我们应该为Ansible提供每个实例的连接参数。 通过虚拟机对实例进行分组似乎是合理的。 为此,实例在host1host2下分组在一起,并且vars部分中的每个组都包含单个虚拟机的ansible_hostansible_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的主机,因此我们可以在运行剧本时明确指定应配置的实例。

因此,我们返回到Web UI,位于http://本地主机:8181 / admin / cluster / dashboard,并查看我们的新实例:



接下来,让我们掌握拓扑管理。

管理拓扑


让我们将新实例分组到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 :拓扑管理(副本集管理和从群集中永久删除实例)。
  • ettes cartridge-config :控制其他群集参数(vshard引导程序,自动故障转移,授权参数和应用程序配置)。

我们可以明确指定要完成的工作的哪一部分-该角色将跳过其余任务。 在这种情况下,我们只想使用拓扑,因此我们指定了cartridge-replicasets

让我们评估我们努力的结果。 在http:// localhost:8181 / admin / cluster / dashboard中找到新的副本集。





尝试更改实例和副本集的配置,然后查看群集的拓扑如何更改。 您可以尝试不同的用例,例如滚动更新memtx_memory增加。 该角色将尝试执行此操作而无需重新启动实例,以减少应用程序可能的停机时间。

完成虚拟机操作后,不要忘记运行vagrant halt来停止虚拟机。

里面有什么?


在这里,我将详细介绍您在测试过程中Ansible角色的幕后经历。
让我们考虑一下部署Cartridge应用程序的步骤。

安装软件包并启动实例


首先要做的是将软件包交付到服务器并进行安装。 现在,该角色可以与RPM包和DEB包一起使用。

接下来,我们启动实例。 这很简单:每个实例都是一个单独的systemd服务。 例如:

 $ systemctl start myapp@storage-1 

此命令启动myappstorage-1实例
应用程序。 正在运行的实例在/etc/tarantool/conf.d/查找其配置 。 您可以使用journald查看实例日志。

该软件包随附了用于systemd服务的Unit文件/etc/systemd/systemd/myapp@.sevice

Ansible具有用于安装软件包和管理系统服务的内置模块,因此我们在这里没有发明任何新东西。

配置集群拓扑


最激动人心的事情发生在这里。 我相信您会同意,对于安装软件包和运行systemd服务的特殊Ansible角色感到困扰是很奇怪的。

您可以手动配置集群:

  • 第一个选项是打开Web UI并单击按钮。 非常适合一次启动多个实例。
  • 第二种选择是使用GraphQL API。 在这里您已经可以自动化一些操作,例如,用Python编写脚本。
  • 第三种选择是勇敢的:转到服务器,借助tarantoolctl connect连接到一个实例,并使用cartridge Lua模块执行所有必要的操作。

我们发明的主要任务是为您完成这项工作中最困难的部分。

Ansible允许您编写自己的模块并在您的角色中使用它。 我们的角色使用这些模块来管理各种集群组件。

如何运作? 您以声明式配置描述集群的所需状态,该角色为每个模块提供其自己的配置部分作为输入。 该模块接收集群的当前状态,并将其与输入进行比较。 然后,使用其中一个实例的套接字启动必要集群状态的代码。

结果


今天,我们向您展示了如何部署Tarantool Cartridge应用程序和配置简单的拓扑。 为此,我们使用了Ansible,这是一个易于使用的功能强大的工具,它允许您同时配置多个基础结构节点(在我们的示例中是集群实例)。

上面我们介绍了通过Ansible描述集群配置的多种方法之一。 一旦您准备好了更多,请学习编写剧本的最佳实践 。 您可能会发现使用group_varshost_vars管理拓扑更容易。

很快,我们将告诉您如何从拓扑中永久删除(删除)实例,引导vshard,管理自动故障转移,配置授权以及修补程序集群配置。 同时,您可以自己查看文档并尝试更改群集设置。

如果出现问题,请确保让我们知道该问题。 我们将尽力解决任何问题!

Source: https://habr.com/ru/post/zh-CN480468/


All Articles