在Tar​​antool弹药筒上轻松且分阶段地部署应用程序(第1部分)


我们已经讨论过Tarantool Cartridge ,它允许您开发分布式应用程序并将其打包。 剩下的就是学习如何部署和管理这些应用程序。 不用担心,我们已为您提供一切! 我们汇集了使用Tarantool Cartridge的所有最佳实践,并编写了一个简单的角色 ,将程序包分解为服务器,启动实例,将它们组合到群集中,配置授权,启动vshard,启用自动故障转移并修补群集配置。


有意思吗 然后我要求削减,我们将告诉并展示一切。


让我们从一个例子开始。


我们将只考虑角色的一部分功能。 您始终可以在文档中找到其所有功能和输入参数的完整说明。 但是,一次尝试比一次尝试一百次更好,所以让我们安装一个小应用程序。


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


墨盒本身并没有说明如何启动进程,它仅提供了配置已经运行的实例的功能。 用户必须做其余的事情:分解配置文件,启动服务并配置拓扑。 但是我们不会做所有这些,Ansible会为我们做。


请注意,如果您正在OS X上开发应用程序,然后将其打包在本地计算机上,然后无法将其安装在Centos或Debian上将无法正常工作,因为该软件包将包含OS X特定的模块和可执行文件。在这种情况下,您必须在目标系统上打包。


从言语到行动


因此,让我们在两个虚拟机上安装我们的应用程序并设置一个简单的拓扑:


  • 副本app-1将实现api角色,其中包括vshard-router角色。 只有一个实例。
  • 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墨盒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角色。


所有最重要的(即集群配置)都在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_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部分的每个组中指示一个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 /仪表板,并观察我们的新实例:



我们将不讨论已取得的成就,而是掌握拓扑管理。


拓扑管理


将我们的新实例合并到storage-2副本集。 添加一个新的组replicaset_storage_2并在其变量中描述replicateset参数,类似于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-instancescartridge-instances管理(设置,与成员资格的连接);
  • cartridge-replicasets :拓扑管理(管理副本集并从群集中永久删除(删除)实例);
  • ettes cartridge-config :管理其余集群参数(vshard引导程序,自动故障转移模式,授权参数和应用程序配置)。

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


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



万岁!


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


完成对vagrant halt ,请不要忘记启动vagrant halt来停止vagrant halt


到底是什么?


在这里,我将向您详细介绍在我们的实验过程中,扮演角色扮演的角色。


考虑部署墨盒应用程序的步骤。


安装软件包并启动实例


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


接下来,运行实例。 这里的一切都很简单:每个实例都是一个单独的systemd服务。 我举一个例子:


 $ systemctl start myapp@storage-1 

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


用于systemd服务的单位文件/etc/systemd/system/myapp@.sevice将与软件包一起提供。


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


配置集群拓扑


从这里开始乐趣。 同意,打扰到特殊的ansible角色来安装软件包并运行systemd service会很奇怪。


您可以手动配置集群:


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

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


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


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


总结


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


上面,我们找到了使用Ansible描述集群配置的多种方法之一。 一旦意识到准备继续前进,请学习编写剧本的最佳实践 。 您可能会发现使用group_varshost_vars管理拓扑更加方便。


在下一部分中,我们将学习如何从拓扑中永久删除(排除)实例,引导vshard,管理自动故障转移模式,配置授权以及修补群集配置。 不要在那里停下来,继续研究文档并尝试更改群集参数。


如果某些方法不起作用,请务必我们知道该问题。 我们将迅速摧毁一切!

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


All Articles