استقرار آسان و طبیعی برنامه ها در کارتریج Tarantool (قسمت 1)

استقرار آسان و طبیعی برنامه ها در کارتریج Tarantool (قسمت 1)

قبلاً در مورد آن صحبت کرده ایم کارتریج Tarantool، که به شما امکان می دهد برنامه های کاربردی توزیع شده را توسعه دهید و آنها را بسته بندی کنید. تنها چیزی که باقی می ماند یادگیری نحوه استقرار این برنامه ها و مدیریت آنها است. نگران نباشید، ما همه چیز را پوشش داده ایم! ما تمام بهترین روش ها را برای کار با کارتریج Tarantool گرد هم آوردیم و نوشتیم نقش پذیر، که بسته را در سرورها توزیع می کند، نمونه ها را راه اندازی می کند، آنها را در یک خوشه متحد می کند، مجوز را پیکربندی می کند، vshard را بوت استرپ می کند، Failover خودکار را فعال می کند و پیکربندی کلاستر را وصله می کند.

جالب هست؟ سپس لطفاً، در زیر برش، به شما می گوییم و همه چیز را به شما نشان می دهیم.

بیایید با یک مثال شروع کنیم

ما فقط به بخشی از عملکرد نقش خود نگاه خواهیم کرد. همیشه می توانید شرح کاملی از تمام قابلیت ها و پارامترهای ورودی آن را در آن بیابید مستندات. اما بهتر است یک بار امتحان کنید تا صد بار آن را ببینید، پس بیایید یک برنامه کوچک را اجرا کنیم.

کارتریج Tarantool دارد آموزش برای ایجاد یک برنامه کارتریج کوچک که اطلاعات مشتریان بانک و حساب های آنها را ذخیره می کند و همچنین یک API برای مدیریت داده ها از طریق HTTP ارائه می دهد. برای رسیدن به این هدف، ضمیمه دو نقش ممکن را شرح می دهد: api и storage، که می تواند به نمونه ها اختصاص یابد.

خود کارتریج در مورد نحوه راه‌اندازی فرآیندها چیزی نمی‌گوید، فقط توانایی پیکربندی نمونه‌های در حال اجرا را فراهم می‌کند. کاربر باید بقیه کارها را خودش انجام دهد: ترتیب فایل های پیکربندی، راه اندازی سرویس ها و پیکربندی توپولوژی. اما ما همه این کارها را انجام نخواهیم داد؛ Ansible آن را برای ما انجام خواهد داد.

از حرف تا عمل

بنابراین، بیایید برنامه خود را در دو ماشین مجازی مستقر کنیم و یک توپولوژی ساده را تنظیم کنیم:

  • Replicaset app-1 نقش را اجرا خواهد کرد api، که شامل نقش است vshard-router. در اینجا فقط یک نمونه وجود خواهد داشت.
  • Replicaset storage-1 نقش را اجرا می کند storage (و در همان زمان vshard-storage، در اینجا دو نمونه از ماشین های مختلف اضافه می کنیم.

استقرار آسان و طبیعی برنامه ها در کارتریج Tarantool (قسمت 1)

برای اجرای مثالی که نیاز داریم آشکار и غیر ممکن (نسخه 2.8 یا بالاتر).

خود نقش در کهکشان Ansible. این یک مخزن است که به شما امکان می دهد کار خود را به اشتراک بگذارید و از نقش های آماده استفاده کنید.

بیایید مخزن را با یک مثال کلون کنیم:

$ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git
$ cd deploy-tarantool-cartridge-app && git checkout 1.0.0

ما ماشین های مجازی را پرورش می دهیم:

$ vagrant up

نقش کارتریج Tarantool را نصب کنید:

$ ansible-galaxy install tarantool.cartridge,1.0.1

نقش نصب شده را اجرا کنید:

$ ansible-playbook -i hosts.yml playbook.yml

منتظر می مانیم تا playbook کامل اجرا شود، به http://localhost:8181/admin/cluster/dashboard و از نتیجه لذت ببرید:

استقرار آسان و طبیعی برنامه ها در کارتریج Tarantool (قسمت 1)

می توانید داده ها را آپلود کنید. باحال، درسته؟

حالا بیایید نحوه کار با این را بیابیم و در همان زمان یک مجموعه مشابه دیگر را به توپولوژی اضافه کنیم.

بیایید شروع به کشف آن کنیم

پس چه اتفاقی افتاد؟

ما دو ماشین مجازی راه‌اندازی کردیم و یک 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

اینجا هیچ اتفاق جالبی نمی‌افتد، بیایید نقشی را به نام اجرا کنیم 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، هر نمونه یک میزبان است (نباید با سرور سخت افزاری اشتباه گرفته شود)، یعنی. گره زیرساختی که 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 پیکربندی شوند.

بازگشت به رابط کاربری وب http://localhost:8181/admin/cluster/dashboard و نمونه های جدید ما را ببینید:

استقرار آسان و طبیعی برنامه ها در کارتریج Tarantool (قسمت 1)

بیایید به همین جا بسنده نکنیم و به مدیریت توپولوژی مسلط شویم.

مدیریت توپولوژی

بیایید نمونه های جدید خود را در یک مجموعه کپی ترکیب کنیم storage-2. بیایید یک گروه جدید اضافه کنیم replicaset_storage_2 و پارامترهای replicaset را در متغیرهای آن با قیاس با توصیف کنید 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 این بار نام گروهی را که با replicaset ما مطابقت دارد عبور دادیم.

بیایید گزینه را در نظر بگیریم tags.

نقش ما به صورت متوالی وظایف مختلفی را انجام می دهد که با برچسب های زیر مشخص شده اند:

  • cartridge-instances: مدیریت نمونه (پیکربندی، اتصال به عضویت)؛
  • cartridge-replicasets: مدیریت توپولوژی (مدیریت replicaset و حذف دائمی (اخراج) نمونه ها از خوشه).
  • cartridge-config: مدیریت سایر پارامترهای خوشه (راه اندازی vshard، حالت failover خودکار، پارامترهای مجوز و پیکربندی برنامه).

می‌توانیم به صراحت مشخص کنیم که کدام قسمت از کار را می‌خواهیم انجام دهیم، سپس نقش از بقیه کارها صرفنظر می‌کند. در مورد ما، ما می خواهیم فقط با توپولوژی کار کنیم، بنابراین ما مشخص کردیم cartridge-replicasets.

بیایید نتیجه تلاش خود را ارزیابی کنیم. ما یک replicaset جدید پیدا می کنیم http://localhost:8181/admin/cluster/dashboard.

استقرار آسان و طبیعی برنامه ها در کارتریج Tarantool (قسمت 1)

هورا!

تغییر پیکربندی نمونه ها و مجموعه های تکراری را آزمایش کنید و ببینید توپولوژی خوشه چگونه تغییر می کند. می توانید سناریوهای عملیاتی مختلفی را امتحان کنید، به عنوان مثال. به روز رسانی چرخان یا افزایش دهد memtx_memory. نقش سعی می‌کند این کار را بدون راه‌اندازی مجدد نمونه انجام دهد تا زمان خرابی احتمالی برنامه شما را کاهش دهد.

دویدن را فراموش نکنید vagrant haltبرای متوقف کردن ماشین های مجازی پس از پایان کار با آنها.

زیر کاپوت چیست؟

در اینجا من به شما بیشتر در مورد آنچه که در زیر کاپوت نقش قابل تشخیص در طول آزمایشات ما اتفاق می افتاد، خواهم گفت.

بیایید مرحله به مرحله استقرار برنامه کارتریج را بررسی کنیم.

نصب بسته و شروع نمونه ها

ابتدا باید بسته را به سرور تحویل دهید و آن را نصب کنید. در حال حاضر نقش می تواند با بسته های 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 استفاده کنید. در اینجا می توانید چیزی را خودکار کنید، به عنوان مثال، یک اسکریپت در پایتون بنویسید.
  • گزینه سوم (برای افراد با اراده): به سرور بروید، با استفاده از یکی از نمونه ها به آن متصل شوید tarantoolctl connect و تمام دستکاری های لازم را با ماژول Lua انجام دهید cartridge.

وظیفه اصلی اختراع ما این است که دقیقاً این کار را انجام دهیم، سخت ترین قسمت کار برای شما.

Ansible به شما امکان می دهد ماژول خود را بنویسید و از آن در یک نقش استفاده کنید. نقش ما از چنین ماژول هایی برای مدیریت اجزای مختلف خوشه استفاده می کند.

چگونه کار می کند؟ شما حالت دلخواه خوشه را در یک پیکربندی اعلانی توصیف می‌کنید، و نقش بخش پیکربندی هر ماژول را به عنوان ورودی ارائه می‌کند. ماژول وضعیت فعلی خوشه را دریافت می کند و آن را با آنچه به عنوان ورودی دریافت شده مقایسه می کند. سپس یک کد از طریق سوکت یکی از نمونه ها راه اندازی می شود که خوشه را به حالت دلخواه می رساند.

نمایش نتایج: از

امروز ما گفتیم و نشان دادیم که چگونه برنامه خود را در Tarantool Cartridge مستقر کنید و یک توپولوژی ساده را راه اندازی کنید. برای انجام این کار، از Ansible استفاده کردیم - ابزار قدرتمندی که استفاده از آن آسان است و به شما امکان می دهد همزمان بسیاری از گره های زیرساخت را پیکربندی کنید (در مورد ما، نمونه های خوشه ای).

در بالا به یکی از روش‌های متعدد برای توصیف پیکربندی خوشه با استفاده از Ansible نگاه کردیم. هنگامی که احساس کردید برای ادامه کار آماده هستید، کاوش کنید بهترین شیوه در مورد نوشتن کتاب های بازی ممکن است مدیریت توپولوژی خود با استفاده از آن آسان تر باشد group_vars и host_vars.

به زودی به شما خواهیم گفت که چگونه به طور دائم نمونه ها را از توپولوژی حذف کنید (اخراج کنید)، vshard را بوت استرپ کنید، حالت Failover خودکار را مدیریت کنید، مجوز را پیکربندی کنید و پیکربندی کلاستر را وصله کنید. در ضمن خودتون میتونید درس بخونید مستندات و با تغییر پارامترهای خوشه آزمایش کنید.

اگر چیزی کار نمی کند، مطمئن باشید به اطلاع رساندن ما در مورد مشکل ما به سرعت همه چیز را مرتب خواهیم کرد!

منبع: www.habr.com

اضافه کردن نظر