قبلاً در مورد آن صحبت کرده ایم
جالب هست؟ سپس لطفاً، در زیر برش، به شما می گوییم و همه چیز را به شما نشان می دهیم.
بیایید با یک مثال شروع کنیم
ما فقط به بخشی از عملکرد نقش خود نگاه خواهیم کرد. همیشه می توانید شرح کاملی از تمام قابلیت ها و پارامترهای ورودی آن را در آن بیابید
کارتریج Tarantool دارد api
и storage
، که می تواند به نمونه ها اختصاص یابد.
خود کارتریج در مورد نحوه راهاندازی فرآیندها چیزی نمیگوید، فقط توانایی پیکربندی نمونههای در حال اجرا را فراهم میکند. کاربر باید بقیه کارها را خودش انجام دهد: ترتیب فایل های پیکربندی، راه اندازی سرویس ها و پیکربندی توپولوژی. اما ما همه این کارها را انجام نخواهیم داد؛ Ansible آن را برای ما انجام خواهد داد.
از حرف تا عمل
بنابراین، بیایید برنامه خود را در دو ماشین مجازی مستقر کنیم و یک توپولوژی ساده را تنظیم کنیم:
- Replicaset
app-1
نقش را اجرا خواهد کردapi
، که شامل نقش استvshard-router
. در اینجا فقط یک نمونه وجود خواهد داشت. - Replicaset
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 را نصب کنید:
$ ansible-galaxy install tarantool.cartridge,1.0.1
نقش نصب شده را اجرا کنید:
$ ansible-playbook -i hosts.yml playbook.yml
منتظر می مانیم تا playbook کامل اجرا شود، به
می توانید داده ها را آپلود کنید. باحال، درسته؟
حالا بیایید نحوه کار با این را بیابیم و در همان زمان یک مجموعه مشابه دیگر را به توپولوژی اضافه کنیم.
بیایید شروع به کشف آن کنیم
پس چه اتفاقی افتاد؟
ما دو ماشین مجازی راهاندازی کردیم و یک 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 پیکربندی شوند.
بازگشت به رابط کاربری وب
بیایید به همین جا بسنده نکنیم و به مدیریت توپولوژی مسلط شویم.
مدیریت توپولوژی
بیایید نمونه های جدید خود را در یک مجموعه کپی ترکیب کنیم 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 جدید پیدا می کنیم
هورا!
تغییر پیکربندی نمونه ها و مجموعه های تکراری را آزمایش کنید و ببینید توپولوژی خوشه چگونه تغییر می کند. می توانید سناریوهای عملیاتی مختلفی را امتحان کنید، به عنوان مثال. 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