我们已经讨论过
有趣的? 然后我问下切,我们会告诉并展示一切。
让我们从一个例子开始
我们将仅涵盖我们角色的部分功能。 您始终可以在中找到其所有功能和输入参数的完整描述
Tarantool 墨盒有 api
и storage
可以分配给实例。
Cartridge 本身没有说明如何启动进程,它只提供配置已运行实例的功能。 用户必须自己完成剩下的工作:分解配置文件、启动服务并设置拓扑。 但我们不会做这一切,Ansible 会为我们做。
从言论到行动
因此,让我们将应用程序部署到两个虚拟机并设置一个简单的拓扑:
- 复制集
app-1
将扮演角色api
其中包括角色vshard-router
。 这里只有一个实例。 - 复制集
storage-1
执行角色storage
(同时vshard-storage
),这里我们添加来自不同机器的两个实例。
要运行该示例,我们需要
角色本身就是
使用示例克隆存储库:
$ 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执行结束,进入
可以倒数据。 很酷,对吧?
现在让我们弄清楚如何使用它,同时向拓扑添加另一个副本集。
我们开始明白
所以发生了什么事?
我们启动了两个虚拟机并运行一个 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 时应配置哪些实例。
返回网页用户界面
我们不会固步自封,我们会掌握拓扑控制。
拓扑管理
让我们将新实例合并到复制集中 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
.
让我们评估一下我们努力的结果。 寻找新的副本集
万岁!
尝试重新配置实例和副本集,看看集群拓扑如何变化。 您可以尝试不同的操作场景,例如, 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