Version courteVous cherchez à travers les partitions?
Si je divisé mes utilisateurs en tessons, comment puis-je offrir une « recherche de l'utilisateur »? Évidemment, je ne veux pas que toutes les recherches atteignent chaque fragment.
Version longue
Par tesson, je veux dire avoir plusieurs bases de données où chaque contient une fraction de l'ensemble des données. Pour un exemple (naïf), les bases de données UserA, UserB, etc. peuvent contenir des utilisateurs dont le nom commence par "A", "B", etc. Lorsqu'un nouvel utilisateur s'inscrit, j'examine simplement son nom et le place dans le bon base de données. Quand un utilisateur de retour se connecte, je regarde à nouveau son nom pour déterminer la base de données correcte pour tirer ses informations. L'avantage de la réplication sharding vs read est que la réplication en lecture ne met pas à l'échelle vos écritures. Toutes les écritures qui vont au maître doivent aller à chaque esclave. Dans un sens, ils portent tous la même charge d'écriture, même si la charge de lecture est distribuée.
Pendant ce temps, les fragments ne se soucient pas de l'écriture de l'autre. Si Brian s'inscrit sur le fragment UserB, le fragment UserA n'a pas besoin d'en entendre parler. Si Brian envoie un message à Alex, je peux enregistrer ce fait sur les fragments UserA et UserB. De cette façon, quand Alex ou Brian se connecte, il peut récupérer tous ses messages envoyés et reçus depuis son propre fragment sans interroger tous les fragments.
Jusqu'ici, tout va bien. Qu'en est-il des recherches? Dans cet exemple, si Brian recherche "Alex", je peux vérifier UserA. Mais que faire s'il recherche Alex par son nom de famille, "Smith"? Il y a des Smiths dans chaque fragment. De là, je vois deux options:
- Demandez à l'application de rechercher des Smith sur chaque fragment. Cela peut être fait lentement (en interrogeant chaque fragment successivement) ou rapidement (en interrogeant chaque fragment en parallèle), mais de toute façon, chaque fragment doit être impliqué dans chaque recherche. De la même manière que la réplication en lecture ne met pas à l'échelle les écritures, les recherches effectuées sur chaque fragment n'évoluent pas vos recherches. Vous pouvez atteindre un moment où votre volume de recherche est suffisamment élevé pour submerger chaque fragment, et l'ajout de fragments ne vous aide pas, car ils ont tous le même volume.
- Une sorte d'indexation qui tolère elle-même le sharding. Par exemple, disons que j'ai un nombre constant de champs par lesquels je veux rechercher: prénom et nom. En plus de UserA, UserB, etc. J'ai aussi IndexA, IndexB, etc. Quand un nouvel utilisateur s'enregistre, je le joins à chaque index où je veux qu'il soit trouvé. J'ai donc mis Alex Smith dans IndexA et IndexS, et il peut être trouvé sur "Alex" ou "Smith", mais pas de sous-chaînes. De cette manière, vous n'avez pas besoin d'interroger chaque fragment, donc la recherche peut être évolutive.
La recherche peut-elle être mise à l'échelle? Si oui, cette approche d'indexation est-elle la bonne? Y en a-t-il d'autres?
Merci. J'ai vraiment lu ce site intensivement. J'ai essayé de clarifier ma question ci-dessus; qui, espérons-le, est au-delà de l'article que vous avez utilement lié. –