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

milvus-logo
LFAI
Главная
  • Концепции
  • Home
  • Docs
  • Концепции

  • Уровень согласованности

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

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

Обзор

Milvus - это система, которая разделяет хранение и вычисления. В этой системе DataNodes отвечают за сохранение данных и в конечном итоге хранят их в распределенном объектном хранилище, таком как MinIO/S3. QueryNodes решают вычислительные задачи, такие как поиск. Эти задачи включают в себя обработку как пакетных, так и потоковых данных. Проще говоря, под пакетными данными можно понимать данные, которые уже были сохранены в объектном хранилище, а под потоковыми данными - данные, которые еще не были сохранены в объектном хранилище. Из-за сетевых задержек узлы QueryNodes часто не могут хранить самые последние потоковые данные. Без дополнительных мер предосторожности выполнение поиска непосредственно на потоковых данных может привести к потере многих незафиксированных точек данных, что повлияет на точность результатов поиска.

Milvus - это система, которая разделяет хранение и вычисления. В этой системе узлы DataNodes отвечают за сохранение данных и в конечном итоге хранят их в распределенном объектном хранилище, таком как MinIO/S3. QueryNodes решают вычислительные задачи, такие как поиск. Эти задачи включают в себя обработку как пакетных, так и потоковых данных. Проще говоря, под пакетными данными можно понимать данные, которые уже были сохранены в объектном хранилище, а под потоковыми данными - данные, которые еще не были сохранены в объектном хранилище. Из-за сетевых задержек узлы QueryNodes часто не могут хранить самые последние потоковые данные. Без дополнительных мер предосторожности выполнение поиска непосредственно на потоковых данных может привести к потере многих незафиксированных точек данных, что повлияет на точность результатов поиска.

Batch data and streaming data Пакетные данные и потоковые данные

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

Чтобы решить эту проблему, Milvus проставляет временные метки для каждой записи в очереди данных и постоянно вставляет метки синхронизации в очередь данных. При получении временной метки синхронизации (syncTs) QueryNodes устанавливает ее в качестве ServiceTime, что означает, что QueryNodes могут видеть все данные до этого Service Time. Основываясь на ServiceTime, Milvus может предоставлять гарантийные временные метки (GuaranteeTs) для удовлетворения различных требований пользователей к согласованности и доступности. Пользователи могут сообщить узлам QueryNodes о необходимости включить в область поиска данные до определенного момента времени, указав GuaranteeTs в своих поисковых запросах.

ServiceTime and GuaranteeTs ServiceTime и GuaranteeTs

Как показано на рисунке выше, если GuaranteeTs меньше ServiceTime, это означает, что все данные до указанного момента времени были полностью записаны на диск, что позволяет узлам QueryNodes немедленно выполнить операцию поиска. Когда GuaranteeTs больше ServiceTime, узлы QueryNodes должны ждать, пока ServiceTime превысит GuaranteeTs, прежде чем они смогут выполнить операцию Search.

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

Consistency Levels Illustrated Иллюстрация уровней согласованности

Milvus предоставляет четыре типа уровней согласованности с различными GuaranteeTs.

  • Сильная

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

  • Eventual

    GuaranteeTs устанавливается на очень маленькое значение, например 1, чтобы избежать проверок согласованности, и QueryNodes могут немедленно выполнять поисковые запросы по всем пакетным данным.

  • Ограниченная стабильность

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

  • Сессия

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

Milvus использует Bounded Staleness в качестве уровня согласованности по умолчанию. Если GuaranteeTs не указан, в качестве GuaranteeTs используется последнее ServiceTime.

Установка уровня согласованности

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

Установка уровня согласованности при создании коллекции

При создании коллекции можно установить уровень согласованности для поиска и запросов внутри коллекции. В следующем примере кода уровень согласованности установлен на Strong.

client.create_collection(
    collection_name="my_collection",
    schema=schema,
    # highlight-next
    consistency_level="Strong",
)

CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()
        .collectionName("my_collection")
        .collectionSchema(schema)
        // highlight-next
        .consistencyLevel(ConsistencyLevel.STRONG)
        .build();
client.createCollection(createCollectionReq);

export schema='{
        "autoId": true,
        "enabledDynamicField": false,
        "fields": [
            {
                "fieldName": "my_id",
                "dataType": "Int64",
                "isPrimary": true
            },
            {
                "fieldName": "my_vector",
                "dataType": "FloatVector",
                "elementTypeParams": {
                    "dim": "5"
                }
            },
            {
                "fieldName": "my_varchar",
                "dataType": "VarChar",
                "isClusteringKey": true,
                "elementTypeParams": {
                    "max_length": 512
                }
            }
        ]
    }'

export params='{
    "consistencyLevel": "Strong"
}'

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d "{
    \"collectionName\": \"my_collection\",
    \"schema\": $schema,
    \"params\": $params
}"

Возможные значения параметра consistency_level: Strong, Bounded, Eventually и Session.

Вы всегда можете изменить уровень согласованности для конкретного поиска. Следующий пример кода устанавливает уровень согласованности обратно на Bounded. Изменение применяется только к текущему поисковому запросу.

res = client.search(
    collection_name="my_collection",
    data=[query_vector],
    limit=3,
    search_params={"metric_type": "IP"},
    # highlight-start
    consistency_level="Bounded",
    # highlight-next
)

SearchReq searchReq = SearchReq.builder()
        .collectionName("my_collection")
        .data(Collections.singletonList(queryVector))
        .topK(3)
        .searchParams(params)
        .consistencyLevel(ConsistencyLevel.BOUNDED)
        .build();

SearchResp searchResp = client.search(searchReq);

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "my_collection",
    "data": [
        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
    ],
    "limit": 3,
    "consistencyLevel": "Bounded"
}'

Этот параметр также доступен в гибридных поисках и поисковом итераторе. Возможные значения параметра consistency_level: Strong, Bounded, Eventually и Session.

Установка уровня согласованности в запросе

Вы всегда можете изменить уровень согласованности для конкретного поиска. Следующий пример кода устанавливает уровень согласованности на Eventually. Настройка применяется только к текущему запросу.

res = client.query(
    collection_name="my_collection",
    filter="color like \"red%\"",
    output_fields=["vector", "color"],
    limit=3# highlight-start
    consistency_level="Eventually",
    # highlight-next
)

QueryReq queryReq = QueryReq.builder()
        .collectionName("my_collection")
        .filter("color like \"red%\"")
        .outputFields(Arrays.asList("vector", "color"))
        .limit(3)
        .consistencyLevel(ConsistencyLevel.EVENTUALLY)
        .build();
        
 QueryResp getResp = client.query(queryReq);

Этот параметр также доступен в итераторе запроса. Возможные значения параметра consistency_level: Strong, Bounded, Eventually и Session.

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?