Dans le blog précédent sur la cohérence, nous avons expliqué ce qu’est la connotation de la cohérence dans une base de données vectorielles distribuée, couvert les quatre niveaux de cohérence – obsolescence forte, limitée, session et éventuellement pris en charge dans la base de données vectorielles Milvus, et expliqué le meilleur- scénario d’application adapté à chaque niveau de cohérence.
Pour offrir un récapitulatif rapide, la cohérence dans une base de données distribuée fait spécifiquement référence à la propriété qui garantit que chaque nœud ou réplica a la même vue des données lors de l’écriture ou de la lecture des données à un moment donné. Par conséquent, le mot cohérence dont nous parlons dans ce blog correspond à la lettre « C » dans le théorème CAP.
Milvus prend en charge quatre niveaux de cohérence :
- Fort : le niveau de cohérence le plus élevé et le plus strict. Il garantit que les utilisateurs peuvent lire la dernière version des données.
- Obsolescence limitée : permet l’incohérence des données pendant une certaine période. Cependant, les données sont généralement toujours globalement cohérentes hors de cette période.
- Session : Garantit que toutes les écritures de données peuvent être immédiatement perçues dans les lectures au cours de la même session.
- Éventuel : il n’y a pas d’ordre garanti de lectures et d’écritures, et les répliques finissent par converger vers le même état, étant donné qu’aucune autre opération d’écriture n’est effectuée.
Dans cet article, nous continuerons à examiner le mécanisme qui permet aux utilisateurs de la base de données vectorielles Milvus de choisir de manière flexible le niveau de cohérence idéal pour divers scénarios d’application. Nous fournirons également un didacticiel de base sur la façon de régler le niveau de cohérence dans la base de données vectorielle Milvus.
Le mécanisme de chronométrage sous-jacent
Milvus utilise le mécanisme de chronométrage pour assurer différents niveaux de cohérence lorsqu’une recherche ou une requête vectorielle est effectuée. Time Tick est le filigrane de Milvus, qui agit comme une horloge dans Milvus et indique à quel moment se trouve le système Milvus. Chaque fois qu’une requête en langage de manipulation de données (DML) est envoyée à la base de données vectorielle Milvus, elle attribue un horodatage à la requête. Comme le montre la figure ci-dessous, lorsque de nouvelles données sont insérées dans la file d’attente de messages, par exemple, Milvus marque non seulement un horodatage sur ces données insérées, mais insère également des ticks de temps à intervalles réguliers.
Prenons syncTs1
dans la figure ci-dessus à titre d’exemple. Lorsque les consommateurs en aval comme les nœuds de requête voient syncTs1
les composants consommateurs comprennent que toutes les données insérées avant syncTs1
a été consommé. En d’autres termes, les demandes d’insertion de données dont les valeurs d’horodatage sont inférieures à syncTs1
n’apparaîtra plus dans la file d’attente des messages.
Horodatage de garantie
Comme mentionné dans la section précédente, les composants consommateurs en aval, tels que les nœuds de requête, obtiennent en permanence des messages de demandes d’insertion de données et de temps de la file d’attente de messages. Chaque fois qu’un tick de temps est consommé, le nœud de requête marquera ce tick de temps consommé comme le temps utilisable – ServiceTime,
et toutes les données insérées avant ServiceTime
sont visibles pour le nœud de requête.
En plus de ServiceTime
Milvus adopte également un type d’horodatage à garantie d’horodatage (GuaranteeTS
) pour satisfaire le besoin de différents niveaux de cohérence et de disponibilité par différents utilisateurs. Cela signifie que les utilisateurs de la base de données vectorielles Milvus peuvent spécifier GuaranteeTs
pour informer les nœuds de requête que toutes les données avant GuaranteeTs
doivent être visibles et impliqués lorsqu’une recherche ou une requête est effectuée.
Il existe généralement deux scénarios lorsque le nœud de requête exécute une requête de recherche dans la base de données vectorielle Milvus.
Scénario 1 : Exécuter la demande de recherche immédiatement
Comme le montre la figure ci-dessous, si GuaranteeTs
est plus petite que ServiceTime
les nœuds de requête peuvent exécuter la requête de recherche immédiatement.
Scénario 2 : attendre jusqu’à « ServiceTime > GuaranteeTs »
Si GuaranteeTs
est supérieur à ServiceTime
, les nœuds de requête doivent continuer à consommer des ticks de temps de la file d’attente de messages. Les demandes de recherche ne peuvent pas être exécutées tant que ServiceTime
est supérieur à GuaranteeTs
.
Attendez ServiceTime> GuaranteeTs.
Par conséquent, la La figure ci-dessous illustre la La base de données vectorielle Milvus prend en charge quatre niveaux de cohérence : Milvus prend en charge le réglage du niveau de cohérence lors de la création d’une collection ou de la réalisation d’une recherche ou d’une requête. Pour effectuer une recherche de similarité vectorielle avec le niveau de cohérence que vous souhaitez, définissez simplement la valeur du paramètre Comme pour effectuer une recherche de similarité vectorielle, vous pouvez spécifier la valeur du paramètre
Niveaux de cohérence
GuaranteeTs
sont configurables dans la requête de recherche pour atteindre le niveau de cohérence que vous avez spécifié. UN GuaranteeTs
avec une grande valeur assure une cohérence forte au prix d’une latence de recherche élevée. Et un GuaranteeTs
avec une petite valeur réduit la latence de recherche, mais la visibilité des données est compromise.GuaranteeTs
dans Milvus est un format d’horodatage hybride. Et l’utilisateur n’a aucune idée du TSO à l’intérieur de Milvus. Par conséquent, en spécifiant la valeur deGuaranteeTs
est une tâche beaucoup trop compliquée pour les utilisateurs. Pour éviter les ennuis aux utilisateurs et offrir une expérience utilisateur optimale, Milvus demande uniquement aux utilisateurs de choisir un niveau de cohérence spécifique. La base de données vectorielles Milvus gérera automatiquement la GuaranteeTs
valeur pour les utilisateurs. C’est-à-dire; l’utilisateur Milvus n’a qu’à choisir parmi les quatre niveaux de cohérence : Strong
, Bounded
, Session
et Eventually
. Et chacun des niveaux de cohérence correspond à un certain GuaranteeTs
évaluer.GuaranteeTs
pour chacun des quatre niveaux de cohérence dans la base de données vectorielles Milvus.
CONSISTENCY_STRONG
: GuaranteeTs
sont définis sur la même valeur que le dernier horodatage système, et les nœuds de requête attendent que l’heure du service passe au dernier horodatage système pour traiter la requête de recherche ou de requête.CONSISTENCY_EVENTUALLY
: GuaranteeTs
est défini sur une valeur légèrement inférieure au dernier horodatage système pour ignorer la vérification de cohérence. Les nœuds de requête recherchent immédiatement sur la vue de données existante.CONSISTENCY_BOUNDED
: GuaranteeTs
est défini sur une valeur relativement inférieure au dernier horodatage système, et les nœuds de requête recherchent sur une vue de données tolérablement moins mise à jour.CONSISTENCY_SESSION
: Le client utilise l’horodatage de la dernière opération d’écriture comme GuaranteeTs
afin que chaque client puisse au moins récupérer les données insérées par lui-même.Comment régler le niveau de cohérence dans Milvus ?
Effectuer une recherche de similarité vectorielle
consistency_level
comme soit Strong
, Bounded
, Session
ou Eventually
. Si vous ne définissez pas la valeur du paramètre consistency_level
le niveau de cohérence sera Bounded
par défaut. L’exemple effectue une recherche de similarité vectorielle avec Strong
cohérence.results = collection.search(
data=[[0.1, 0.2]],
anns_field="book_intro",
param=search_params,
limit=10,
expr=None,
consistency_level="Strong"
)
Effectuer une requête vectorielle
consistency_level
lors de la réalisation d’une requête vectorielle. L’exemple effectue une requête vectorielle avec Strong
cohérence.res = collection.query(
expr = "book_id in [2,4,6,8]",
output_fields = ["book_id", "book_intro"],
consistency_level="Strong"
)