
我们已经介绍了
Tarantool弹药筒 ,使您可以开发和打包分布式应用程序。 现在让我们学习如何部署和控制这些应用程序。 不用担心,一切都在掌控之中! 我们汇集了使用Tarantool Cartridge的所有最佳实践,并编写了
Ansible角色 ,该
角色将软件包部署到服务器,将实例启动和加入副本集,配置授权,引导vshard,启用自动故障转移和补丁集群配置。
有趣吧? 潜入,检查切口下的详细信息。
从样本开始
让我们仅带您了解角色的某些功能。 您始终可以在
文档中找到其所有功能和输入参数的完整说明。 但是,尝试一次总比看到一百次更好,因此让我们部署一个小型应用程序。
Tarantool Cartridge提供了一个
教程,用于创建一个小的Cartridge应用程序,该应用程序存储有关银行客户及其帐户的信息,并提供通过HTTP进行数据管理的API。 为此,该应用程序描述了可以分配给实例的两个可能的角色:
api
和
storage
。
盒式磁带本身没有说明如何启动进程,仅提供了配置运行中实例的机会。 因此,其余的一切取决于用户:分发配置文件,运行服务和配置拓扑。 但是我们不会做所有的事情-Ansible会为我们做这件事。
采取行动
首先,让我们将应用程序部署到两个虚拟机上并设置一个简单的拓扑:
app-1
副本集将代表包含vshard-router
角色的api
角色。 只有一个实例。storage-1
副本集将代表storage
角色(包括vshard-storage
角色)-在这里,我们将添加来自不同计算机的两个实例。

要运行该示例,我们需要
Vagrant和
Ansible (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_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的主机,因此我们可以在运行剧本时明确指定应配置的实例。
因此,我们返回到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
此命令启动
myapp
的
storage-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_vars
和
host_vars
管理拓扑更容易。
很快,我们将告诉您如何从拓扑中永久删除(删除)实例,引导vshard,管理自动故障转移,配置授权以及修补程序集群配置。 同时,您可以自己查看
文档并尝试更改群集设置。
如果出现问题,请确保
让我们知道该问题。 我们将尽力解决任何问题!