Chúng ta đã nói về
Hấp dẫn? Vậy thì xin vui lòng, dưới phần cắt, chúng tôi sẽ cho bạn biết và cho bạn thấy mọi thứ.
Hãy bắt đầu với một ví dụ
Chúng tôi sẽ chỉ xem xét một phần chức năng trong vai trò của chúng tôi. Bạn luôn có thể tìm thấy mô tả đầy đủ về tất cả các khả năng và thông số đầu vào của nó trong
Hộp mực Tarantool có api
и storage
, có thể được gán cho các thể hiện.
Bản thân hộp mực không nói gì về cách khởi chạy các tiến trình, nó chỉ cung cấp khả năng định cấu hình các phiên bản đã chạy. Người dùng phải tự mình thực hiện phần còn lại: sắp xếp các tệp cấu hình, khởi động dịch vụ và định cấu hình cấu trúc liên kết. Nhưng chúng tôi sẽ không làm tất cả những điều này; Ansible sẽ làm điều đó cho chúng tôi.
Từ lời nói đến việc làm
Vì vậy, hãy triển khai ứng dụng của chúng ta lên hai máy ảo và thiết lập một cấu trúc liên kết đơn giản:
- Bản sao
app-1
sẽ thực hiện vai tròapi
, trong đó có vai tròvshard-router
. Sẽ chỉ có một trường hợp ở đây. - Bản sao
storage-1
thực hiện vai tròstorage
(và cùng một lúcvshard-storage
), ở đây chúng ta sẽ thêm hai phiên bản từ các máy khác nhau.
Để chạy ví dụ chúng ta cần
Bản thân vai trò đó là ở
Hãy sao chép kho lưu trữ bằng một ví dụ:
$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0
Chúng tôi nâng cao máy ảo:
$ vagrant up
Cài đặt vai trò ansible của Tarantool Cartridge:
$ ansible-galaxy install tarantool.cartridge,1.0.1
Khởi chạy vai trò đã cài đặt:
$ ansible-playbook -i hosts.yml playbook.yml
Chúng tôi đợi playbook hoàn tất việc thực thi, đi đến
Bạn có thể tải lên dữ liệu. Thật tuyệt phải không?
Bây giờ, hãy tìm cách làm việc với điều này, đồng thời thêm một bộ bản sao khác vào cấu trúc liên kết.
Hãy bắt đầu tìm hiểu nó
Vậy chuyện gì đã xảy ra?
Chúng tôi đã thiết lập hai máy ảo và khởi chạy một playbook ansible đã định cấu hình cụm của chúng tôi. Chúng ta hãy xem nội dung của tập tin 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
Không có gì thú vị xảy ra ở đây, hãy khởi chạy một vai trò có thể gọi là tarantool.cartridge
.
Tất cả những thứ quan trọng nhất (cụ thể là cấu hình cụm) đều nằm trong 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:
Tất cả những gì chúng ta cần là tìm hiểu cách quản lý các phiên bản và bản sao bằng cách thay đổi nội dung của tệp này. Tiếp theo chúng ta sẽ thêm các phần mới vào nó. Để không bị nhầm lẫn nên thêm chúng vào đâu, bạn có thể xem phiên bản cuối cùng của tệp này, hosts.updated.yml
, nằm trong kho lưu trữ ví dụ.
Quản lý phiên bản
Theo thuật ngữ của Ansible, mỗi phiên bản là một máy chủ (đừng nhầm với máy chủ phần cứng), tức là. nút cơ sở hạ tầng mà Ansible sẽ quản lý. Đối với mỗi máy chủ, chúng tôi có thể chỉ định các tham số kết nối (chẳng hạn như ansible_host
и ansible_user
), cũng như cấu hình phiên bản. Mô tả các trường hợp có trong phần hosts
.
Hãy nhìn vào cấu hình cá thể storage-1
:
all:
vars:
...
# INSTANCES
hosts:
storage-1:
config:
advertise_uri: '172.19.0.2:3301'
http_port: 8181
...
Trong biến config
chúng tôi đã chỉ định các tham số cá thể - advertise URI
и HTTP port
.
Dưới đây là các tham số ví dụ app-1
и storage-1-replica
.
Chúng ta cần cho Ansible biết các tham số kết nối cho từng phiên bản. Có vẻ hợp lý khi nhóm các cá thể thành các nhóm máy ảo. Với mục đích này, các thể hiện được kết hợp thành các nhóm host1
и host2
, và trong mỗi nhóm trong phần vars
các giá trị được chỉ định ansible_host
и ansible_user
cho một máy ảo. Và trong phần hosts
— các máy chủ (còn gọi là phiên bản) được bao gồm trong nhóm này:
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:
Chúng ta bắt đầu thay đổi hosts.yml
. Hãy thêm hai trường hợp nữa, storage-2-replica
trên máy ảo đầu tiên và storage-2
Vào ngày thứ hai:
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: # <==
...
Khởi chạy playbook ansible:
$ ansible-playbook -i hosts.yml
--limit storage-2,storage-2-replica
playbook.yml
Xin lưu ý tùy chọn --limit
. Vì mỗi phiên bản cụm là một máy chủ lưu trữ theo thuật ngữ Ansible nên chúng tôi có thể chỉ định rõ ràng phiên bản nào sẽ được định cấu hình khi thực thi cẩm nang.
Quay lại giao diện người dùng web
Chúng ta đừng dừng lại ở đó và làm chủ việc quản lý cấu trúc liên kết.
Quản lý cấu trúc liên kết
Hãy kết hợp các phiên bản mới của chúng tôi thành một bộ bản sao storage-2
. Hãy thêm một nhóm mới replicaset_storage_2
và mô tả các tham số bản sao trong các biến của nó bằng cách tương tự với replicaset_storage_1
. Trong phần hosts
Hãy cho biết phiên bản nào sẽ được đưa vào nhóm này (nghĩa là bộ bản sao của chúng tôi):
---
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:
Hãy bắt đầu lại playbook:
$ ansible-playbook -i hosts.yml
--limit replicaset_storage_2
--tags cartridge-replicasets
playbook.yml
Trong tham số --limit
Lần này chúng tôi chuyển tên của nhóm tương ứng với bản sao của chúng tôi.
Hãy xem xét lựa chọn tags
.
Vai trò của chúng tôi thực hiện tuần tự các nhiệm vụ khác nhau, được đánh dấu bằng các thẻ sau:
cartridge-instances
: quản lý cá thể (cấu hình, kết nối với thành viên);cartridge-replicasets
: quản lý cấu trúc liên kết (quản lý bản sao và loại bỏ vĩnh viễn (trục xuất) các phiên bản khỏi cụm);cartridge-config
: quản lý các tham số cụm khác (khởi động vsshard, chế độ chuyển đổi dự phòng tự động, tham số ủy quyền và cấu hình ứng dụng).
Chúng ta có thể chỉ định rõ ràng phần công việc nào chúng ta muốn làm, sau đó vai trò sẽ bỏ qua các nhiệm vụ còn lại. Trong trường hợp của chúng tôi, chúng tôi chỉ muốn làm việc với cấu trúc liên kết, vì vậy chúng tôi đã chỉ định cartridge-replicasets
.
Hãy đánh giá kết quả của những nỗ lực của chúng tôi. Chúng tôi tìm thấy một bản sao mới trên
Hoan hô!
Thử nghiệm thay đổi cấu hình của các phiên bản và bộ bản sao và xem cấu trúc liên kết cụm thay đổi như thế nào. Bạn có thể thử các kịch bản hoạt động khác nhau, ví dụ: memtx_memory
. Vai trò này sẽ cố gắng thực hiện việc này mà không cần khởi động lại phiên bản để giảm thời gian ngừng hoạt động có thể xảy ra của ứng dụng của bạn.
Đừng quên chạy vagrant halt
để dừng các máy ảo khi bạn làm việc xong với chúng.
Có gì dưới mui xe?
Ở đây tôi sẽ cho bạn biết thêm về những gì đã xảy ra dưới vai trò ansible trong quá trình thử nghiệm của chúng tôi.
Chúng ta hãy xem từng bước triển khai ứng dụng Cartridge.
Cài đặt gói và khởi động phiên bản
Trước tiên, bạn cần gửi gói đến máy chủ và cài đặt nó. Hiện tại vai trò này có thể hoạt động với các gói RPM và DEB.
Tiếp theo chúng ta khởi chạy các phiên bản. Mọi thứ ở đây rất đơn giản: mỗi phiên bản là một systemd
-dịch vụ. Tôi sẽ cho bạn một ví dụ:
$ systemctl start myapp@storage-1
Lệnh này sẽ khởi chạy phiên bản storage-1
ứng dụng myapp
. Phiên bản được khởi chạy sẽ tìm kiếm nó /etc/tarantool/conf.d/
. Nhật ký cá thể có thể được xem bằng cách sử dụng journald
.
Tệp đơn vị /etc/systemd/system/[email protected]
đối với dịch vụ systemd sẽ được cung cấp cùng với gói.
Ansible có các mô-đun tích hợp để cài đặt các gói và quản lý dịch vụ systemd; chúng tôi chưa phát minh ra bất cứ điều gì mới ở đây.
Thiết lập cấu trúc liên kết cụm
Đây là nơi vui vẻ bắt đầu. Đồng ý, sẽ thật lạ nếu bận tâm đến vai trò Ansible đặc biệt để cài đặt các gói và chạy systemd
-dịch vụ.
Bạn có thể định cấu hình cụm theo cách thủ công:
- Tùy chọn đầu tiên: mở Giao diện người dùng Web và nhấp vào nút. Nó khá phù hợp để bắt đầu một lần cho nhiều trường hợp.
- Tùy chọn thứ hai: bạn có thể sử dụng API GraphQl. Ở đây bạn đã có thể tự động hóa một cái gì đó, chẳng hạn như viết một tập lệnh bằng Python.
- Tùy chọn thứ ba (dành cho những người có ý chí mạnh mẽ): truy cập máy chủ, kết nối với một trong các phiên bản bằng cách sử dụng
tarantoolctl connect
và thực hiện tất cả các thao tác cần thiết với mô-đun Luacartridge
.
Nhiệm vụ chính trong phát minh của chúng tôi là thực hiện chính xác điều này, phần khó khăn nhất trong công việc đối với bạn.
Ansible cho phép bạn viết mô-đun của riêng mình và sử dụng nó trong một vai trò. Vai trò của chúng tôi sử dụng các mô-đun như vậy để quản lý các thành phần cụm khác nhau.
Làm thế nào nó hoạt động? Bạn mô tả trạng thái mong muốn của cụm trong cấu hình khai báo và vai trò này cung cấp cho mỗi mô-đun phần cấu hình của nó làm đầu vào. Mô-đun nhận trạng thái hiện tại của cụm và so sánh nó với những gì nhận được dưới dạng đầu vào. Tiếp theo, một mã được khởi chạy thông qua ổ cắm của một trong các phiên bản, mã này sẽ đưa cụm về trạng thái mong muốn.
Kết quả
Hôm nay chúng tôi đã giới thiệu và hướng dẫn cách triển khai ứng dụng của bạn lên Tarantool Cartridge và thiết lập cấu trúc liên kết đơn giản. Để làm điều này, chúng tôi đã sử dụng Ansible - một công cụ mạnh mẽ, dễ sử dụng và cho phép bạn định cấu hình đồng thời nhiều nút cơ sở hạ tầng (trong trường hợp của chúng tôi là các phiên bản cụm).
Ở trên, chúng tôi đã xem xét một trong nhiều cách để mô tả cấu hình cụm bằng Ansible. Khi bạn cảm thấy sẵn sàng để tiếp tục, hãy khám phá group_vars
и host_vars
.
Chúng tôi sẽ sớm cho bạn biết cách xóa (trục xuất) vĩnh viễn các phiên bản khỏi cấu trúc liên kết, bootstrap vshard, quản lý chế độ chuyển đổi dự phòng tự động, định cấu hình ủy quyền và vá cấu hình cụm. Trong thời gian chờ đợi bạn có thể tự học
Nếu có điều gì đó không hiệu quả, hãy chắc chắn
Nguồn: www.habr.com