Эта статья написана Jiquan Long и переработана Angela Ni.

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

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

Перейти к:

Основной механизм отсчета времени
Гарантированная отметка времени
Уровни согласованности
Как настроить уровень согласованности в Milvus?

Основной механизм тиков времени

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

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

Отметка времени гарантии

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

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

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

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

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

Сценарий 2: Дождитесь «ServiceTime › GuaranteeTs»

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

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

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

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

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

База данных векторов 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 мы подготовили серию блогов, рассказывающих о новых функциях. Подробнее читайте в этой серии блогов: