🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
  • Home
  • Blog
  • Понимание уровня согласованности в базе данных Milvus Vector - часть II

Понимание уровня согласованности в базе данных Milvus Vector - часть II

  • Engineering
September 13, 2022
Jiquan Long

Cover_image Cover_image

Эта статья написана Джикуаном Лонгом и переработана Анжелой Ни.

В предыдущем блоге о согласованности мы объяснили, что подразумевается под согласованностью в распределенной векторной базе данных, рассказали о четырех уровнях согласованности - сильном, ограниченном, сессионном и конечном, поддерживаемых в векторной базе данных Milvus, и объяснили, какой сценарий применения лучше всего подходит для каждого уровня согласованности.

В этом посте мы продолжим рассматривать механизм, который позволяет пользователям векторной базы данных Milvus гибко выбирать идеальный уровень согласованности для различных сценариев применения. Мы также предоставим базовое руководство по настройке уровня согласованности в векторной базе данных Milvus.

Перейти к:

Базовый механизм временных тиков

Milvus использует механизм временных тиков для обеспечения различных уровней согласованности при выполнении векторного поиска или запроса. Time Tick - это водяной знак Milvus, который действует как часы в Milvus и указывает, в какой момент времени находится система Milvus. Всякий раз, когда в векторную базу данных Milvus отправляется запрос на языке манипулирования данными (DML), он присваивает запросу временную метку. Как показано на рисунке ниже, при вставке новых данных, например, в очередь сообщений, Milvus не только проставляет временную метку на этих вставленных данных, но и вставляет временные метки через регулярный интервал.

timetick временная метка

В качестве примера возьмем syncTs1 на рисунке выше. Когда последующие потребители, например узлы запросов, видят syncTs1, компоненты-потребители понимают, что все данные, вставленные ранее syncTs1, были потреблены. Другими словами, запросы на вставку данных, чьи значения временной метки меньше, чем syncTs1, больше не будут появляться в очереди сообщений.

Гарантированная временная метка

Как уже говорилось в предыдущем разделе, компоненты-потребители, такие как узлы запросов, постоянно получают сообщения о запросах на вставку данных и временных метках из очереди сообщений. Каждый раз, когда потребляется временная метка, узел запроса отмечает эту потребленную временную метку как обслуживаемую - ServiceTime, и все данные, вставленные до ServiceTime, видны узлу запроса.

В дополнение к ServiceTime в Milvus также принят тип временной метки - гарантийная временная метка (GuaranteeTS), чтобы удовлетворить потребности различных пользователей в различных уровнях согласованности и доступности. Это означает, что пользователи векторной базы данных Milvus могут указать GuaranteeTs, чтобы сообщить узлам запроса, что все данные до GuaranteeTs должны быть видны и задействованы при выполнении поиска или запроса.

Обычно существует два сценария, когда узел запроса выполняет поисковый запрос в векторной базе данных Milvus.

Сценарий 1: Выполнение поискового запроса немедленно

Как показано на рисунке ниже, если GuaranteeTs меньше, чем ServiceTime, узлы запроса могут выполнить поисковый запрос немедленно.

execute_immediately выполнить_немедленно

Сценарий 2: Подождать, пока "ServiceTime > GuaranteeTs".

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

wait_search wait_search

Уровни согласованности

Таким образом, значение GuaranteeTs настраивается в поисковом запросе для достижения заданного вами уровня согласованности. Значение GuaranteeTs с большим значением обеспечивает сильную согласованность ценой высокой задержки поиска. А GuaranteeTs с малым значением уменьшает задержку поиска, но ухудшает видимость данных.

GuaranteeTs в Milvus - это гибридный формат временных меток. И пользователь не имеет представления о TSO внутри Milvus. Поэтому определение значенияGuaranteeTs является слишком сложной задачей для пользователей. Чтобы избавить пользователей от проблем и обеспечить оптимальный пользовательский опыт, Milvus требует от пользователей только выбора конкретного уровня согласованности, а векторная база данных Milvus будет автоматически обрабатывать значение GuaranteeTs для пользователей. Иными словами, пользователю Milvus нужно выбрать только один из четырех уровней согласованности: Strong, Bounded, Session, и Eventually. Каждому уровню согласованности соответствует определенное значение GuaranteeTs.

На рисунке ниже показано значение GuaranteeTs для каждого из четырех уровней согласованности в векторной базе данных Milvus.

guarantee_ts гарантия_ц

Векторная база данных Milvus поддерживает четыре уровня согласованности:

  • CONSISTENCY_STRONG: GuaranteeTs устанавливается в то же значение, что и последняя системная метка времени, и узлы запроса ждут, пока время обслуживания не перейдет к последней системной метке времени, чтобы обработать запрос на поиск или запрос.

  • CONSISTENCY_EVENTUALLY: GuaranteeTs устанавливается в значение, незначительно меньшее, чем последняя системная метка времени, чтобы пропустить проверку согласованности. Узлы запросов выполняют поиск непосредственно в существующем представлении данных.

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

  • CONSISTENCY_SESSION: Клиент использует в качестве GuaranteeTs временную метку последней операции записи, чтобы каждый клиент мог, по крайней мере, самостоятельно получить вставленные данные.

Как настроить уровень согласованности в Milvus?

Milvus поддерживает настройку уровня согласованности при создании коллекции или выполнении поиска или запроса.

Чтобы выполнить поиск векторного сходства с нужным вам уровнем согласованности, просто задайте для параметра consistency_level значение Strong, Bounded, Session или Eventually. Если вы не зададите значение для параметра consistency_level, уровень согласованности по умолчанию будет Bounded. В примере выполняется поиск векторного сходства с уровнем согласованности Strong.

results = collection.search(
        data=[[0.1, 0.2]], 
        anns_field="book_intro", 
        param=search_params, 
        limit=10, 
        expr=None,
        consistency_level="Strong"
)

Выполнение векторного запроса

Аналогично проведению поиска векторного сходства, при проведении векторного запроса можно указать значение параметра consistency_level. В примере выполняется векторный запрос с консистенцией Strong.

res = collection.query(
  expr = "book_id in [2,4,6,8]", 
  output_fields = ["book_id", "book_intro"],
  consistency_level="Strong"
)

Что дальше

После официального выхода Milvus 2.1 мы подготовили серию блогов, в которых рассказываем о новых возможностях. Подробнее читайте в этой серии блогов:

Like the article? Spread the word

Продолжить чтение