Всегда ли ZooKeeper согласован в терминах теоремы CAP?
Это правильно, что ZooKeeper всегда CP (в терминах теоремы CAP)? Или в любом случае использовать его в качестве точки доступа для обнаружения служб?
3 ответа
Нет, вы не можете изменить гарантии согласованности в текущих версиях ZooKeeper, как в некоторых других системах.
Вы можете добавить локальный кеш своим клиентам, чтобы они имели данные только для чтения, если кластер выходит из строя, но с точки зрения CAP, который все еще не A, потому что он должен быть доступен для обновлений, а также для чтения.
Если ZK предлагает слишком высокий уровень согласованности для ваших потребностей в обнаружении услуг, вам следует попробовать изучить другие варианты, например, Eureka, Consul или etcd.
Возможно связанные читает:
Zookeeper не A, и не может сбросить P. Так что, очевидно, он называется CP. В терминах теоремы CAP "C" фактически означает линеаризуемость.
линеаризуемость: если операция B началась после успешного завершения операции A, то операция B должна увидеть систему в том же состоянии, в котором она была при завершении операции A, или в более новом состоянии.
Но Zookeeper имеет последовательную согласованность - обновления от клиента будут применяться в том порядке, в котором они были отправлены.
На самом деле ZooKeeper не является одновременно согласованным между клиентскими представлениями. http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html
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
является гарантией о транзакциях или группах из одной или нескольких операций над одним или несколькими объектами. Это гарантирует, что выполнение набора транзакций (обычно содержащих операции чтения и записи) над несколькими элементами эквивалентно некоторому последовательному выполнению (полному упорядочению) транзакций.
См.:
Отличный вопрос.
В терминах теоремы CAP "C" фактически означает линеаризуемость:
если операция B началась после успешного завершения операции A, то операция B должна увидеть систему в том же состоянии, в котором она находилась при завершении операции A, или в более новом состоянии.
Поскольку запись в ZooKeeper считается завершенной после того, как кворум подтвердил это, все еще могут быть устаревшие узлы со старыми данными. Поэтому, строго говоря, ZooKeeper по умолчанию не является системой CP, хотя и обеспечивает достаточно высокий уровень согласованности. Вы можете гарантировать линеаризуемость, предшествуя чтению с sync
команда.
Что касается доступности в сетевом разделе, те узлы, которые в большинстве своем не могут больше обрабатывать запросы на запись, потому что у них нет кворума.
Смотрите также: