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

ZooKeeper دارای ویژگی های زیر است:

 ZooKeeper ساده است

ZooKeeper در هسته خود است، یک سیستم پرونده ای حذف شده است که چند عملیات ساده و برخی از انتزاعات اضافی، مانند سفارش و اعلانات را در معرض نمایش قرار می‌دهد.

 ZooKeeper رسا است

ZooKeeper اولیه مجموعه‌ای غنی از بلوک‌های ساختمانی است که می‌تواند برای ساختن یک کلاس بزرگ از ساختارها و پروتکل‌های داده هماهنگی استفاده شود. نمونه‌ها شامل صف‌های توزیع شده، قفل‌های توزیع شده و انتخابات رهبر در بین گروهی از جفت‌ها است.

ZooKeeper بسیار در دسترس است

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

ZooKeeper جفت تعامل سست را تسهیل می‌کند

تعامل ZooKeeper از شرکت کنندگان پشتیبانی می‌کند که نیازی به دانستن در مورد یکدیگر ندارند. به عنوان مثال، ZooKeeper می‌تواند به عنوان یک مکانیسم تصادفی مورد استفاده قرار گیرد تا پردازش‌هایی که در غیر این صورت از وجود یکدیگر (یا جزئیات شبکه) اطلاع ندارند می‌توانند کشف با یکدیگر و تعامل کنند. بخشهای هماهنگ حتی ممکن است مقارن نباشند زیرا یک فرآیند ممکن است پیامی را در ZooKeeper باقی بگذارد که پس از خاموش شدن اولین، توسط دیگری خوانده شود.

ZooKeeper یک کتابخانه است

ZooKeeper یک منبع باز، انبار مشترک از پیاده سازی‌ها و دستور العمل‌های الگوهای هماهنگی مشترک را ارائه می‌دهد. برنامه‌نویسان فردی از مسئولیت نوشتن پروتکل‌های مشترک و  متداول خودشان چشم پوشی می‌کنند (که گرفتن دستیابی درست به آنها اغلب سخت است). با گذشت زمان، عموم می‌تواند کتابخانه‌ها را اضافه و بهبود بخشد‌، که این به نفع همه است.

ZooKeeper بسیار اجرا کننده نیز است. در یاهو! که در آنجا ایجاد شده است‌، توان یک خوشه ZooKeeper با بیش از 10،000 عملیات در ثانیه برای بارهای کاری نوشتن که توسط صدها مشتری ایجاد شده است‌، محک زده شده است. برای بارهای کاری که در آن خواندن‌ها غالب است‌، که یک هنجار است‌، توان چند برابر بیشتر باشد.

نصب و راه اندازی ZooKeeper

هنگام اولین امتحان ZooKeeper ، ساده‌ترین اجرای آن در حالت مستقل با یک سرور ZooKeeper است. برای مثال می‌توان این کار را در دستگاه توسعه انجام داد. ZooKeeperبرای اجرا به Java نیاز دارد ، بنابراین ابتدا باید آن را نصب کرد.

عضویت در گروه در ZooKeeper

یکی از راه‌های درک ZooKeeper ، فکر کردن به آن به عنوان ارائه یک سیستم فایل در دسترس بالا است. آن فایل‌ها و دایرکتوری‌ها را ندارد‌، بلکه یک مفهوم یکپارچه از یک گره به نام znode است‌، که هم به عنوان یک ظرف داده (مانند یک فایل) و هم یک ظرف دیگر znodes  (مانند یک فهرست) عمل می‌کند.

پیوستن به یک گروه

بخش بعدی برنامه‌، برنامه‌ای برای ثبت نام عضو در یک گروه است. هر عضو به عنوان یک برنامه اجرا می‌شود و به گروهی می پیوندد. وقتی برنامه خارج شد، باید از گروه حذف شود، که می‌توان با ایجاد یک znode زودگذر که نمایانگر آن در فضای نام ZooKeeper است، انجام داد.

لیست کردن اعضا در یک گروه

اکنون برای یافتن اعضای گروه به یک برنامه نیاز است.

حذف یک گروه

می‌توان در صورت نیاز یک گروه را حذف کرد.

سرویس ZooKeeper

ZooKeeper یک سرویس هماهنگی با کارایی بالا و در دسترس است. در این بخش به ماهیت خدماتی چون مدل‌، عملکرد و اجرای آن پرداخته شده است.

مدل داده

ZooKeeper درخت سلسله مراتبی از گره‌ها به نام znodes را حفظ می‌کند. یک znode اطلاعات را ذخیره می‌کند و یک ACL مرتبط دارد. ZooKeeper برای هماهنگی (که به طور معمول از داده‌های کوچک استفاده می‌کند) طراحی شده است ، نه ذخیره سازی با حجم بالا ، بنابراین محدودیت به میزان 1 مگابایت داده‌ برای ذخیره شدن در هر znode وجود دارد.

znodes یکروزه (زودگذر)

همانطور که مشاهده کردیم ، znodes می‌تواند یکی از دو نوع باشد: زودگذر یا مداوم. نوع znode در زمان ایجاد تنظیم شده است و ممکن است بعداً تغییر نکند. با پایان یافتن جلسه مشتری ایجاد، یک znode زودگذر توسط ZooKeeper حذف می‌شود. در صورتی که یک znode پایدار به جلسه مشتری مرتبط نیست و فقط در صورت حذف صریح توسط یک مشتری حذف می‌شود.

شماره های موالی

یک znode متوالی به عنوان بخشی از نام آن توسط ZooKeeper به یک عدد دنباله داده می‌شود.

کشیک‌ها

هنگامی که یک znode به نوعی تغییر می‌کند ، کشیک‌ها به مشتریان امکان می‌دهند تا اعلان‌ها را دریافت کنند. کشیک‌ها توسط عملیات روی سرویس ZooKeeper تنظیم می‌شوند و توسط سایر عملیات موجود در این سرویس راه‌اندازی می‌شوند.

عملیات

در ZooKeeper نه عملیات اساسی انجام می‌شود.

Create                        Creates a znode (the parent znode must already exist)

delete                         Deletes a znode (the znode must not have any children)

exists                         Tests whether a znode exists and retrieves its metadata

getACL, setACL      Gets/sets the ACL for a znode

getChildren               Gets a list of the children of a znode

getData, setData       Gets/sets the data associated with a znode

sync                          Synchronizes a client’s view of a znode with ZooKeeper

چندوجهی

یک عملیات ZooKeeper دیگری وجود دارد ، به نام multi، که چندین عملیات ابتدایی را با هم در یک واحد جمع می‌کند که می‌تواند یکجا موفق یا ناموفق عمل کند. وضعیتی که برخی از عملیات ابتدایی موفقیت آمیز و برخی از آنها شکست می‌خورند و هرگز نمی توانند رخ دهند.

APIها

دو مشتری اصلی برای ZooKeeper وجود دارد ، یکی برای جاوا و دیگری برای C. برای مشتریان Perl ، Python و REST نیز تعهدات مشارکت وجود دارد.

راه‌اندازی کشیک

عملیات خواندن exists، getChildren ، و getData ممکن است دارای کشیک‌هایی باشد که روی آنها تنظیم شده است و کشیک‌ها توسط عملیات نوشتن شروع می‌شوند: create, delete, and setData. عملیات ACL در کشیک‌ها شرکت نمی‌کند.

ACLs

یک znode با لیستی از ACL ایجاد می‌شود که تعیین می‌کند چه کسی می‌تواند عملیات خاصی را روی آن انجام دهد.

پیاده سازی

سرویس ZooKeeper می تواند در دو حالت اجرا شود. در حالت مستقل ، یک سرور ZooKeeper وجود دارد که به دلیل سادگی می‌تواند برای آزمایش مفید باشد (حتی می‌تواند در تست‌های واحد تعبیه شود) اما هیچ تضمینی از در دسترس بودن یا مقاومت بالا ندارد. در تولید ، ZooKeeper در حالت تکرار شده بر روی خوشه‌ای از ماشین آلات به نام یک گروه اجرا می‌شود. ZooKeeper از طریق تکثیر دستیابی بالایی به دست می‌آورد و تا زمانی که اکثر دستگاه‌های موجود در مجموعه آماده باشند می‌توانند خدمات ارائه دهند.

ثبات

دانستن مبنای اجرای ZooKeeper در درک ضمانت‌های سازگاری این سرویس کمک می‌کند. اصطلاحات "رهبر" و "پیرو" برای ماشین آلات در یک مجموعه مناسب است زیرا آنها این نکته را بیان می‌کنند که یک پیرو‌ها ممکن است توسط تعدادی از به روزرسانی‌ها به تاخیر بیفتند.

جلسات

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

زمان

چندین پارامتر زمانی در ZooKeeper وجود دارد.

حالت‌ها

اشیاء ZooKeeper در چرخه عمر خود از طریق حالتهای مختلف عبور می‌کند. می‌توان وضعیت آن‌ها را در هر زمان با استفاده از متد getState () جستجو کرد:

public States getState()

ساخت برنامه‌های کاربردی با  ZooKeeper

اجازه دهید به نوشتن برخی از برنامه‌های مفید با آن برگردیم.

یک سرویس پیکربندی

یکی از اساسی‌ترین سرویس‌هایی که یک برنامه توزیع شده به آن نیاز دارد، یک سرویس پیکربندی است، در نتیجه قطعات معمول اطلاعات پیکربندی را می‌توان توسط ماشینها در یک خوشه به اشتراک گذاشت. در ساده‌ترین سطح، ZooKeeper می‌تواند به عنوان یک فروشگاه کاملاً در دسترس برای پیکربندی عمل کند و به شرکت کنندگان در برنامه اجازه می‌دهد فایل‌های پیکربندی را بازیابی یا به روز کنند. با استفاده از کشیک‌های ZooKeeper، می‌توان یک سرویس پیکربندی فعال ایجاد کرد که در آن کلاینت‌های علاقه مند از تغییرات در پیکربندی (تنظیمات) مطلع می‌شوند.

برنامه انعطاف‌پذیر  ZooKeeper

اولین حالت ازFallacies of Distributed Computing  اظهار داشت که "شبکه قابل اعتماد است." فرض می‌شود برنامه‌های ما تاکنون یک شبکه قابل اعتماد دارند، بنابراین وقتی آن‌ها در یک شبکه واقعی اجرا می‌شود، از چند طریق می‌توانند شکست بخورند. حال برخی از حالت‌های شکست احتمالی و کارهایی را که برای اصلاح آن‌ها می‌توان انجام داد تا برنامه‌ها در برابر خرابی مقاومت کنند را بررسی می‌کنیم.

InterpreException

اگر عملیات قطع شود، InterpreException پرتاب می‌شود. یک مکانیزم استاندارد جاوا برای ابطال روش‌های بلاک کردن وجود دارد، که عبارت است از فراخوانی قطع () در مسیری که از آن روش مسدود کردن فراخوانی شده است. یک لغو موفقیت آمیز منجر به InterpreException خواهد شد. ZooKeeper به این استاندارد پایبند است بنابراین می‌توان یک عمل ZooKeeper را از این طریق لغو کرد. کلاس‌ها یا کتابخانه‌هایی که از ZooKeeper استفاده می‌کنند، معمولاً باید InterpreException را پخش کنند تا کلاینت‌هایشان بتوانند عملیات خود را لغو کنند.

KeeperException

اگر سرور ZooKeeper خطایی را نشان دهد یا اینکه مشکل ارتباطی با سرور وجود داشت، KeeperException پرتاب می‌شود. برای موارد خطای مختلف، زیر کلاس‌های مختلف KeeperException وجود دارد.

یک سرویس پیکربندی قابل اعتماد

با بازگشت به روش نوشتن () در ActiveKeyValueStore ، باید به یاد داشت که این برنامه از یک عمل موجود متابعت شده توسط یک ایجاد یا setData تشکیل شده است:

public void write(String path, String value) throws InterruptedException,

KeeperException {

Stat stat = zk.exists(path, false);

if (stat == null) {

zk.create(path, value.getBytes(CHARSET), Ids.OPEN_ACL_UNSAFE,

CreateMode.PERSISTENT);

} else {

zk.setData(path, value.getBytes(CHARSET), -1);

}

}

سرویس قفل

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

تاثیر گردآوری

اگرچه این الگوریتم صحیح است، اما مشکلاتی نیز در مورد آن وجود دارد. مشکل اول این است که این اجرا از تاثیر گردآوری رنج می‌برد.

استثنائات غیرقابل بازگشت

اگر بخش کلاینت ZooKeeper منقضی شود، znode زودگذر ایجاد شده توسط مشتری حذف خواهد شد، به طور موثر از قفل چشم‌پوشی می‌کند (یا دست کم برای به دست آوردن قفل، نوبت کلاینت را رها می‌کند). برنامه کاربردی که از قفل استفاده می‌کند باید بداند که طولانی مدت قفل را نگه ندارد، آن حالت را پاک کرده و سپس دوباره یک شی قفل جدید ایجاد کرده و برای به دست آوردن آن دوباره تلاش کند.

ساختارها و پروتکل‌های داده توزیع شده بیشتر

ساختارها و پروتکل های داده توزیع بسیاری شده وجود دارند که می‌توان با ZooKeeper ساخت، مانند موانع، صف و تعهدات دو فاز. نکته جالب توجه این است که این پروتکل‌های همزمان هستند، حتی اگر از ZooKeeper ناهمزمان اولیه (مانند اعلان‌ها) برای ساخت آنها استفاده شود.

BookKeeper و Hedwig

BookKeeper یک سرویس ورود به سیستم بسیار قابل دسترس و قابل اعتماد است. می‌توان از آن برای تهیه گزارش ورود به سیستم استفاده کرد که یک روش معمول برای اطمینان از یکپارچگی داده‌ها در سیستم‌های ذخیره‌سازی است.

ZooKeeper در تولید

در تولید ZooKeeper را در حالت تکرار باید اجرا کرد. در اینجا، برخی از ملاحظات اجرای گروهی از سرورهای ZooKeeper پوشش داده خواهد شد. اما این بخش جامع نیست، بنابراین برای راهنمایی‌های دقیق و به روز از جمله سیستم عامل‌های پشتیبانی شده، سخت‌افزارهای پیشنهادی، روش‌های نگهداری، پیکربندی مجدد دینامیکی (برای تغییر سرورها در یک مجموعه در حال اجرا) و ویژگی های پیکربندی باید با راهنمای مدیر ZooKeeper مشورت کنید.  

انعطاف‌پذیری و عملکرد

ماشینهای ZooKeeper برای به حداقل رساندن تأثیر خرابی دستگاه و شبکه مستقر می‌شوند. در عمل، این بدان معنی است که سرورها باید در میان منبع تغذیه و سوئیچ‌ها پخش شوند تا خرابی هیچ یک از این موارد باعث نشود که این گروه، اکثریت سرورهای خود را از دست بدهند.

پیکربندی

هر سرور در گروه سرورهای ZooKeeper دارای یک شناسه عددی است که در این گروه تک است و باید بین 1 تا 255 قرار بگیرد. شماره سرور به صورت ساده در پرونده‌ای به نام myid در دایرکتوری مشخص شده توسط خاصیت dataDir مشخص می‌شود.

برای مطالعه بیشتر

برای کسب اطلاعات عمیق تر درباره ZooKeeper ، به ZooKeeper توسط Flavio Junqueira و Benjamin Reed مراجعه کنید (O'Reilly، 2013).