SlideShare a Scribd company logo
1 of 14
Download to read offline
ZooKeeper. Обзор теории и
примеры практических решений.
Владимир Бадовский
Vovo4kin@rambler.ru
ZooKeeper - это координационный сервис для распределённых приложений. С его
помощью можно конфигурировать и синхронизировать части распределённого приложения.
ZooKeeper - это сервер, в development целях можно установить на большинство
популярных платформ, в целях production рекомендуются GNU/Linux и Sun Solaris платформы.
Для повышения надёжности таких серверов в вашем приложении может быть несколько.
В дистрибутив включён консольный клиента zkCli.cmd.
Взаимодействие распределённых процессов осуществляется посредством общего
иерархического пространства имён, которое организованно по аналогии с обычной файловой
системой.
Znode - структурная единица, регистр данных, она вобрала в себя свойства и файла и
директории.
Вступление
Иерархическое пространство имён
/
/birds
/fishes
/birds/eagle
/birds/swan
/fishes/shark
/fishes/carp
Znode могут только создаваться и удалятся.
Может хранить информацию до 1 Mb.
Атомарность работы с данными. Данные сохраняемые в znode считываются или
записываются атомарно. Чтение вычитывает все данные из znode, запись полностью
уничтожает предыдущую информацию.
Access Control List (ACL). Каждая znode имеет механизм разграничения доступа.
Версирование всех изменений. Каждое изменение в znode вызывает увеличение одного
из трёх счётчиков версий: version - счётчик изменения данных, cversion - счётчик изменения
детей znode и aversion - счётчик изменения прав доступа к znode .
Ephemeral и Persistant znodes.
Sequentional znodes.
create("parent/child",...) -> "/parent/child0000000000"
create("parent/child",...) -> "/parent/child0000000001"
Свойства Znode
class SomeWatcher implements Watcher {
@Override
public void process(WatchedEvent watchedEvent) {
// Do some work
}
}
Watching - механизм оповещения клиента о изменениях в/с интересующей клиента znode.
Клиент может зарегистрировать watcher на znode на определённый тип изменения znode. В
последствии при возникновении указанного изменения znode, происходит срабатывание
watcher. При этом zookeeper-сервер шлёт уведомление клиенту, который зарегистрировал
этот watcher.
Watcher срабатывает единоразово, и для последующего вотчинга необходимо его заново
регистрировать.
Watcher это объект класса имплементирующего интерфейс org.apache.zookeeper.
Watcher, в котором всего один метод вызываемый при срабатывании watcher.
Watcher
На клиентской стороне обработкой всех вотчеров занимается один поток, поэтому не
стоит перегружать метод process.
exists, create, delete, setData, getData, getChildren, getACL, setACL, sync
Команды exists, getData, getChildren могут дополнительно устанавливать watcher.
ExistWatcher, DataWatcher и ChildrenWatcher соответственно. Команды create, delete, setData
вызывают срабатывание заданного типа watcher.
Правила выставления и условия срабатывания watcher приведены в таблице.
Основные команды для работы с
ZooKeeper
Команды
выставляющие
watcher
Команды вызывающие срабатывание watcher
create delete setData
exist NodeCreated NodeDeleted NodeDataChanged
getData NodeDeleted NodeDataChanged
getChildren NodeChildrenChanged
NodeDeleted
NodeChildrenChanged
Установка - распаковать.
Подправить конфиг: tickTime единица исчисления времени, dataDir директория в которой
будет хранится так называемый the in-memory database snapshots при работе вся информация
содержится в оперативной памяти, а её слепок дублируется на диске в указанной папке,
clientPort порт на который будет стучаться клиент.
zkServer.cmd - запуск сервера.
При подключении с клиентской части помимо ip и порта надо указать session timeout в
tickTime. Это время на сколько максимум может пропадать связь между сервером и клиентом.
Кроме того важно указать так называемого default Watcher и озадачить его мониторингом
подключения к серверу.
Поскольку подключение к серверу происходит асинхронно, то прежде чем работать с
zookeeper-клиентом необходимо дождаться его подсоединения к серверу Event.KeeperState.
SyncConnected.
Подготовка и начало работы
Конструктор сразу возвращает экземпляр класса org.apache.zookeeper.ZooKeeper, но это
не значит что с ним уже можно работать. Связь устанавливается асинхронно, поэтому следует
предусмотреть в коде задержку и проверку состояния соединения. В представленной
реализации сервис обращается к ZooKeeper используя промежуточный класс zooClient.
getZooKeeper().
Пример подключения к серверу
public class ZooClient {
...
public ZooKeeper getZooKeeper() {
if ((zooKeeper == null)) {
final CountDownLatch connected = new CountDownLatch(1);
Watcher watcher = new Watcher() {
public void process(WatchedEvent event) {
if (event.getState() == Event.KeeperState.SyncConnected) {
connected.countDown();
}
}
};
zooKeeper = new ZooKeeper(hosts, sessionTimeout, watcher);
connected.await();
}
return zooKeeper;
}
...
}
Поднимается нечётное кличество серверов - ensemble. Данные полностью дублируются на
каждом сервере. При подъёме кластера происходит выбор Leader. Leader это тот сервер через
который происходит запись информации. Клиенты подключаются к followers, followers
перенаправляют эти запросы на Leader. В случае падения Leader переизбирается.
В конфиг каждого сервера добавляются ip и порты всех членов кластера (server.1,
server.2...), параметры связи между followers и Leader (initLimit, syncLimit). Кроме того в bin/
добавляется файл myid с уникальным номер своего сервера в кластере.
У клиента должны быть адреса всех членов кластера, для возможности переключения в
случае падения текущего сервера(hosts).
Кластер
SequentialWatcher(sw)
/parent
/parent/B000000000
/parent/B000000001
/parent/B000000002
B0
B1
B2
sw
sw
swA0
A1
A2
{B0, B1, B2}
{B0, B1, B2}
{B0, B1, B2}
Дано: множество процесов типа А, каждый из которых должен отслеживать появление
каждого процесса типа B.
При появлении процесс B создаёт sequentional znode в оговоренной parent znode.
Каждый процесс A заранее регистрирует childrenWatcher на parent znode. При
срабатывании атомарно происходит вычитывание текущего списка znode типа B, и выставления
такого же watcher, в простейшем случае самого себя. За счёт атомарности getChildren ни одна
znode типа B не появится незамеченной.
SequentialWatcher
public abstract class SequentialWatcher implements Watcher {
...
@Override
public void process(WatchedEvent event) {
String basePath = event.getPath();
List<String> seqNodesNames = zookeeperService.getChildren(basePath, this);
int previousSize = dtoList.getSequence();
int currentSize = seqNodesNames.size();
Collections.sort(seqNodesNames);
List<String> newNodesList = seqNodesNames.subList(previousSize, currentSize);
analyze(basePath, newNodesList); // Do some work with new process
}
...
}
Дано znode, которая возможно уже не существует, но если существует необходимо
получить оповещение о её удалении. Если использовать простой exist в случаях отсутствия
znode у нас остаётся заведомо несработающий watcher. Гораздо рациональнее использовать
getData.
Set watcher if znode exist
public class ZookeeperServiceImpl implements ZookeeperService {
...
@Override
public boolean setWatcherIfNodeExists(String path, Watcher watcher) throws TechnicalException {
try {
zooClient.getZooKeeper().getData(path, watcher, null);
return true;
} catch (KeeperException e) {
if (e.code().intValue() == KeeperException.Code.NONODE.intValue()) {
return false;
} else {
throw new TechnicalException(e, log);
}
} catch (Exception e) {
throw new TechnicalException(e, log);
}
}
...
}
Дано процесс типа А выдаёт задачу процессу типа В, процесс В возвращает результат
процессу типа А. Вычисление результата может происходить мгновенно.
В приведенном коде процесс изначально выставляет watcher на появление некоторой
znode с результатом. Процесс типа В следит за детьми оговоренной parent znode. Процесс типа
А создаёт sequentional znode в parent и атомарно записывет в неё условие задачи и путь znode
в которую положить результат. При этом как быстро процесс расчёта не происходил бы
результат всё равно будет зафиксирован.
Put task, get result
...
zooKeeper.exist(resultPath, new ProcessResultWatcher());
zooKeeper.create(path, taskWithResultPath, CreateMode.PERSISTENT_SEQUENTIAL);
...
http://zookeeper.apache.org/
http://anismiles.wordpress.com/2010/06/08/zookeeper-primer/
http://anismiles.wordpress.com/tag/zookeeper/
http://habrahabr.ru/post/144708/
Ресурсы

More Related Content

What's hot

Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Ontico
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersАлексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersAleksey Fomkin
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Ontico
 
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - MultithreadingNoveo
 
Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Ontico
 
Scaling services with apache mesos (and docker)
Scaling services with apache mesos (and docker)Scaling services with apache mesos (and docker)
Scaling services with apache mesos (and docker)Ivan Kudryavtsev
 
обзор архитектуры и подсистем деплоя и мониторинга
обзор архитектуры и подсистем деплоя и мониторингаобзор архитектуры и подсистем деплоя и мониторинга
обзор архитектуры и подсистем деплоя и мониторингаКонстантин Никифоров
 
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)Ontico
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Ontico
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ontico
 
Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)
Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)
Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)Ontico
 
Доклад Ильи Аблеева на DevOps Meetup "Мониторинг высоконагруженного проекта".
Доклад Ильи Аблеева на DevOps Meetup "Мониторинг высоконагруженного проекта".Доклад Ильи Аблеева на DevOps Meetup "Мониторинг высоконагруженного проекта".
Доклад Ильи Аблеева на DevOps Meetup "Мониторинг высоконагруженного проекта".Badoo Development
 
Резервное копирование MySQL в экстремальных условиях
Резервное копирование MySQL в экстремальных условияхРезервное копирование MySQL в экстремальных условиях
Резервное копирование MySQL в экстремальных условияхSveta Smirnova
 
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...Ontico
 
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Ontico
 
DC/OS – больше чем PAAS, Никита Борзых (Express 42)
DC/OS – больше чем PAAS, Никита Борзых (Express 42)DC/OS – больше чем PAAS, Никита Борзых (Express 42)
DC/OS – больше чем PAAS, Никита Борзых (Express 42)Ontico
 
Пространства имен Linux (linux namespaces)
Пространства имен Linux (linux namespaces)Пространства имен Linux (linux namespaces)
Пространства имен Linux (linux namespaces)OSLL
 
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...Ontico
 
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)Ontico
 

What's hot (20)

Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
 
Zabbix v2
Zabbix v2Zabbix v2
Zabbix v2
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersАлексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web Workers
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
 
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - Multithreading
 
Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.
 
Scaling services with apache mesos (and docker)
Scaling services with apache mesos (and docker)Scaling services with apache mesos (and docker)
Scaling services with apache mesos (and docker)
 
обзор архитектуры и подсистем деплоя и мониторинга
обзор архитектуры и подсистем деплоя и мониторингаобзор архитектуры и подсистем деплоя и мониторинга
обзор архитектуры и подсистем деплоя и мониторинга
 
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
 
Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)
Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)
Оптимизация времени запуска iOS-приложений / Николай Лихогруд (Яндекс)
 
Доклад Ильи Аблеева на DevOps Meetup "Мониторинг высоконагруженного проекта".
Доклад Ильи Аблеева на DevOps Meetup "Мониторинг высоконагруженного проекта".Доклад Ильи Аблеева на DevOps Meetup "Мониторинг высоконагруженного проекта".
Доклад Ильи Аблеева на DevOps Meetup "Мониторинг высоконагруженного проекта".
 
Резервное копирование MySQL в экстремальных условиях
Резервное копирование MySQL в экстремальных условияхРезервное копирование MySQL в экстремальных условиях
Резервное копирование MySQL в экстремальных условиях
 
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
Zabbix и миллионы метрик: наилучший опыт масштабного мониторинга / Алексей Вл...
 
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
 
DC/OS – больше чем PAAS, Никита Борзых (Express 42)
DC/OS – больше чем PAAS, Никита Борзых (Express 42)DC/OS – больше чем PAAS, Никита Борзых (Express 42)
DC/OS – больше чем PAAS, Никита Борзых (Express 42)
 
Пространства имен Linux (linux namespaces)
Пространства имен Linux (linux namespaces)Пространства имен Linux (linux namespaces)
Пространства имен Linux (linux namespaces)
 
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
 
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
Monitoring driven эксплуатация / Николай Сивко (HeadHunter)
 

Similar to ZooKeeper Java Cloud

Продвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевПродвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевYandex
 
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Vadim Kruchkov
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS Pavel Tsukanov
 
IOP202 DevCon 2012 Apache Lucene in Windows Azure
IOP202 DevCon 2012 Apache Lucene in Windows AzureIOP202 DevCon 2012 Apache Lucene in Windows Azure
IOP202 DevCon 2012 Apache Lucene in Windows AzureVadim Novitskiy
 
Живые приложения с Rx
Живые приложения с RxЖивые приложения с Rx
Живые приложения с RxGoSharp
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Noveo
 
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The GrinderИлья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The GrinderSQALab
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)Noveo
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1Technopark
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverIgor Khrol
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Yandex
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackAlexey Ivanov
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Nikita Borzykh
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish SQALab
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один goBadoo Development
 
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехникиCodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехникиCodeFest
 

Similar to ZooKeeper Java Cloud (20)

Продвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевПродвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр Кошелев
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
IOP202 DevCon 2012 Apache Lucene in Windows Azure
IOP202 DevCon 2012 Apache Lucene in Windows AzureIOP202 DevCon 2012 Apache Lucene in Windows Azure
IOP202 DevCon 2012 Apache Lucene in Windows Azure
 
Живые приложения с Rx
Живые приложения с RxЖивые приложения с Rx
Живые приложения с Rx
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The GrinderИлья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish
 
Working with .NET Threads
Working with .NET ThreadsWorking with .NET Threads
Working with .NET Threads
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехникиCodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
CodeFest 2011. Высоцкий С. — Crawljax. Четвертый закон робототехники
 

ZooKeeper Java Cloud

  • 1. ZooKeeper. Обзор теории и примеры практических решений. Владимир Бадовский Vovo4kin@rambler.ru
  • 2. ZooKeeper - это координационный сервис для распределённых приложений. С его помощью можно конфигурировать и синхронизировать части распределённого приложения. ZooKeeper - это сервер, в development целях можно установить на большинство популярных платформ, в целях production рекомендуются GNU/Linux и Sun Solaris платформы. Для повышения надёжности таких серверов в вашем приложении может быть несколько. В дистрибутив включён консольный клиента zkCli.cmd. Взаимодействие распределённых процессов осуществляется посредством общего иерархического пространства имён, которое организованно по аналогии с обычной файловой системой. Znode - структурная единица, регистр данных, она вобрала в себя свойства и файла и директории. Вступление
  • 4. Znode могут только создаваться и удалятся. Может хранить информацию до 1 Mb. Атомарность работы с данными. Данные сохраняемые в znode считываются или записываются атомарно. Чтение вычитывает все данные из znode, запись полностью уничтожает предыдущую информацию. Access Control List (ACL). Каждая znode имеет механизм разграничения доступа. Версирование всех изменений. Каждое изменение в znode вызывает увеличение одного из трёх счётчиков версий: version - счётчик изменения данных, cversion - счётчик изменения детей znode и aversion - счётчик изменения прав доступа к znode . Ephemeral и Persistant znodes. Sequentional znodes. create("parent/child",...) -> "/parent/child0000000000" create("parent/child",...) -> "/parent/child0000000001" Свойства Znode
  • 5. class SomeWatcher implements Watcher { @Override public void process(WatchedEvent watchedEvent) { // Do some work } } Watching - механизм оповещения клиента о изменениях в/с интересующей клиента znode. Клиент может зарегистрировать watcher на znode на определённый тип изменения znode. В последствии при возникновении указанного изменения znode, происходит срабатывание watcher. При этом zookeeper-сервер шлёт уведомление клиенту, который зарегистрировал этот watcher. Watcher срабатывает единоразово, и для последующего вотчинга необходимо его заново регистрировать. Watcher это объект класса имплементирующего интерфейс org.apache.zookeeper. Watcher, в котором всего один метод вызываемый при срабатывании watcher. Watcher На клиентской стороне обработкой всех вотчеров занимается один поток, поэтому не стоит перегружать метод process.
  • 6. exists, create, delete, setData, getData, getChildren, getACL, setACL, sync Команды exists, getData, getChildren могут дополнительно устанавливать watcher. ExistWatcher, DataWatcher и ChildrenWatcher соответственно. Команды create, delete, setData вызывают срабатывание заданного типа watcher. Правила выставления и условия срабатывания watcher приведены в таблице. Основные команды для работы с ZooKeeper Команды выставляющие watcher Команды вызывающие срабатывание watcher create delete setData exist NodeCreated NodeDeleted NodeDataChanged getData NodeDeleted NodeDataChanged getChildren NodeChildrenChanged NodeDeleted NodeChildrenChanged
  • 7. Установка - распаковать. Подправить конфиг: tickTime единица исчисления времени, dataDir директория в которой будет хранится так называемый the in-memory database snapshots при работе вся информация содержится в оперативной памяти, а её слепок дублируется на диске в указанной папке, clientPort порт на который будет стучаться клиент. zkServer.cmd - запуск сервера. При подключении с клиентской части помимо ip и порта надо указать session timeout в tickTime. Это время на сколько максимум может пропадать связь между сервером и клиентом. Кроме того важно указать так называемого default Watcher и озадачить его мониторингом подключения к серверу. Поскольку подключение к серверу происходит асинхронно, то прежде чем работать с zookeeper-клиентом необходимо дождаться его подсоединения к серверу Event.KeeperState. SyncConnected. Подготовка и начало работы
  • 8. Конструктор сразу возвращает экземпляр класса org.apache.zookeeper.ZooKeeper, но это не значит что с ним уже можно работать. Связь устанавливается асинхронно, поэтому следует предусмотреть в коде задержку и проверку состояния соединения. В представленной реализации сервис обращается к ZooKeeper используя промежуточный класс zooClient. getZooKeeper(). Пример подключения к серверу public class ZooClient { ... public ZooKeeper getZooKeeper() { if ((zooKeeper == null)) { final CountDownLatch connected = new CountDownLatch(1); Watcher watcher = new Watcher() { public void process(WatchedEvent event) { if (event.getState() == Event.KeeperState.SyncConnected) { connected.countDown(); } } }; zooKeeper = new ZooKeeper(hosts, sessionTimeout, watcher); connected.await(); } return zooKeeper; } ... }
  • 9. Поднимается нечётное кличество серверов - ensemble. Данные полностью дублируются на каждом сервере. При подъёме кластера происходит выбор Leader. Leader это тот сервер через который происходит запись информации. Клиенты подключаются к followers, followers перенаправляют эти запросы на Leader. В случае падения Leader переизбирается. В конфиг каждого сервера добавляются ip и порты всех членов кластера (server.1, server.2...), параметры связи между followers и Leader (initLimit, syncLimit). Кроме того в bin/ добавляется файл myid с уникальным номер своего сервера в кластере. У клиента должны быть адреса всех членов кластера, для возможности переключения в случае падения текущего сервера(hosts). Кластер
  • 11. Дано: множество процесов типа А, каждый из которых должен отслеживать появление каждого процесса типа B. При появлении процесс B создаёт sequentional znode в оговоренной parent znode. Каждый процесс A заранее регистрирует childrenWatcher на parent znode. При срабатывании атомарно происходит вычитывание текущего списка znode типа B, и выставления такого же watcher, в простейшем случае самого себя. За счёт атомарности getChildren ни одна znode типа B не появится незамеченной. SequentialWatcher public abstract class SequentialWatcher implements Watcher { ... @Override public void process(WatchedEvent event) { String basePath = event.getPath(); List<String> seqNodesNames = zookeeperService.getChildren(basePath, this); int previousSize = dtoList.getSequence(); int currentSize = seqNodesNames.size(); Collections.sort(seqNodesNames); List<String> newNodesList = seqNodesNames.subList(previousSize, currentSize); analyze(basePath, newNodesList); // Do some work with new process } ... }
  • 12. Дано znode, которая возможно уже не существует, но если существует необходимо получить оповещение о её удалении. Если использовать простой exist в случаях отсутствия znode у нас остаётся заведомо несработающий watcher. Гораздо рациональнее использовать getData. Set watcher if znode exist public class ZookeeperServiceImpl implements ZookeeperService { ... @Override public boolean setWatcherIfNodeExists(String path, Watcher watcher) throws TechnicalException { try { zooClient.getZooKeeper().getData(path, watcher, null); return true; } catch (KeeperException e) { if (e.code().intValue() == KeeperException.Code.NONODE.intValue()) { return false; } else { throw new TechnicalException(e, log); } } catch (Exception e) { throw new TechnicalException(e, log); } } ... }
  • 13. Дано процесс типа А выдаёт задачу процессу типа В, процесс В возвращает результат процессу типа А. Вычисление результата может происходить мгновенно. В приведенном коде процесс изначально выставляет watcher на появление некоторой znode с результатом. Процесс типа В следит за детьми оговоренной parent znode. Процесс типа А создаёт sequentional znode в parent и атомарно записывет в неё условие задачи и путь znode в которую положить результат. При этом как быстро процесс расчёта не происходил бы результат всё равно будет зафиксирован. Put task, get result ... zooKeeper.exist(resultPath, new ProcessResultWatcher()); zooKeeper.create(path, taskWithResultPath, CreateMode.PERSISTENT_SEQUENTIAL); ...