پنځه زده کونکي او درې توزیع شوي کلیدي ارزښت پلورنځي

یا څنګه موږ د ZooKeeper، etcd او Consul KV لپاره د پیرودونکي C++ کتابتون لیکلی

د توزیع شوي سیسټمونو نړۍ کې، یو شمیر معمولي دندې شتون لري: د کلستر د جوړښت په اړه د معلوماتو ذخیره کول، د نوډونو ترتیب کول، د غلطو نوډونو کشف کول، د مشر غوره کول. او نور. د دې ستونزو د حل لپاره، ځانګړي ویشل شوي سیسټمونه رامینځته شوي - د همغږۍ خدمتونه. اوس به موږ له دریو څخه لیوالتیا ولرو: ZooKeeper، etcd او Consul. د قونسل د ټولو بډایه فعالیتونو څخه، موږ به په قونسل KV تمرکز وکړو.

پنځه زده کونکي او درې توزیع شوي کلیدي ارزښت پلورنځي

په اصل کې، دا ټول سیسټمونه د غلطۍ زغمونکي، د لینر وړ وړ کلیدي ارزښت پلورنځي دي. که څه هم د دوی ډیټا ماډلونه د پام وړ توپیرونه لري، کوم چې موږ به وروسته بحث وکړو، دوی ورته عملي ستونزې حل کوي. په ښکاره ډول، هر غوښتنلیک چې د همغږۍ خدمت کاروي له دوی څخه یو پورې تړلی دی، کوم چې ممکن په یو ډیټا مرکز کې د ډیری سیسټمونو مالتړ ته اړتیا رامینځته کړي چې د مختلف غوښتنلیکونو لپاره ورته ستونزې حل کړي.

د دې ستونزې د حل کولو مفکوره د آسټرالیا مشورتي ادارې کې رامینځته شوې ، او دا موږ ته راوتلې ، د زده کونکو یوه کوچنۍ ډله ، د پلي کولو لپاره ، دا هغه څه دي چې زه یې په اړه خبرې کوم.

موږ یو کتابتون جوړ کړو چې د ZooKeeper، etcd او Consul KV سره د کار کولو لپاره یو عام انٹرفیس چمتو کوي. کتابتون په C++ کې لیکل شوی، مګر پالنونه شتون لري چې نورو ژبو ته یې پورټ کړي.

د معلوماتو ماډلونه

د دریو مختلف سیسټمونو لپاره د ګډ انٹرفیس رامینځته کولو لپاره ، تاسو اړتیا لرئ پوه شئ چې دوی څه مشترک دي او څنګه توپیر لري. راځئ چې دا معلومه کړو.

ځوکیپر

پنځه زده کونکي او درې توزیع شوي کلیدي ارزښت پلورنځي

کیلي په ونې کې تنظیم شوي او د نوډونو په نوم یادیږي. په دې اساس، د نوډ لپاره تاسو کولی شئ د هغې د ماشومانو لیست ترلاسه کړئ. د زنوډ (جوړولو) او د ارزښت بدلولو عملیات (setData) جلا شوي: یوازې موجوده کیلي لوستل کیدی شي او بدلیدلی شي. ساعتونه د نوډ شتون چیک کولو عملیاتو سره ضمیمه کیدی شي ، ارزښت لوستل ، او ماشومان ترلاسه کول. واچ یو ځل محرک دی چې هغه وخت اوریږي کله چې په سرور کې د اړونده معلوماتو نسخه بدل شي. Ephemeral نوډونه د ناکامۍ موندلو لپاره کارول کیږي. دوی د پیرودونکي ناستې سره تړلي دي چې دوی یې رامینځته کړي. کله چې یو پیرودونکی ناسته بنده کړي یا د زوکیپر د شتون په اړه خبرتیا ودروي، دا نوډونه په اوتومات ډول حذف کیږي. ساده راکړې ورکړې ملاتړ کیږي - د عملیاتو یوه مجموعه چې یا ټول بریالي کیږي یا ناکام کیږي که چیرې دا لږترلږه د یوې لپاره ممکنه نه وي.

etcd

پنځه زده کونکي او درې توزیع شوي کلیدي ارزښت پلورنځي

د دې سیسټم پراختیا کونکي په څرګنده توګه د ZooKeeper لخوا هڅول شوي، او له همدې امله هرڅه په مختلف ډول ترسره کړل. د کلیدونو درجه بندي شتون نلري، مګر دوی د لیکوګرافیک ترتیب شوي سیټ جوړوي. تاسو کولی شئ د یوې ټاکلې حد پورې اړوند ټولې کیلي ترلاسه کړئ یا حذف کړئ. دا جوړښت ممکن عجیب ښکاري، مګر دا په حقیقت کې خورا څرګند دی، او د هغې له لارې یو منظم لید په اسانۍ سره تقلید کیدی شي.

etcd معیاري پرتله کولو او تنظیم کولو عملیات نلري، مګر دا یو څه ښه لري: لیږدونه. البته، دوی په ټولو دریو سیسټمونو کې شتون لري، مګر د etcd لیږدونه په ځانګړې توګه ښه دي. دوی درې بلاکونه لري: چک، بریالیتوب، ناکامي. لومړی بلاک د شرایطو یوه مجموعه لري، دوهم او دریم - عملیات. معامله په اټومي ډول اجرا کیږي. که ټول شرایط سم وي، نو د بریالیتوب بلاک اجرا کیږي، که نه نو د ناکامۍ بلاک اجرا کیږي. په API 3.3 کې، د بریالیتوب او ناکامۍ بلاکونه کیدای شي د نیستې لیږدونه ولري. دا دا دی، دا ممکنه ده چې په اټومي ډول د نږدې خپل سري ځنځیرونو کچې مشروط جوړښتونه اجرا کړئ. تاسو کولی شئ د دې په اړه نور معلومات زده کړئ چې کوم چکونه او عملیات شتون لري اسناد.

ساعتونه دلته هم شتون لري، که څه هم دوی یو څه ډیر پیچلي دي او د بیا کارولو وړ دي. دا دی، په کلیدي سلسله کې د ساعت نصبولو وروسته، تاسو به په دې رینج کې ټول تازه معلومات ترلاسه کړئ تر هغه چې تاسو ساعت لغوه نه کړئ، او نه یوازې لومړی. په etcd کې، د ZooKeeper مراجعینو غونډو انلاګ اجارې دي.

قونسل K.V.

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

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

دا ټول یوځای کول

ZooKeeper د ډیټا خورا سخت ماډل لري. په etcd کې موجود د څرګند رینج پوښتنې په مؤثره توګه په ZooKeeper یا Consul کې نه شي منل کیدی. د ټولو خدماتو څخه د غوره شاملولو هڅه کول، موږ د لاندې مهم استثناوو سره نږدې د ZooKeeper انٹرفیس سره مساوي انٹرفیس سره پای ته ورسوو:

  • ترتیب، کانټینر او TTL نوډونه نه ملاتړ شوی
  • ACLs نه ملاتړ کیږي
  • سیټ میتود یو کیلي رامینځته کوي که چیرې شتون ونلري (په ZK سیټ ډیټا پدې قضیه کې یوه تېروتنه راګرځوي)
  • سیټ او کاس میتودونه جلا شوي (په ZK کې دوی اساسا ورته شی دي)
  • د پاکولو طریقه یو نوډ د هغې فرعي ونې سره ړنګوي (په ZK حذف کې یوه تېروتنه راګرځي که نوډ ماشومان ولري)
  • د هرې کیلي لپاره یوازې یوه نسخه شتون لري - د ارزښت نسخه (په ZK کې له دوی څخه درې دي)

د ترتیبي نوډونو رد کول د دې حقیقت له امله دي چې etcd او Consul د دوی لپاره جوړ شوي ملاتړ نلري ، او دوی د کارونکي لخوا په اسانۍ سره د پایلې کتابتون انٹرفیس په سر کې پلي کیدی شي.

د ZooKeeper په څیر د چلند پلي کول کله چې یو عمودی ړنګول به په etcd او Consul کې د هرې کیلي لپاره د ماشوم جلا کاونټر ساتلو ته اړتیا ولري. څرنګه چې موږ هڅه وکړه چې د میټا معلوماتو ذخیره کولو مخه ونیسو، پریکړه وشوه چې ټول فرعي ونې حذف کړئ.

د پلي کولو لنډیز

راځئ چې په مختلفو سیسټمونو کې د کتابتون انٹرفیس پلي کولو ځینې اړخونو ته نږدې کتنه وکړو.

درجه بندي په etcd

په etcd کې د درجه بندي لید ساتل یو له خورا زړه پورې کارونو څخه وګرځید. د سلسلې پوښتنې دا اسانه کوي چې د ټاکل شوي مختګ سره د کیلي لیست ترلاسه کړئ. د مثال په توګه، که تاسو هر څه ته اړتیا لرئ چې پیل کیږي "/foo"، تاسو د یوې لړۍ غوښتنه کوئ ["/foo", "/fop"). مګر دا به د کیلي ټوله فرعي درخته بیرته راولي، کوم چې ممکن د منلو وړ نه وي که فرعي درخته لویه وي. په لومړي سر کې موږ پلان درلود چې د ژباړې کلیدي میکانیزم وکاروو، په zetcd کې پلي کیږي. پدې کې د کیلي په پیل کې د یو بایټ اضافه کول شامل دي ، په ونه کې د نوډ ژوروالي سره مساوي. اجازه راکړئ تاسو ته یو مثال درکړم.

"/foo" -> "u01/foo"
"/foo/bar" -> "u02/foo/bar"

بیا د کلید ټول سمدستي ماشومان ترلاسه کړئ "/foo" د حد غوښتنه کولو سره ممکنه ده ["u02/foo/", "u02/foo0"). هو، په ASCII کې "0" وروسته ولاړ دی "/".

مګر په دې قضیه کې د عمودی لرې کول څنګه پلي کول؟ دا معلومه شوه چې تاسو اړتیا لرئ د ډول ټول سلسلې حذف کړئ ["uXX/foo/", "uXX/foo0") د XX لپاره له 01 څخه FF ته. او بیا موږ ورننوتو د عملیاتو شمیر محدودیت په یوه معامله کې.

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

"/very" -> "/u00very"
"/very/long" -> "/very/u00long"
"/very/long/path" -> "/very/long/u00path"

بیا د کیلي ړنګول "/very" په ړنګولو بدلیږي "/u00very" او حد ["/very/", "/very0")، او د ټولو ماشومانو ترلاسه کول - د رینج څخه د کلیدونو په غوښتنه کې ["/very/u00", "/very/u01").

په ZooKeeper کې د کیلي لرې کول

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

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

په ZooKeeper کې تنظیم شوی

په ZooKeeper کې جلا میتودونه شتون لري چې د ونې جوړښت سره کار کوي (create, delete, getChildren) او دا چې په نوډونو (setData, getData) کې د ډیټا سره کار کوي. سربیره پردې ، ټولې میتودونه سخت شرایط لري: رامینځته کول به یوه تېروتنه راوباسي که چیرې نوډ دمخه شتون ولري. ډیټا رامینځته شوی ، حذف کړئ یا تنظیم کړئ - که دا دمخه شتون نلري. موږ یو ټاکل شوي میتود ته اړتیا درلوده چې د کیلي شتون په اړه فکر کولو پرته ویل کیدی شي.

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

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

نور تخنیکي توضیحات

پدې برخه کې به موږ د توزیع شوي سیسټمونو څخه وقفه واخلو او د کوډ کولو په اړه وغږیږو.
د پیرودونکي یو له اصلي اړتیاو څخه کراس پلیټ فارم و: لږترلږه یو له خدماتو څخه باید په لینکس ، MacOS او وینډوز کې ملاتړ شي. په پیل کې، موږ یوازې د لینکس لپاره وده کړې، او وروسته یې په نورو سیسټمونو کې ازموینه پیل کړه. دا د ډیرو ستونزو لامل شوی، کوم چې د یو څه وخت لپاره په بشپړه توګه روښانه نه و چې څنګه چلند وکړي. د پایلې په توګه، ټول درې د همغږۍ خدمتونه اوس په لینکس او MacOS کې ملاتړ کیږي، پداسې حال کې چې یوازې Consul KV په وینډوز کې ملاتړ کیږي.

له پیل څخه، موږ هڅه وکړه چې خدماتو ته د لاسرسي لپاره چمتو شوي کتابتونونه وکاروو. د ZooKeeper په حالت کې، انتخاب راوتلی زوکیپر C++، کوم چې په نهایت کې په وینډوز کې تالیف کولو کې پاتې راغلی. په هرصورت، دا د حیرانتیا خبره نه ده: کتابتون یوازې د لینکس په توګه موقعیت لري. د قونسل لپاره یوازینۍ لاره وه ppconsul. ملاتړ باید ورته اضافه شي غونډونه и معاملې. د etcd لپاره، یو بشپړ کتابتون چې د پروتوکول وروستۍ نسخه ملاتړ کوي ونه موندل شو، نو موږ په ساده ډول د grpc پیرودونکي تولید شوي.

د ZooKeeper C++ کتابتون د غیر متناسب انٹرفیس څخه الهام اخیستلو سره، موږ پریکړه وکړه چې یو غیر متناسب انٹرفیس هم پلي کړو. ZooKeeper C++ د دې لپاره راتلونکي/ژمنې ابتدايي کاروي. په STL کې، له بده مرغه، دوی په خورا معتدل ډول پلي کیږي. د مثال په توګه، نه بیا طریقه، کوم چې تیر شوی فنکشن د راتلونکي پایلې ته پلي کوي کله چې شتون ولري. زموږ په قضیه کې، دا ډول طریقه اړینه ده چې پایله زموږ د کتابتون په بڼه بدله کړي. د دې ستونزې د حل لپاره، موږ باید خپل ساده تار حوض پلي کړو، ځکه چې د پیرودونکي په غوښتنه موږ نشو کولی د دریمې ډلې درانه کتابتونونه لکه بوسټ وکاروو.

زموږ بیا پلي کول د دې په څیر کار کوي. کله چې ویل کیږي، اضافي ژمنه / راتلونکې جوړه جوړه کیږي. نوی راتلونکی بیرته راستانه شوی، او منظور شوی د اړونده فعالیت او په کتار کې اضافي ژمنې سره ځای پرځای کیږي. د حوض څخه یوه تار د کتار څخه څو فیوچرونه غوره کوي او د wait_for په کارولو سره رایې ورکوي. کله چې پایله شتون ولري، اړونده فعالیت ویل کیږي او د بیرته ستنیدو ارزښت ژمنې ته لیږدول کیږي.

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

نتیجه

د ځان لپاره وګورئ: liboffkv.

زموږ لوبډله: راید رومانوف, ایوان ګلوشینکوف, دمیتري کمالدینوف, ویکتور کراپینسکي, ویتالی ایوانین.

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

Add a comment