Évolution de la base de données vectorielles évolutive Milvus
Dans cet article, nous allons partager le processus de réflexion qui nous a permis de concevoir la nouvelle architecture du cluster de la base de données Milvus.
Objectifs de la base de données vectorielles Milvus
Lorsque l'idée de la base de données vectorielle Milvus nous est venue à l'esprit, nous voulions construire une infrastructure de données qui pourrait aider les gens à accélérer l'adoption de l'IA dans leurs organisations.
Pour remplir cette mission, nous avons fixé deux objectifs essentiels au projet Milvus.
Facilité d'utilisation
L'IA/ML est un domaine émergent où de nouvelles technologies ne cessent de voir le jour. La plupart des développeurs ne sont pas entièrement familiarisés avec les technologies et les outils de l'IA, qui connaissent une croissance rapide. Les développeurs ont déjà consacré la majeure partie de leur énergie à la recherche, à l'entraînement et au réglage des modèles. Il leur est difficile de consacrer des efforts supplémentaires à la gestion des grandes quantités de vecteurs d'intégration générés par les modèles. De plus, la manipulation d'un grand volume de données est toujours une tâche très difficile.
C'est pourquoi nous accordons une très grande importance à la "facilité d'utilisation", car elle peut réduire de manière significative les coûts de développement.
Faibles coûts d'exploitation
L'un des principaux obstacles à l'utilisation de l'IA dans la production est de justifier le retour sur investissement. Nous aurions plus de possibilités de mettre nos applications d'IA en production avec des coûts d'exploitation plus faibles. Cela permettrait d'augmenter la marge des avantages potentiels.
Principes de conception de Milvus 2.0
Nous avons commencé à atteindre ces objectifs dans Milvus 1.0. Mais c'est loin d'être suffisant, surtout en ce qui concerne l'évolutivité et la disponibilité. Nous avons donc commencé à développer Milvus 2.0 pour améliorer ces points. Les principes que nous avons définis pour cette nouvelle version sont les suivants :
- Viser une évolutivité et une disponibilité élevées
- S'appuyer sur une infrastructure et une pratique de l'informatique en nuage mûres
- Compromettre au minimum les performances dans le nuage
En d'autres termes, nous voulons rendre le cluster de base de données Milvus "cloud-native".
L'évolution des grappes de bases de données
La base de données vectorielle est une nouvelle espèce de base de données, car elle traite de nouveaux types de données (vecteurs). Mais elle présente les mêmes défis que les autres bases de données, avec certaines exigences qui lui sont propres. Dans la suite de cet article, je me concentrerai sur ce que nous avons appris des implémentations des clusters de bases de données existants et sur le processus de réflexion qui nous a permis de concevoir la nouvelle architecture du groupe Milvus.
Si vous êtes intéressé par les détails de l'implémentation des composants du groupe Milvus, n'hésitez pas à consulter la documentation Milvus. Nous publierons continuellement des articles techniques dans le repo Milvus GitHub, le site web Milvus et le blog Milvus.
Le cluster de base de données idéal
"Viser petit, rater petit".
Commençons par dresser la liste des capacités critiques qu'un cluster de base de données idéal devrait posséder.
- Concurrence et absence de point de défaillance unique : les utilisateurs connectés à différents membres du groupe peuvent simultanément avoir accès en lecture/écriture au même élément de données.
- Cohérence : différents membres d'un groupe doivent voir les mêmes données.
- Évolutivité : nous pouvons ajouter ou supprimer des membres d'un groupe en cours de route.
Honnêtement, toutes ces capacités sont difficiles à acquérir ensemble. Dans les implémentations modernes des clusters de bases de données, les gens doivent faire des compromis sur certaines de ces capacités. Les gens ne s'attendent pas à un cluster de base de données parfait tant qu'il peut s'adapter aux scénarios des utilisateurs. Cependant, le cluster "tout partagé" était autrefois très proche d'un cluster de base de données idéal. Si nous voulons apprendre quelque chose, nous devons commencer par là.
Les considérations clés d'un cluster de base de données
Le cluster "shared-everything" a une histoire plus longue que d'autres implémentations modernes. Le groupe de partage de données Db2 et Oracle RAC sont des exemples typiques de grappes de bases de données partagées. De nombreuses personnes pensent que le partage de tout signifie le partage des disques. C'est bien plus que cela.
Un cluster "shared-everything" n'a qu'un seul type de membre de base de données dans le groupe. Les utilisateurs peuvent se connecter à n'importe lequel de ces membres symétriques pour accéder à n'importe quelle donnée. Qu'est-ce que "tout" qui doit être partagé pour que cela fonctionne ?
La séquence des événements dans le groupe
Tout d'abord, la séquence des événements du groupe est cruciale pour résoudre les conflits potentiels causés par l'accès simultané de différents membres du groupe. Nous utilisons généralement le numéro de séquence de l'enregistrement de la base de données pour représenter la séquence d'événements. En même temps, le numéro de séquence de l'enregistrement est généralement généré à partir de l'horodatage.
Ainsi, l'exigence d'une séquence d'événements de groupe équivaut à la nécessité d'une horloge globale. Si nous pouvions avoir une horloge atomique pour le groupe, ce serait fabuleux. Cependant, Milvus est un projet de logiciel libre, ce qui signifie que nous devons nous appuyer sur des ressources communément disponibles. À ce jour, une horloge atomique reste une option de premier ordre pour les grandes entreprises.
Nous avons implémenté le composant de synchronisation du temps dans le cluster de base de données Milvus 2.0. Vous trouverez le lien dans l'annexe.
Verrouillage global
La base de données dispose d'un mécanisme de verrouillage pour résoudre les conflits d'accès concurrents, qu'il s'agisse de verrous optimistes ou pessimistes. De même, nous avons besoin d'un verrouillage global pour résoudre les conflits d'accès simultanés entre les différents membres d'un groupe.
Le verrouillage global signifie que les différents membres du groupe doivent communiquer entre eux pour négocier les demandes de verrouillage. Plusieurs facteurs essentiels influencent l'efficacité de ce processus de négociation du verrouillage global :
- la vitesse des connexions inter-systèmes
- le nombre de membres du groupe qui doivent participer au processus de négociation
- la fréquence des conflits au sein du groupe.
La taille typique d'un groupe ne dépasse pas 100 membres. Par exemple, Db2 DSG en compte 32 ; Oracle RAC en compte 100. Les membres du groupe seront placés dans une salle de serveurs connectée par fibre optique afin de minimiser la latence du transfert. C'est pourquoi on parle parfois de cluster centralisé. En raison de la limitation de la taille des groupes, les gens choisissent des serveurs haut de gamme (ordinateurs centraux ou mini-ordinateurs, qui ont beaucoup plus de capacité en termes d'unité centrale, de mémoire, de canaux d'E/S, etc.
Cette présomption matérielle a radicalement changé dans l'environnement moderne de l'informatique en nuage. De nos jours, les centres de données en nuage comprennent des salles de serveurs très denses remplies de (milliers de) serveurs X86 de base avec des connexions TCP/IP. Si nous nous appuyons sur ces serveurs X86 pour construire la grappe de bases de données, la taille du groupe devrait atteindre des centaines (voire des milliers) de machines. Et dans certains scénarios commerciaux, nous voudrons que ces centaines de machines X86 soient réparties dans différentes régions. Par conséquent, la mise en œuvre du verrouillage global pourrait ne plus valoir la peine, car les performances du verrouillage global ne seront pas suffisamment bonnes.
Dans Milvus 2.0, nous n'allons pas mettre en œuvre le verrouillage global. D'une part, il n'y a pas de mise à jour pour les données vectorielles. D'autre part, il n'y a pas de mise à jour pour les données vectorielles (il est préférable de supprimer puis d'insérer plutôt que de mettre à jour). Nous n'avons donc pas à nous préoccuper des conflits entre plusieurs écrivains sur le même morceau de données dans le groupe Milvus avec l'arrangement de mise en commun. En attendant, nous pouvons utiliser le MVCC (contrôle de concurrence multi-version, une méthode de contrôle de concurrence évitant les blocages) pour résoudre les conflits lecteur-écrivain.
D'autre part, le traitement des données vectorielles consomme beaucoup plus de mémoire que le traitement des données structurées. Les bases de données vectorielles doivent être beaucoup plus évolutives.
Cache de données partagé en mémoire
Nous pouvons brièvement diviser un moteur de base de données en deux parties : le moteur de stockage et le moteur de calcul. Le moteur de stockage est responsable de deux tâches essentielles :
- Écrire les données dans le stockage permanent à des fins de durabilité.
- Charger les données du stockage permanent vers le cache de données en mémoire (AKA buffer pool) ; c'est le seul endroit où le moteur de calcul accède aux données.
Dans le scénario du cluster de base de données, que se passe-t-il si le membre A a mis à jour les données mises en cache dans le membre B ? Comment le membre B pourrait-il savoir que ses données en mémoire ont expiré ? Le cluster classique "tout partagé" dispose d'un mécanisme d'invalidation croisée de la mémoire tampon pour résoudre ce problème. Le mécanisme d'invalidation croisée de la mémoire tampon fonctionnera de la même manière que le verrouillage global si nous maintenons une forte cohérence entre les membres du groupe. Comme nous l'avons déjà dit, ce n'est pas pratique dans l'environnement moderne du cloud. Nous avons donc décidé d'abaisser le niveau de cohérence dans le groupe Milvus évolutif vers une cohérence éventuelle. De cette manière, le mécanisme d'invalidation croisée de la mémoire tampon dans Milvus 2.0 peut être un processus asynchrone.
Stockage partagé
Le stockage partagé est probablement la première chose à laquelle les gens pensent lorsqu'ils discutent d'un cluster de base de données.
Les options de stockage ont également changé de manière significative au cours des dernières années d'évolution du stockage en nuage. Le réseau de stockage (SAN) était (et est toujours) la base de stockage du groupe "tout partagé". Mais dans l'environnement en nuage, il n'y a pas de SAN. La base de données doit utiliser le disque local attaché aux machines virtuelles du nuage. L'utilisation du disque local pose le problème de la cohérence des données entre les membres du groupe. Nous devons également nous préoccuper de la haute disponibilité des membres du groupe.
Ensuite, Snowflake a créé un excellent modèle pour les bases de données en nuage utilisant le stockage partagé en nuage (stockage S3). Il inspire également Milvus 2.0. Comme indiqué précédemment, nous avons l'intention de nous appuyer sur une infrastructure en nuage mature. Mais avant de pouvoir utiliser le stockage partagé dans le nuage, nous devons réfléchir à deux choses.
Tout d'abord, le stockage S3 est bon marché et fiable, mais il n'est pas conçu pour un accès R/W instantané comme les scénarios de base de données. Nous devons créer des composants de données (que nous appelons nœuds de données dans Milvus 2.0) pour faire le lien entre la mémoire/disque locale et le stockage S3. Il existe quelques exemples (comme Alluxio, JuiceFS, etc.) dont nous pourrions nous inspirer. La raison pour laquelle nous ne pouvons pas intégrer ces projets directement est que nous nous concentrons sur une granularité de données différente. Alluxio et JuiceFS sont conçus pour des ensembles de données ou des fichiers POSIX, tandis que nous nous concentrons sur le niveau de l'enregistrement de données (vecteur).
Lorsque les données vectorielles sont stockées sur S3, la réponse pour les métadonnées est facile : les stocker dans ETCD. Qu'en est-il alors des données de journalisation ? Dans les implémentations classiques, le stockage du journal est également basé sur SAN. Les fichiers journaux d'un membre du groupe de bases de données sont partagés au sein du cluster de bases de données à des fins de reprise sur panne. Ce n'était donc pas un problème jusqu'à ce que nous entrions dans l'environnement en nuage.
Dans le document Spanner, Google a illustré la manière dont il a mis en œuvre la base de données distribuée au niveau mondial (groupe) avec l'algorithme de consensus Paxos. Vous devez programmer le cluster de base de données comme un groupe de réplication de machine d'état. Le redo log est généralement l'"état" qui sera répliqué à travers le groupe.
La réplication du redo log par des algorithmes de consensus est un outil puissant qui présente des avantages substantiels dans certains scénarios d'entreprise. Mais pour la base de données vectorielle Milvus, nous ne trouvons pas suffisamment d'incitations à la création d'un groupe de réplication de la machine d'état dans son ensemble. Nous avons décidé d'utiliser la file d'attente/plateforme de messagerie en nuage (Apache Pulsar, Apache Kafka, etc.) comme alternative de stockage partagé en nuage pour le magasin de journaux. En déléguant le stockage des journaux à la plateforme de messagerie, nous obtenons les avantages suivants.
- Le groupe est davantage axé sur les événements, ce qui signifie que de nombreux processus peuvent être asynchrones. L'évolutivité s'en trouve améliorée.
- Les composants sont couplés de manière plus lâche, ce qui facilite grandement les mises à niveau en ligne. Elle améliore la disponibilité et l'opérabilité.
Nous reviendrons sur ce sujet dans la section suivante.
Jusqu'à présent, nous avons abordé les aspects cruciaux de la grappe de bases de données. Avant de passer à la discussion sur l'architecture Milvus 2.0, permettez-moi d'expliquer comment nous gérons les vecteurs dans Milvus.
Gestion des données et prévisibilité des performances
Milvus stocke les vecteurs dans des collections. La "collection" est un concept logique, équivalent à une "table" dans les bases de données SQL. Une "collection" peut avoir plusieurs fichiers physiques pour conserver les vecteurs. Un fichier physique est un "segment". Le "segment" est un concept physique, équivalent à un fichier "tablespace" dans les bases de données SQL. Lorsque le volume de données est faible, nous pouvons tout enregistrer dans un seul segment/fichier physique. Mais de nos jours, nous sommes constamment confrontés à des données volumineuses. Lorsqu'il y a plusieurs segments/fichiers physiques, comment répartir les données dans différentes partitions ?
Bien que les données soient prioritaires par rapport aux index, nous devons stocker les données de la manière que l'algorithme d'indexation préfère pour que l'accès aux données soit efficace dans la plupart des cas. Une stratégie fréquemment utilisée dans les bases de données SQL consiste à partitionner les données en fonction de la plage de valeurs de la clé de partitionnement. On crée généralement un index en grappe pour appliquer la clé de partitionnement. Dans l'ensemble, il s'agit d'une approche convenable pour les bases de données SQL. Les données sont stockées dans de bonnes conditions, optimisées pour les E/S (prefetch). Mais il y a encore des défauts.
- L'asymétrie des données. Certaines partitions peuvent contenir beaucoup plus de données que d'autres. La distribution des données du monde réel n'est pas aussi simple que la plage numérique.
- Points chauds d'accès. La charge de travail peut être plus importante dans certaines partitions de données.
Imaginez que la charge de travail soit plus importante dans les partitions contenant le plus de données. Nous devons rééquilibrer les données entre les partitions lorsque ces situations se produisent. (C'est le quotidien fastidieux d'un DBA).
L'index en grappe pour les vecteurs
Nous pouvons également créer un index clusterisé pour les vecteurs (un index de liste inversée). Mais ce n'est pas le même cas que dans les bases de données SQL. Une fois l'index construit dans les bases de données SQL, il est très efficace d'accéder aux données par l'intermédiaire de l'index, avec moins de calculs et moins d'opérations d'entrée-sortie. Mais pour les données vectorielles, il y aura beaucoup plus de calculs et d'opérations d'E/S, même avec un index. Les défauts mentionnés précédemment auront donc un impact plus important sur les clusters de bases de données vectorielles. En outre, le coût du rééquilibrage des vecteurs entre les différents segments est très élevé en raison du volume de données et de la complexité de calcul.
Dans Milvus, nous utilisons la stratégie de partition par croissance. Lorsque nous injectons des données dans une collection de vecteurs, Milvus ajoute les nouveaux vecteurs au dernier segment de la collection. Milvus ferme le segment lorsque sa taille est suffisante (le seuil est configurable) et construit l'index pour le segment fermé. Entre-temps, un nouveau segment sera créé pour stocker les données à venir. Cette stratégie simple est plus équilibrée pour le traitement vectoriel.
La requête vectorielle est un processus de recherche des candidats les plus similaires dans la collection de vecteurs. Il s'agit d'une procédure MapReduce typique. Par exemple, nous voulons rechercher les 20 premiers résultats similaires dans une collection de vecteurs composée de dix segments. Nous pouvons rechercher les 20 premiers résultats sur chacun des segments, puis fusionner les 20 * 10 résultats pour obtenir les 20 résultats finaux. Étant donné que chaque segment contient le même nombre de vecteurs et un index similaire, le temps de traitement sur chaque segment est presque identique. Cela nous donne l'avantage de la prévisibilité des performances, ce qui est essentiel lors de la planification de l'échelle des grappes de bases de données.
Nouveaux paradigmes dans Milvus 2.0
Dans Milvus 1.0, nous avons mis en œuvre un groupe de partage en lecture/écriture comme la plupart des bases de données SQL. Il s'agissait d'une bonne tentative de mise à l'échelle du cluster de bases de données Milvus. Mais les problèmes sont assez évidents.
Base de données Milvus 1.0
Dans Milvus 1.0, le nœud R/W doit s'occuper entièrement du dernier segment, y compris l'ajout de vecteur, la recherche dans ce segment non indexé, la construction de l'index, etc. Étant donné que chaque collection n'a qu'un seul rédacteur, celui-ci est très occupé si les données sont introduites en continu dans le système. Les performances du partage des données entre le nœud R/W et les nœuds lecteurs posent également problème. En outre, pour le stockage des données partagées, nous devons nous appuyer soit sur NFS (qui n'est pas stable), soit sur le stockage en nuage (qui est trop cher).
Ces problèmes existants sont difficiles à résoudre dans l'architecture Milvus 1.0. Nous avons donc introduit de nouveaux paradigmes dans la conception de Milvus 2.0 pour résoudre ces problèmes.
Architecture Milvus
Modèle d'acteur
Il existe deux modèles pour programmer des systèmes de calcul simultané.
- La mémoire partagée, qui implique un contrôle de la concurrence (verrouillage) et un traitement synchrone.
- Le modèle de l'acteur (AKA message passing) signifie un traitement asynchrone et basé sur les messages.
Ces deux modèles peuvent également être appliqués aux grappes de bases de données distribuées.
Comme indiqué précédemment, la plupart des bases de données distribuées de premier plan utilisent la même méthode : la réplication du redo-log par des algorithmes de consensus. Il s'agit d'un traitement synchrone utilisant des algorithmes de consensus pour construire une mémoire partagée distribuée pour les enregistrements redo-log. Différentes entreprises et sociétés de capital-risque ont investi des milliards de dollars dans cette technologie. Je n'ai pas voulu faire de commentaires à ce sujet jusqu'à ce que nous commencions à travailler sur Milvus 2.0. De nombreuses personnes considèrent cette technologie comme le seul moyen de réaliser des systèmes de bases de données distribuées. C'est ennuyeux. Si je ne dis rien, les gens pourraient penser à tort que nous avons été imprudents dans la conception des bases de données distribuées.
Ces dernières années, la réplication Redo-log par des algorithmes de consensus a été la technologie de base de données la plus surestimée. Il y a deux problèmes clés.
- La présomption selon laquelle la réplication du redo-log est meilleure est fragile.
- Les fournisseurs trompent les attentes des gens sur les capacités des algorithmes de consensus.
Supposons que nous ayons deux nœuds de base de données, le nœud source et le nœud cible. Au tout début, ils disposent d'une copie exacte des données. Nous effectuons des opérations de modification (instructions SQL I/U/D) sur le nœud source et nous voulons que le nœud cible soit mis à jour. Que devons-nous faire ? La solution la plus simple consiste à rejouer les opérations sur le nœud cible. Mais ce n'est pas la méthode la plus efficace.
Si l'on considère le coût d'exécution d'une instruction I/U/D, on peut le diviser en deux parties : la préparation de l'exécution et le travail physique. La partie préparation de l'exécution comprend le travail de l'analyseur SQL, de l'optimiseur SQL, etc. Quel que soit le nombre d'enregistrements de données concernés, il s'agit d'un coût fixe. Le coût de la partie travail physique dépend du nombre d'enregistrements de données concernés ; il s'agit d'un coût variable. L'idée sous-jacente à la réplication du redo-log est d'économiser le coût fixe sur le nœud cible ; nous ne rejouons que le redo-log (le travail physique) sur le nœud cible.
Le pourcentage de réduction des coûts est la réciproque du nombre d'enregistrements du redo-log. Si une opération n'affecte qu'un seul enregistrement, la réplication du redo-log devrait me permettre de réaliser des économies significatives. Et s'il s'agit de 10 000 enregistrements ? Nous devrions alors nous préoccuper de la fiabilité du réseau. Qu'est-ce qui est le plus fiable, l'envoi d'une opération ou de 10 000 enregistrements redo-log ? Et un million d'enregistrements ? La réplication du redo-log est excellente dans des scénarios tels que les systèmes de paiement, les systèmes de métadonnées, etc. Dans ces scénarios, chaque opération I/U/D de la base de données n'affecte qu'un petit nombre d'enregistrements (1 ou 2). Mais il est difficile de travailler avec des charges de travail intensives en E/S comme les travaux par lots.
Les vendeurs affirment toujours que les algorithmes de consensus peuvent fournir une forte cohérence aux grappes de bases de données. Mais les gens n'utilisent les algorithmes de consensus que pour répliquer les enregistrements du redo-log. Les enregistrements redo-log sont cohérents sur différents nœuds, mais cela ne signifie pas que les vues de données sur les autres nœuds sont cohérentes non plus. Nous devons fusionner les enregistrements redo-log avec les enregistrements de la table. Ainsi, même avec ce traitement synchrone, nous ne pouvons obtenir qu'une cohérence éventuelle sur les vues de données.
Nous devrions utiliser des algorithmes de réplication de redo-log par consensus aux endroits appropriés. Le système de métadonnées (ETCD) et la plate-forme de messagerie (par exemple, Apache Pulsar) utilisés dans Milvus 2.0 ont mis en œuvre des algorithmes de consensus. Mais comme je l'ai déjà dit, "pour la base de données vectorielles Milvus, nous ne trouvons pas suffisamment d'incitations à être un groupe de réplication de machine d'état dans son ensemble".
Dans Milvus 2.0, nous utilisons le modèle d'acteur pour organiser les nœuds de travail. Les nœuds de travail sont solitaires. Ils ne parlent qu'à la plateforme de messagerie, recevant des commandes et envoyant des résultats. Cela semble ennuyeux.
"Quelle est notre devise ? "L'ennui est toujours le meilleur" - The Hitman's Bodyguard (2017)
Le modèle d'acteur est asynchrone. Il est adapté à l'évolutivité et à la disponibilité. Comme les nœuds de travail ne se connaissent pas, il n'y a pas d'impact sur les autres nœuds de travail si certains d'entre eux se joignent ou sont supprimés.
Séparation de la disponibilité et de la durabilité
Dans Milvus 2.0, nous effectuons des relectures d'opérations plutôt que des relectures de journaux, car dans la base de données vectorielle, il n'y a pas de grande différence entre les relectures d'opérations et les relectures de journaux. Nous n'avons pas de fonction de mise à jour ni de fonction d'insertion avec sélection. De plus, il est beaucoup plus facile de rejouer une opération avec le modèle d'acteur.
Ainsi, plusieurs nœuds de travail peuvent exécuter la même opération à partir de la plateforme de messagerie en fonction de leur responsabilité. Je l'ai déjà dit, nous avons décidé d'utiliser le stockage en nuage S3 comme couche de stockage partagé du cluster de base de données Milvus. Le stockage S3 est très fiable. Est-il donc nécessaire que différents nœuds de travail écrivent les mêmes données dans le stockage partagé ?
Nous avons donc conçu trois rôles pour les nœuds de travail.
- Le nœud d'interrogation maintient une vue de données en mémoire en fonction de l'affectation. Le travail du nœud d'interrogation comprend la recherche vectorielle et la mise à jour des données en mémoire. Mais il n'a pas besoin d'écrire quoi que ce soit dans le stockage S3. C'est le nœud le plus sensible à la mémoire du groupe.
- Le nœud de données est responsable de l'écriture des nouvelles données dans le stockage S3. Le nœud de données n'a pas besoin de maintenir la vue des données en mémoire, de sorte que la configuration matérielle du nœud de données est très différente de celle du nœud de requête.
- Le nœud d'indexation construit des index pour les segments fermés par le nœud de données lorsque la taille des segments atteint le seuil. Il s'agit du travail le plus intensif en termes de CPU dans le groupe.
Ces trois types de nœuds représentent différents types de charge de travail. Ils peuvent évoluer indépendamment les uns des autres. C'est ce que nous appelons la séparation de la disponibilité et de la durabilité, apprise de la base de données en nuage Socrates de Microsoft.
La fin, mais aussi le début
Cet article a passé en revue plusieurs décisions de conception de la base de données vectorielle Milvus 2.0. Récapitulons rapidement ces points ici.
- Nous avons choisi la cohérence éventuelle pour le cluster Milvus 2.0.
- Nous avons intégré autant que possible les composants cloud matures dans Milvus 2.0. Nous avons contrôlé les nouveaux composants introduits par Milvus 2.0 dans les environnements de production des utilisateurs.
- En suivant le modèle d'acteur et la séparation de la disponibilité et de la durabilité, Milvus 2.0 est facile à mettre à l'échelle dans l'environnement en nuage.
Jusqu'à présent, nous avons formé l'ossature de la base de données Milvus 2.0 évolutive dans le nuage, mais notre carnet de commandes contient de nombreuses exigences de la communauté Milvus qui doivent être satisfaites. Si vous avez la même mission ("Construire plus de logiciels d'infrastructure open-source pour accélérer la transformation de l'IA"), nous vous invitons à rejoindre la communauté Milvus.
Milvus est un projet de fin d'études de la fondation LF AI & Data. Vous n'avez PAS besoin de signer de CCT pour Milvus !
Annexe
Document de conception de Milvus
https://github.com/milvus-io/milvus/tree/master/docs/design_docs
Implémentation de Raft en C++
Si vous êtes toujours intéressé par l'algorithme de consensus, je vous suggère de consulter le projet open-source Gringofts d'eBay. Il s'agit d'une implémentation en C++ de l'algorithme de consensus Raft (une variante de la famille Paxos). Mon ami Jacky et Elvis (mes ex-collègues chez Morgan Stanley) l'ont construit pour le système de paiement en ligne d'eBay, qui est précisément l'un des scénarios les plus adaptés à cette technologie.
- Objectifs de la base de données vectorielles Milvus
- L'évolution des grappes de bases de données
- La fin, mais aussi le début
- Annexe
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word