我們已經討論過
有趣的? 然後我問下切,我們會告訴並展示一切。
讓我們從一個例子開始
我們將僅涵蓋我們角色的部分功能。 您始終可以在中找到其所有功能和輸入參數的完整描述
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、管理自動故障轉移模式、配置授權和修補集群配置。 在此期間,你可以自學
如果有什麼不起作用,請確保
來源: www.habr.com