Всегда ли ZooKeeper соответствует теореме CAP?

Верно ли, что ZooKeeper всегда является CP (с точки зрения теоремы CAP)? Или в любом случае использовать его в качестве точки доступа для обнаружения услуг?


person Artem    schedule 14.02.2016    source источник


Ответы (3)


Нет, вы не можете изменить гарантии согласованности в текущих версиях ZooKeeper, как в некоторых других системах.

Вы можете добавить локальный кеш для своих клиентов, что позволит им иметь данные только для чтения, если кластер выйдет из строя, но с точки зрения CAP это все еще не A, потому что он должен быть доступен для обновлений, а также для чтения.

Если ZK предлагает слишком высокий уровень согласованности для ваших потребностей в обнаружении сервисов, вам следует попробовать изучить другие варианты, например. Эврика, Консул или др.

Возможно, связанные чтения:

person igorbel    schedule 15.02.2016

Zookeeper не является A и не может сбросить P. Очевидно, это называется CP. С точки зрения теоремы CAP, «C» на самом деле означает линеаризуемость.

линеаризуемость: если операция B началась после успешного завершения операции A, то операция B должна видеть систему в том же состоянии, в котором она была при завершении операции A, или в более новом состоянии.

Но у Zookeeper есть последовательная согласованность — обновления от клиента будут применяться в том порядке, в котором они были отправлены.

ZooKeeper на самом деле не обеспечивает одновременную согласованность между представлениями клиента. http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html#ch_zkGuarantees

ZooKeeper не гарантирует, что в каждый момент времени два разных клиента будут иметь идентичные представления данных ZooKeeper. Из-за таких факторов, как задержки в сети, один клиент может выполнить обновление до того, как другой клиент получит уведомление об изменении. Рассмотрим сценарий двух клиентов, A и B. Если клиент A устанавливает значение znode /a от 0 до 1, а затем сообщает клиенту B прочитать /a, клиент B может прочитать старое значение 0, в зависимости от того, какой сервер это связано с. Если важно, чтобы клиент A и клиент B читали одно и то же значение, клиент B должен вызвать метод sync() из метода API ZooKeeper перед выполнением чтения.

ZooKeeper обеспечивает «последовательную согласованность». Это слабее, чем линеаризуемость, но все же очень сильно, намного сильнее, чем «согласованность в конечном итоге». ZooKeeper также предоставляет команду синхронизации. Если вы вызовете команду синхронизации, а затем чтение, чтение гарантированно увидит по крайней мере последнюю запись, которая была завершена до начала синхронизации.

linearizability, запись должна быть мгновенной. Точнее, после завершения записи все последующие операции чтения (где «позже» определяется временем начала настенных часов) должны возвращать значение этой записи или значение более поздней записи. Как только операция чтения возвращает определенное значение, все последующие операции чтения должны возвращать это значение или значение более поздней записи».

В Zookeeper есть метод sync(), который можно использовать там, где нам нужно что-то вроде линеаризуемости.

Serializability — это гарантия транзакций или групп из одной или нескольких операций над одним или несколькими объектами. Он гарантирует, что выполнение набора транзакций (обычно содержащих операции чтения и записи) над несколькими элементами эквивалентно некоторому последовательному выполнению (полному упорядочению) транзакций.

Ссылаться :

person prime    schedule 30.06.2017

Отличный вопрос.

С точки зрения теоремы CAP, «C» на самом деле означает линеаризуемость:

если операция B началась после успешного завершения операции A, то операция B должна увидеть систему в том же состоянии, в котором она была при завершении операции A, или в более новом состоянии.

Поскольку запись в ZooKeeper считается завершенной после ее подтверждения кворумом, все еще могут быть устаревшие узлы со старыми данными. Поэтому, строго говоря, ZooKeeper по умолчанию не является системой CP, хотя и обеспечивает достаточно высокий уровень согласованности. Вы можете обеспечить линеаризуемость, предварив чтение командой sync.

Что касается доступности под сетевым разделом, те узлы, которые не составляют большинство, больше не могли обрабатывать запросы на запись, потому что у них нет кворума.

Смотрите также:

person Miljen Mikic    schedule 06.12.2016