د ترنتول کارتریج: په دریو کرښو کې د لوا شاته کول

د ترنتول کارتریج: په دریو کرښو کې د لوا شاته کول

په Mail.ru ګروپ کې موږ Tarantool لرو - دا په لوا کې د غوښتنلیک سرور دی، کوم چې د ډیټابیس په توګه هم دوه چنده کیږي (یا برعکس؟). دا ګړندی او یخ دی ، مګر د یو سرور وړتیا لاهم لامحدود ندي. عمودی اندازه کول هم یوه درملنه نه ده، نو ترانټول د افقی اندازه کولو لپاره وسایل لري - د vshard ماډل [1]. دا تاسو ته اجازه درکوي په ډیری سرورونو کې ډیټا شارډ کړئ ، مګر تاسو باید د دې تنظیم کولو او د سوداګرۍ منطق ضمیمه کولو لپاره ورسره ټینکر وکړئ.

ښه خبر: موږ ځینې لوی شاټونه راټول کړي دي (د بیلګې په توګه [2], [3]) او یو بل چوکاټ رامینځته کړی چې د دې ستونزې حل به د پام وړ ساده کړي.

د ترنتول کارتوس د پیچلي توزیع شوي سیسټمونو پراختیا لپاره یو نوی چوکاټ دی. دا تاسو ته اجازه درکوي د زیربنا ستونزو حل کولو پرځای د سوداګرۍ منطق لیکلو باندې تمرکز وکړئ. د کټ لاندې زه به تاسو ته ووایم چې دا چوکاټ څنګه کار کوي او د دې په کارولو سره د توزیع شوي خدماتو لیکلو څرنګوالی.

په حقیقت کې ستونزه څه ده؟

موږ ترانټولا لرو، موږ vshard لرو - نور څه غواړئ؟

لومړی، دا د اسانتیا خبره ده. د vshard ترتیب د Lua جدولونو له لارې تنظیم شوی. د دې لپاره چې د څو ټرانټول پروسو ویشل شوي سیسټم په سمه توګه کار وکړي، ترتیب باید په هر ځای کې ورته وي. هیڅوک نه غواړي دا په لاسي ډول ترسره کړي. له همدې امله، هر ډول سکریپټونه، ځواب ورکوونکي، او د پلي کولو سیسټمونه کارول کیږي.

کارتریج پخپله د vshard ترتیب اداره کوي، دا د هغې پر بنسټ ترسره کوي خپل ویشل شوی ترتیب. دا په اصل کې یو ساده YAML فایل دی، چې یوه کاپي یې په هر ټارنټول مثال کې ساتل کیږي. ساده کول دا دي چې چوکاټ پخپله خپل تشکیلات څاري او ډاډ ترلاسه کوي چې دا په هر ځای کې یو شان دی.

دوهم، دا بیا د اسانتیا خبره ده. د vshard ترتیب د سوداګرۍ منطق پراختیا سره هیڅ تړاو نلري او یوازې پروګرامر د هغه له کار څخه بې برخې کوي. کله چې موږ د پروژې د جوړښت په اړه بحث کوو، موږ ډیری وختونه د انفرادي اجزاوو او د هغوی د تعامل په اړه خبرې کوو. دا ډیر وختي دی چې د 3 ډیټا مرکزونو ته د کلسټر رول په اړه فکر وکړئ.

موږ دا ستونزې په پرله پسې ډول حل کړې، او په یو وخت کې موږ یو داسې طریقه رامینځته کړه چې د خپل ټول ژوند دوره کې د غوښتنلیک سره کار کول ساده کړي: جوړول، پراختیا، ازموینه، CI/CD، ساتنه.

کارتریج د هر ټرانټول پروسې لپاره د رول مفهوم معرفي کوي. رولونه یو مفهوم دی چې پراختیا کونکي ته اجازه ورکوي چې د کوډ لیکلو باندې تمرکز وکړي. په پروژه کې موجود ټول رولونه په یو ټرنټول مثال کې پرمخ وړل کیدی شي، او دا به د ازموینو لپاره کافي وي.

د ترنتول کارتریج کلیدي ځانګړتیاوې:

  • اتوماتیک کلستر آرکیسټریشن؛
  • د نوي رولونو په کارولو سره د غوښتنلیک فعالیت پراخول؛
  • د پراختیا او ګمارنې لپاره د غوښتنلیک ټیمپلیټ؛
  • جوړ شوی اتوماتیک شارډینګ؛
  • د Luatest ازموینې چوکاټ سره ادغام؛
  • د کلستر مدیریت د WebUI او API په کارولو سره؛
  • د بسته بندۍ او ځای پرځای کولو وسیلې.

سلام نړی!

زه انتظار نشم کولی پخپله چوکاټ وښیو، نو موږ به د جوړښت په اړه کیسه د وروسته لپاره پریږدو او د یو څه ساده سره پیل وکړو. که موږ فرض کړو چې ترنټول پخپله لا دمخه نصب شوی ، نو ټول هغه څه چې پاتې دي باید ترسره شي

$ tarantoolctl rocks install cartridge-cli
$ export PATH=$PWD/.rocks/bin/:$PATH

دا دوه کمانډونه به د کمانډ لاین اسانتیاوې نصب کړي او تاسو ته اجازه درکړي چې خپل لومړی غوښتنلیک د ټیمپلیټ څخه جوړ کړئ:

$ cartridge create --name myapp

او دا هغه څه دي چې موږ یې ترلاسه کوو:

myapp/
├── .git/
├── .gitignore
├── app/roles/custom.lua
├── deps.sh
├── init.lua
├── myapp-scm-1.rockspec
├── test
│   ├── helper
│   │   ├── integration.lua
│   │   └── unit.lua
│   ├── helper.lua
│   ├── integration/api_test.lua
│   └── unit/sample_test.lua
└── tmp/

دا د چمتو شوي "هیلو، ورلډ!" سره د ګیټ ذخیره ده. غوښتنلیک راځئ چې سمدلاسه د چلولو هڅه وکړو ، مخکې له دې چې انحصارونه نصب کړي (په شمول پخپله چوکاټ کې):

$ tarantoolctl rocks make
$ ./init.lua --http-port 8080

نو، موږ یو نوډ لرو چې د راتلونکي شارډ شوي غوښتنلیک لپاره روان دي. یو پلټونکی سړی کولی شي سمدلاسه ویب انٹرفیس خلاص کړي ، د موږک سره د یو نوډ کلستر تنظیم کړي او له پایلې څخه خوند واخلي ، مګر د خوښۍ لپاره ډیر وخت دی. تر دې دمه ، غوښتنلیک هیڅ ګټور نشي کولی ، نو زه به تاسو ته وروسته د ګمارلو په اړه ووایم ، مګر اوس د کوډ لیکلو وخت دی.

د غوښتنلیک پراختیا

یوازې تصور وکړئ، موږ یوه پروژه ډیزاین کوو چې باید ډاټا ترلاسه کړي، خوندي یې کړي او په ورځ کې یو ځل راپور جوړ کړي.

د ترنتول کارتریج: په دریو کرښو کې د لوا شاته کول

موږ د ډیاګرام رسم کول پیل کوو او په هغې کې درې برخې ځای په ځای کوو: دروازه، ذخیره او مهالویش. موږ نور په معمارۍ کار کوو. څرنګه چې موږ vshard د ذخیره کولو په توګه کاروو، موږ سکیم ته vshard-router او vshard-storage اضافه کوو. نه ګیټس او نه هم مهالویش به مستقیم ذخیره ته لاسرسی ومومي؛ دا هغه څه دي چې روټر یې د دې لپاره رامینځته شوی.

د ترنتول کارتریج: په دریو کرښو کې د لوا شاته کول

دا ډیاګرام لاهم دقیقا هغه څه نه څرګندوي چې موږ به په پروژه کې جوړ کړو ځکه چې اجزا خلاص ښکاري. موږ لاهم اړتیا لرو چې وګورو چې دا به څنګه په ریښتیني ټرانټول کې وړاندې شي - راځئ چې زموږ اجزا د پروسې له مخې ګروپ کړو.

د ترنتول کارتریج: په دریو کرښو کې د لوا شاته کول

په جلا جلا مواردو کې د vshard-router او ګیټ ویز ساتلو کې لږ ټکی شتون لري. ولې موږ اړتیا لرو چې یو ځل بیا شبکه سرف کړو که دا دمخه د روټر مسؤلیت وي؟ دوی باید د ورته پروسې په جریان کې ترسره شي. دا دی، دواړه ګیټس او vshard.router.cfg په یوه پروسه کې پیل شوي، او اجازه راکړئ چې په محلي توګه اړیکه ونیسي.

د ډیزاین په مرحله کې، دا د دریو برخو سره کار کول اسانه وو، مګر زه، د پراختیا کونکي په توګه، د کوډ لیکلو په وخت کې، نه غواړم د ترناتوول درې مثالونو پیل کولو په اړه فکر وکړم. زه اړتیا لرم چې ازموینې پرمخ بوځم او وګورم چې ما ګیټس په سمه توګه لیکلی. یا شاید زه غواړم خپلو همکارانو ته یو ځانګړتیا وښیم. ولې زه باید د دریو کاپيونو ځای په ځای کولو کې له ستونزو څخه تیر شم؟ په دې توګه د رول مفهوم پیدا شو. رول یو منظم لوش ماډل دی چې د ژوند دوره یې د کارتریج لخوا اداره کیږي. په دې مثال کې څلور یې شتون لري - ګیټس، روټر، ذخیره، مهالویش. ښايي په بله پروژه کې نور هم وي. ټول رولونه په یوه پروسه کې پرمخ وړل کیدی شي، او دا به کافي وي.

د ترنتول کارتریج: په دریو کرښو کې د لوا شاته کول

او کله چې د سټیګینګ یا تولید لپاره د ګمارلو خبره راځي، نو موږ به د هارډویر وړتیاو پراساس هر ټرانټول پروسې ته خپل د رولونو سیټ وټاکو:

د ترنتول کارتریج: په دریو کرښو کې د لوا شاته کول

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

د دې په اړه معلومات چیرې چې کوم رولونه روان دي باید چیرې زیرمه شي. او دا "چیرې" ویشل شوی ترتیب دی، کوم چې ما مخکې پورته یادونه وکړه. د دې په اړه ترټولو مهم شی د کلستر ټوپولوژي ده. دلته د 3 ترانټول پروسې 5 تکرار ګروپونه دي:

د ترنتول کارتریج: په دریو کرښو کې د لوا شاته کول

موږ نه غواړو ډاټا له لاسه ورکړو، نو موږ د چلولو پروسو په اړه معلومات په احتیاط سره چلند کوو. کارتریج د دوه مرحلې ژمنې په کارولو سره تنظیمات تعقیبوي. یوځل چې موږ غواړو تنظیمات تازه کړو، دا لومړی ګوري چې ټول مثالونه شتون لري او د نوي ترتیب منلو ته چمتو دي. له دې وروسته، دوهم پړاو ترتیب تطبیقوي. په دې توګه، حتی که یو کاپي په لنډمهاله توګه شتون ونلري، هیڅ بد به نه وي. تشکیلات به په ساده ډول پلي نشي او تاسو به دمخه یوه تېروتنه وګورئ.

همدارنګه د ټوپولوژي برخه کې، د هرې تکثیر ګروپ مشر په توګه یو مهم پیرامیټر په ګوته شوی. معمولا دا هغه کاپي ده چې ثبت کیږي. پاتې نور اکثرا یوازې د لوستلو وړ دي، که څه هم استثناوې شتون لري. ځینې ​​​​وختونه زړور پراختیا کونکي د شخړو څخه ویره نلري او کولی شي په موازي ډول ډیری عکسونو ته ډیټا ولیکي ، مګر ځینې عملیات شتون لري چې هیڅ اهمیت نلري ، باید دوه ځله ترسره نشي. د دې لپاره د مشر نښه شتون لري.

د ترنتول کارتریج: په دریو کرښو کې د لوا شاته کول

د رولونو ژوند

د دې لپاره چې په داسې جوړښت کې د خلاص رول شتون ولري، چوکاټ باید دوی په یو ډول اداره کړي. په طبيعي توګه، کنټرول پرته له دې چې د تارنول پروسې له سره پيل شي. د رولونو اداره کولو لپاره 4 کال بیکونه شتون لري. پخپله کارتریج به دوی ته زنګ ووهي د هغه څه پورې اړه لري چې د دې توزیع شوي ترتیب کې لیکل شوي ، په دې توګه ځانګړي رولونو ته تشکیلات پلي کوي.

function init()
function validate_config()
function apply_config()
function stop()

هر رول یو فعالیت لري init. دا یو ځل ویل کیږي کله چې رول فعال شوی وي یا کله چې ترنټول بیا پیل شي. دا هلته مناسبه ده، د بیلګې په توګه، د box.space.create پیل کول، یا مهالویش کوونکی کولی شي ځینې شالید فایبر پیل کړي چې په ټاکلي وخت وقفو کې کار ترسره کوي.

یو فعالیت init کیدای شي کافي نه وي. کارتریج رولونو ته اجازه ورکوي چې د توزیع شوي ترتیب څخه ګټه پورته کړي چې دا د ټوپولوژي ذخیره کولو لپاره کاروي. موږ کولی شو په ورته ترتیب کې نوې برخه اعلان کړو او د سوداګرۍ ترتیب یوه ټوټه په دې کې ذخیره کړو. زما په مثال کې، دا کیدای شي د ډیټا سکیما وي یا د مهالویش رول لپاره د مهال ویش ترتیبات.

کلستر زنګونه validate_config и apply_config هرکله چې توزیع شوي ترتیب بدل شي. کله چې یو ترتیب د دوه مرحلې ژمنې لخوا پلي کیږي، کلستر چک کوي چې هر رول د دې نوي ترتیب منلو لپاره چمتو دی او که اړتیا وي، کارونکي ته د تېروتنې راپور ورکوي. کله چې هرڅوک موافق وي چې ترتیب نورمال دی، نو بیا apply_config.

رولونه هم یوه طریقه لري stop، کوم چې د رول محصول پاکولو لپاره اړین دی. که موږ ووایو چې مهالویش نور په دې سرور کې اړتیا نلري، دا کولی شي هغه فایبرونه ودروي چې دا یې پیل کړي init.

رولونه کولی شي له یو بل سره اړیکه ونیسي. موږ په لوا کې د فنکشن زنګونو لیکلو سره عادت یو، مګر دا پیښ کیدی شي چې یوه ورکړل شوې پروسه هغه رول ونلري چې موږ ورته اړتیا لرو. په شبکه کې د زنګ وهلو اسانتیا لپاره، موږ د rpc (ریموټ پروسیجر کال) معاون ماډل کاروو، کوم چې د معیاري شبکې پر بنسټ جوړ شوی دی چې په Tarantool کې جوړ شوی. دا ګټور کیدی شي که چیرې، د بیلګې په توګه، ستاسو دروازه غواړي په مستقیم ډول د مهالویش کونکي څخه وغواړي چې همدا اوس دنده ترسره کړي، د ورځې انتظار کولو پرځای.

بل مهم ټکی د غلطی زغم ډاډمن کول دي. کارتریج د روغتیا څارلو لپاره د SWIM پروتوکول کاروي [4]. په لنډه توګه، پروسې د UDP په اړه یو له بل سره "افواه" تبادله کوي — هره پروسه خپلو ګاونډیانو ته وروستي خبرونه وايي، او دوی ځواب ورکوي. که ناڅاپه ځواب را نه شي، ترنتول په شک پیل کوي چې یو څه غلط دی، او لږ څه وروسته د مرګ یادونه کوي او د دې خبر شاوخوا ټولو ته ویل پیل کوي.

د ترنتول کارتریج: په دریو کرښو کې د لوا شاته کول

د دې پروتوکول پراساس، کارتریج د اتوماتیک ناکامي پروسس تنظیموي. هره پروسه خپل چاپیریال څارنه کوي، او که چیرې مشر ناڅاپه غبرګون ودروي، نو عکس کولی شي خپل رول په غاړه واخلي، او کارټریج د دې مطابق روان رولونه تنظیموي.

د ترنتول کارتریج: په دریو کرښو کې د لوا شاته کول

تاسو باید دلته محتاط اوسئ، ځکه چې په پرله پسې ډول شاته تګ کولی شي د نقل کولو پرمهال د معلوماتو شخړو لامل شي. البته، تاسو باید په تصادفي ډول اتوماتیک ناکامي فعال نه کړئ. موږ باید په روښانه توګه پوه شو چې څه پیښیږي او ډاډه اوسو چې د مشر له رغولو او تاج بیرته هغه ته د بیرته راستنیدو وروسته به نقل نه ماتیږي.

له دې ټولو څخه، تاسو ممکن احساس ترلاسه کړئ چې رولونه د مایکرو خدماتو سره ورته دي. په یو معنی، دوی یوازې دا دي، یوازې د ترنټول پروسو کې د ماډلونو په توګه. مګر یو شمیر بنسټیز توپیرونه هم شتون لري. لومړی، د پروژې ټول رولونه باید په ورته کوډ بیس کې ژوند وکړي. او د ټرینټول ټولې پروسې باید د ورته کوډ بیس څخه پیل شي ، ترڅو هیڅ حیرانتیا شتون ونلري لکه کله چې موږ د مهالویش پیل کولو هڅه کوو ، مګر دا په ساده ډول شتون نلري. همچنان ، تاسو باید د کوډ نسخو کې توپیر ته اجازه ورنکړئ ، ځکه چې په داسې حالت کې د سیسټم چلند وړاندوینه او ډیبګ کول خورا ګران دي.

د ډاکر برعکس، موږ نشو کولی یوازې یو رول "انځور" واخلو، بل ماشین ته یې ورسوو او هلته یې چلوو. زموږ رولونه د ډاکر کانټینرونو په څیر جلا ندي. همدارنګه، موږ نشو کولی په یوه مثال کې دوه ورته رولونه پرمخ یوسو. یو رول یا شتون لري یا شتون نلري؛ دا یو واحد دی. او دریم، رولونه باید د ټول نقل کولو ګروپ کې یو شان وي، ځکه چې که نه نو دا به بې بنسټه وي - ډاټا یو شان ده، مګر ترتیب توپیر لري.

د ځای پرځای کولو وسیلې

ما ژمنه وکړه چې وښیم چې څنګه کارتریج د غوښتنلیکونو ځای په ځای کولو کې مرسته کوي. د نورو لپاره د ژوند اسانه کولو لپاره، چوکاټ د RPM کڅوړې بسته بندي کوي:

$ cartridge pack rpm myapp -- упакует для нас ./myapp-0.1.0-1.rpm
$ sudo yum install ./myapp-0.1.0-1.rpm

نصب شوي بسته نږدې هرڅه لري چې تاسو ورته اړتیا لرئ: دواړه غوښتنلیک او نصب شوي انحصارونه. Tarantool به د RPM کڅوړې د انحصار په توګه سرور ته راشي، او زموږ خدمت پیل کولو ته چمتو دی. دا د سیسټمډ له لارې ترسره کیږي، مګر لومړی تاسو اړتیا لرئ چې لږ ترتیب ولیکئ. لږترلږه، د هرې پروسې URI مشخص کړئ. د مثال په توګه درې کافي دي.

$ sudo tee /etc/tarantool/conf.d/demo.yml <<CONFIG
myapp.router: {"advertise_uri": "localhost:3301", "http_port": 8080}
myapp.storage_A: {"advertise_uri": "localhost:3302", "http_enabled": False}
myapp.storage_B: {"advertise_uri": "localhost:3303", "http_enabled": False}
CONFIG

دلته یو په زړه پوری نزاکت شتون لري. د دې پرځای چې یوازې د بائنری پروتوکول بندر مشخص کړئ، موږ د پروسې ټول عامه پته د کوربه نوم په شمول مشخص کوو. دا اړینه ده چې د کلستر نوډونه پوه شي چې څنګه یو بل سره وصل شي. دا یو بد نظر دی چې 0.0.0.0 د advertise_uri پته په توګه وکاروئ؛ دا باید یو بهرنی IP پته وي، نه د ساکټ بانډ. پرته له دې، هیڅ شی به کار ونه کړي، نو کارتریج به تاسو ته اجازه ورنکړي چې د غلط اعلان_uri سره نوډ پیل کړي.

اوس چې ترتیب چمتو دی، تاسو کولی شئ پروسې پیل کړئ. څرنګه چې یو منظم سیسټم واحد د یو څخه زیات پروسې پیل کولو ته اجازه نه ورکوي، په کارتریج کې غوښتنلیکونه د تش په نامه لخوا نصب شوي. سمدستي واحدونه چې دا ډول کار کوي:

$ sudo systemctl start myapp@router
$ sudo systemctl start myapp@storage_A
$ sudo systemctl start myapp@storage_B

په ترتیب کې، موږ د HTTP پورټ مشخص کړ په کوم کې چې کارټریج د ویب انٹرفیس - 8080 خدمت کوي. راځئ چې دې ته لاړ شو او یو نظر وګورو:

د ترنتول کارتریج: په دریو کرښو کې د لوا شاته کول

موږ ګورو چې که څه هم پروسې روانې دي، دوی لاهم تنظیم شوي ندي. کارتریج لا تر اوسه نه پوهیږي چې څوک باید له چا سره تکرار کړي او پخپله پریکړه نشي کولی، نو دا زموږ د عملونو په تمه دی. مګر موږ ډیر انتخاب نلرو: د نوي کلستر ژوند د لومړي نوډ تنظیم کولو سره پیل کیږي. بیا به موږ نور په کلستر کې اضافه کړو، دوی ته رولونه وټاکو، او پدې وخت کې ګمارل په بریالیتوب سره بشپړ شوي وګڼل شي.

راځئ چې یو ګیلاس ستاسو د خوښې څښاک وخورئ او د یوې اوږدې کاري اونۍ وروسته آرام کړئ. غوښتنلیک کارول کیدی شي.

د ترنتول کارتریج: په دریو کرښو کې د لوا شاته کول

پایلې

پایلې څه دي؟ دا هڅه وکړئ، وکاروئ، فیډبیک پریږدئ، په ګیتوب کې ټکټونه جوړ کړئ.

مرجع

[1] Tarantool » 2.2 » حواله » د ډبرو حواله » ماډل vshard

[2] موږ څنګه د ترانتول پر بنسټ د الفا بانک د پانګوونې سوداګرۍ اصلي برخه پلي کړه

[3] د نوي نسل بلینګ جوړښت: ټرانټول ته د لیږد سره بدلون

[4] SWIM - د کلستر جوړونې پروتوکول

[5] GitHub - tarantool/cartridge-cli

[6] GitHub - tarantool/cartridge

سرچینه: www.habr.com

Add a comment