Your SlideShare is downloading. ×
ZooKeeper. Обзор теории ипримеры практических решений.Владимир БадовскийVovo4kin@rambler.ru
ZooKeeper - это координационный сервис для распределённых приложений. С егопомощью можно конфигурировать и синхронизироват...
Иерархическое пространство имён//birds/fishes/birds/eagle/birds/swan/fishes/shark/fishes/carp
Znode могут только создаваться и удалятся.Может хранить информацию до 1 Mb.Атомарность работы с данными. Данные сохраняемы...
class SomeWatcher implements Watcher {@Overridepublic void process(WatchedEvent watchedEvent) {// Do some work}}Watching -...
exists, create, delete, setData, getData, getChildren, getACL, setACL, syncКоманды exists, getData, getChildren могут допо...
Установка - распаковать.Подправить конфиг: tickTime единица исчисления времени, dataDir директория в которойбудет хранится...
Конструктор сразу возвращает экземпляр класса org.apache.zookeeper.ZooKeeper, но этоне значит что с ним уже можно работать...
Поднимается нечётное кличество серверов - ensemble. Данные полностью дублируются накаждом сервере. При подъёме кластера пр...
SequentialWatcher(sw)/parent/parent/B000000000/parent/B000000001/parent/B000000002B0B1B2swswswA0A1A2{B0, B1, B2}{B0, B1, B...
Дано: множество процесов типа А, каждый из которых должен отслеживать появлениекаждого процесса типа B.При появлении проце...
Дано znode, которая возможно уже не существует, но если существует необходимополучить оповещение о её удалении. Если испол...
Дано процесс типа А выдаёт задачу процессу типа В, процесс В возвращает результатпроцессу типа А. Вычисление результата мо...
http://zookeeper.apache.org/http://anismiles.wordpress.com/2010/06/08/zookeeper-primer/http://anismiles.wordpress.com/tag/...
Upcoming SlideShare
Loading in...5
×

ZooKeeper Java Cloud

575

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
575
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "ZooKeeper Java Cloud"

  1. 1. ZooKeeper. Обзор теории ипримеры практических решений.Владимир БадовскийVovo4kin@rambler.ru
  2. 2. ZooKeeper - это координационный сервис для распределённых приложений. С егопомощью можно конфигурировать и синхронизировать части распределённого приложения.ZooKeeper - это сервер, в development целях можно установить на большинствопопулярных платформ, в целях production рекомендуются GNU/Linux и Sun Solaris платформы.Для повышения надёжности таких серверов в вашем приложении может быть несколько.В дистрибутив включён консольный клиента zkCli.cmd.Взаимодействие распределённых процессов осуществляется посредством общегоиерархического пространства имён, которое организованно по аналогии с обычной файловойсистемой.Znode - структурная единица, регистр данных, она вобрала в себя свойства и файла идиректории.Вступление
  3. 3. Иерархическое пространство имён//birds/fishes/birds/eagle/birds/swan/fishes/shark/fishes/carp
  4. 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. 5. class SomeWatcher implements Watcher {@Overridepublic 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. 6. exists, create, delete, setData, getData, getChildren, getACL, setACL, syncКоманды exists, getData, getChildren могут дополнительно устанавливать watcher.ExistWatcher, DataWatcher и ChildrenWatcher соответственно. Команды create, delete, setDataвызывают срабатывание заданного типа watcher.Правила выставления и условия срабатывания watcher приведены в таблице.Основные команды для работы сZooKeeperКомандывыставляющиеwatcherКоманды вызывающие срабатывание watchercreate delete setDataexist NodeCreated NodeDeleted NodeDataChangedgetData NodeDeleted NodeDataChangedgetChildren NodeChildrenChangedNodeDeletedNodeChildrenChanged
  7. 7. Установка - распаковать.Подправить конфиг: tickTime единица исчисления времени, dataDir директория в которойбудет хранится так называемый the in-memory database snapshots при работе вся информациясодержится в оперативной памяти, а её слепок дублируется на диске в указанной папке,clientPort порт на который будет стучаться клиент.zkServer.cmd - запуск сервера.При подключении с клиентской части помимо ip и порта надо указать session timeout вtickTime. Это время на сколько максимум может пропадать связь между сервером и клиентом.Кроме того важно указать так называемого default Watcher и озадачить его мониторингомподключения к серверу.Поскольку подключение к серверу происходит асинхронно, то прежде чем работать сzookeeper-клиентом необходимо дождаться его подсоединения к серверу Event.KeeperState.SyncConnected.Подготовка и начало работы
  8. 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. 9. Поднимается нечётное кличество серверов - ensemble. Данные полностью дублируются накаждом сервере. При подъёме кластера происходит выбор Leader. Leader это тот сервер черезкоторый происходит запись информации. Клиенты подключаются к followers, followersперенаправляют эти запросы на Leader. В случае падения Leader переизбирается.В конфиг каждого сервера добавляются ip и порты всех членов кластера (server.1,server.2...), параметры связи между followers и Leader (initLimit, syncLimit). Кроме того в bin/добавляется файл myid с уникальным номер своего сервера в кластере.У клиента должны быть адреса всех членов кластера, для возможности переключения вслучае падения текущего сервера(hosts).Кластер
  10. 10. SequentialWatcher(sw)/parent/parent/B000000000/parent/B000000001/parent/B000000002B0B1B2swswswA0A1A2{B0, B1, B2}{B0, B1, B2}{B0, B1, B2}
  11. 11. Дано: множество процесов типа А, каждый из которых должен отслеживать появлениекаждого процесса типа B.При появлении процесс B создаёт sequentional znode в оговоренной parent znode.Каждый процесс A заранее регистрирует childrenWatcher на parent znode. Присрабатывании атомарно происходит вычитывание текущего списка znode типа B, и выставлениятакого же watcher, в простейшем случае самого себя. За счёт атомарности getChildren ни однаznode типа B не появится незамеченной.SequentialWatcherpublic abstract class SequentialWatcher implements Watcher {...@Overridepublic 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. 12. Дано znode, которая возможно уже не существует, но если существует необходимополучить оповещение о её удалении. Если использовать простой exist в случаях отсутствияznode у нас остаётся заведомо несработающий watcher. Гораздо рациональнее использоватьgetData.Set watcher if znode existpublic class ZookeeperServiceImpl implements ZookeeperService {...@Overridepublic 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. 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);...
  14. 14. http://zookeeper.apache.org/http://anismiles.wordpress.com/2010/06/08/zookeeper-primer/http://anismiles.wordpress.com/tag/zookeeper/http://habrahabr.ru/post/144708/Ресурсы

×