Коротше кажучи, ZooKeeper допомагає створювати розподілені програми.
Як це працює
Ви можете описати ZooKeeper як копіювану послугу синхронізації з можливою послідовністю. Це надійно, оскільки збережені дані розподіляються між декількома вузлами (цей набір вузлів називається "ансамблем") і один клієнт підключається до будь-якого з них (тобто конкретного "сервера"), мігруючи, якщо один вузол виходить з ладу; поки працює сувора більшість вузлів, ансамбль вузлів ZooKeeper живий. Зокрема, головний вузол динамічно вибирається консенсусом всередині ансамблю; якщо головний вузол виходить з ладу, роль ведучого переходить на інший вузол.
Як обробляються записи
Майстер є авторитетом для запису: таким чином записи можуть бути гарантовано збережені в порядку, тобто записи є лінійними . Кожен раз, коли клієнт пише в ансамбль, більшість вузлів зберігає інформацію: ці вузли включають сервер для клієнта і, очевидно, головний майстер. Це означає, що кожне записування робить сервер в курсі майстра. Це також означає, що ви не можете мати одночасні записи.
Гарантія лінійного запису є причиною того, що ZooKeeper не працює на робочих навантаженнях, що домінують при записі. Зокрема, його не слід використовувати для обміну великими даними, наприклад, ЗМІ. Поки ваше спілкування передбачає спільні дані, ZooKeeper допомагає вам. Коли дані можуть бути записані одночасно, ZooKeeper насправді заважає, оскільки це накладає суворе впорядкування операцій, навіть якщо це не є строго необхідним з точки зору письменників. Його ідеальне використання - для координації, де обмінюються повідомленнями між клієнтами.
Як обробляються читання
Тут ZooKeeper перевершує: читання є одночасними, оскільки їх обслуговує конкретний сервер, до якого підключається клієнт. Однак це також є причиною можливої послідовності: "перегляд" клієнта може бути застарілим, оскільки майстер оновлює відповідний сервер з обмеженою, але невизначеною затримкою.
Детально
Реплікувана база даних ZooKeeper включає дерево знодів , які є сутностями, що приблизно представляють вузли файлової системи ( уявляйте їх як каталоги). Кожен znode може бути збагачений байтовим масивом, який зберігає дані. Також кожен znode може мати під собою інші znodes, практично утворюючи внутрішню систему каталогів.
Послідовні вузли
Цікаво, що ім'я znode може бути послідовним , це означає, що ім'я, яке надає клієнт при створенні znode, є лише префіксом: повне ім'я також надається послідовним номером, обраним ансамблем. Це корисно, наприклад, для цілей синхронізації: якщо кілька клієнтів хочуть отримати блокування на ресурсі, вони можуть одночасно створити послідовний зон у локації: той, хто отримує найменший номер, має право на блокування.
Ефемерні вузли
Також znode може бути ефемерним : це означає, що він знищується, як тільки клієнт, який його створив, відключиться. Це в основному корисно для того, щоб знати, коли клієнт відмовляє, що може бути актуально, коли сам клієнт має обов'язки, які повинен взяти на себе новий клієнт. Беручи приклад блокування, як тільки клієнт з блокуванням відключається, інші клієнти можуть перевірити, чи мають вони право на замок.
Годинники
Приклад, пов’язаний з відключенням клієнта, може бути проблематичним, якщо нам потрібно періодично опитувати стан znodes. На щастя, ZooKeeper пропонує систему подій, де годинник можна встановити на зоні. Ці годинники можуть бути встановлені для запуску події, якщо znode спеціально змінено або видалено або під ним створюються нові діти. Це однозначно корисно в поєднанні з послідовними та ефемерними варіантами для знодів.
Де і як ним користуватися
Канонічним прикладом використання Zookeeper є обчислення розподіленої пам'яті, де деякі дані діляться між клієнтськими вузлами і повинні бути доступні / оновлені дуже обережно для обліку синхронізації.
ZooKeeper пропонує бібліотеці сконструювати ваші примітиви синхронізації, тоді як можливість запуску розподіленого сервера дозволяє уникнути проблеми з єдиною точкою помилки, яка виникає при використанні централізованого сховища повідомлень (подібних до брокера).
ZooKeeper - це функція, що означає, що механізми, такі як вибори лідера, блокування, бар'єри тощо, вже відсутні, але їх можна записати вище примітивів ZooKeeper. Якщо API C / Java занадто громіздкий для ваших цілей, вам слід покластися на бібліотеки, побудовані на ZooKeeper, такі як клітки та особливо куратор .
Де читати більше
Окрім офіційної документації, яка є досить хорошою, я пропоную прочитати Розділ 14 Hadoop: Посібник з визначеннями, який містить ~ 35 сторінок, де пояснюється по суті, що робить ZooKeeper, а потім приклад служби конфігурації.