Triển khai ứng dụng vào Tarantool Cartridge một cách dễ dàng và tự nhiên (phần 1)

Triển khai ứng dụng vào Tarantool Cartridge một cách dễ dàng và tự nhiên (phần 1)

Chúng ta đã nói về Hộp mực Tarantool, cho phép bạn phát triển các ứng dụng phân tán và đóng gói chúng. Tất cả những gì còn lại là tìm hiểu cách triển khai các ứng dụng này và quản lý chúng. Đừng lo lắng, chúng tôi đã giải quyết được tất cả! Chúng tôi tập hợp tất cả các phương pháp hay nhất để làm việc với Tarantool Cartridge và viết vai trò ansible, sẽ phân phối gói đến máy chủ, khởi chạy phiên bản, hợp nhất chúng thành một cụm, định cấu hình ủy quyền, khởi động vshard, bật chuyển đổi dự phòng tự động và vá cấu hình cụm.

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 tài liệu. Nhưng thà thử một lần còn hơn xem cả trăm lần, vì vậy hãy triển khai một ứng dụng nhỏ.

Hộp mực Tarantool có hướng dẫn để tạo một ứng dụng Cartridge nhỏ lưu trữ thông tin về khách hàng ngân hàng và tài khoản của họ, đồng thời cung cấp API để quản lý dữ liệu qua HTTP. Để đạt được điều này, phụ lục mô tả hai vai trò có thể 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úc vshard-storage), ở đây chúng ta sẽ thêm hai phiên bản từ các máy khác nhau.

Triển khai ứng dụng vào Tarantool Cartridge một cách dễ dàng và tự nhiên (phần 1)

Để chạy ví dụ chúng ta cần Âm đạo и Có khả năng (phiên bản 2.8 trở lên).

Bản thân vai trò đó là ở thiên hà ansible. Đây là kho lưu trữ cho phép bạn chia sẻ công việc của mình và sử dụng các vai trò được tạo sẵn.

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 http://localhost:8181/admin/cluster/dashboard và tận hưởng thành quả:

Triển khai ứng dụng vào Tarantool Cartridge một cách dễ dàng và tự nhiên (phần 1)

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 hàng tồn kho-tài liệu 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 http://localhost:8181/admin/cluster/dashboard và xem các phiên bản mới của chúng tôi:

Triển khai ứng dụng vào Tarantool Cartridge một cách dễ dàng và tự nhiên (phần 1)

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 http://localhost:8181/admin/cluster/dashboard.

Triển khai ứng dụng vào Tarantool Cartridge một cách dễ dàng và tự nhiên (phần 1)

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ụ: cập nhật liên tục hoặc tăng 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ó cấu hình в /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 Lua cartridge.

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á thực hành tốt nhất về việc viết vở kịch. Bạn có thể thấy việc quản lý cấu trúc liên kết của mình dễ dàng hơn bằng cách sử dụng 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 tài liệu và thử nghiệm thay đổi các tham số cụm.

Nếu có điều gì đó không hiệu quả, hãy chắc chắn báo chúng tôi về vấn đề này. Chúng tôi sẽ sắp xếp mọi thứ một cách nhanh chóng!

Nguồn: www.habr.com

Thêm một lời nhận xét