Верно ли, что ZooKeeper всегда является CP (с точки зрения теоремы CAP)? Или в любом случае использовать его в качестве точки доступа для обнаружения услуг?
Всегда ли ZooKeeper соответствует теореме CAP?
Ответы (3)
Нет, вы не можете изменить гарантии согласованности в текущих версиях ZooKeeper, как в некоторых других системах.
Вы можете добавить локальный кеш для своих клиентов, что позволит им иметь данные только для чтения, если кластер выйдет из строя, но с точки зрения CAP это все еще не A, потому что он должен быть доступен для обновлений, а также для чтения.
Если ZK предлагает слишком высокий уровень согласованности для ваших потребностей в обнаружении сервисов, вам следует попробовать изучить другие варианты, например. Эврика, Консул или др.
Возможно, связанные чтения:
- https://tech.knewton.com/blog/2014/12/eureka-shouldnt-use-zookeeper-service-discovery/
- https://github.com/Netflix/eureka/wiki/FAQ
- https://www.consul.io/intro/vs/zookeeper.html
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
— это гарантия транзакций или групп из одной или нескольких операций над одним или несколькими объектами. Он гарантирует, что выполнение набора транзакций (обычно содержащих операции чтения и записи) над несколькими элементами эквивалентно некоторому последовательному выполнению (полному упорядочению) транзакций.
Ссылаться :
- http://zookeeper-user.578899.n2.nabble.com/Consistency-in-zookeeper-td7578531.html
- http://www.bailis.org/blog/linearizability-versus-serializability/ а>
- Разница между линеаризуемостью и сериализуемостью
Отличный вопрос.
С точки зрения теоремы CAP, «C» на самом деле означает линеаризуемость:
если операция B началась после успешного завершения операции A, то операция B должна увидеть систему в том же состоянии, в котором она была при завершении операции A, или в более новом состоянии.
Поскольку запись в ZooKeeper считается завершенной после ее подтверждения кворумом, все еще могут быть устаревшие узлы со старыми данными. Поэтому, строго говоря, ZooKeeper по умолчанию не является системой CP, хотя и обеспечивает достаточно высокий уровень согласованности. Вы можете обеспечить линеаризуемость, предварив чтение командой sync
.
Что касается доступности под сетевым разделом, те узлы, которые не составляют большинство, больше не могли обрабатывать запросы на запись, потому что у них нет кворума.
Смотрите также: