web-dev-qa-db-fra.com

Comment gérer des millions d'utilisateurs?

Je suis sur le point de lancer quelque chose de vraiment gros. J'ai besoin de préparer mon serveur et ma base de données.

Je voudrais regrouper chaque ensemble de 100 000 utilisateurs dans des tables d'utilisateurs distinctes, mais je ne sais pas comment associer un utilisateur essayant de se connecter à la table d'utilisateurs appropriée.

Par exemple, comment pourrais-je savoir que l'utilisateur [email protected] est lié à la table utilisateur # 36?

Serait-ce la même chose d'avoir 10 millions d'utilisateurs dans une table d'utilisateurs ou 100 sur 100 000?

Comment fonctionne Facebook? Je ne peux pas croire qu'ils auraient une table d'utilisateurs globale avec 950 millions d'entrées.

18
Chris

Vous n'allez pas avoir un milliard d'utilisateurs demain et MySQL peut gérer plusieurs millions de lignes sans aucun problème. J'ai 5 millions d'utilisateurs dans ma table d'utilisateurs et croyez-moi, ce n'est même pas sur mon radar des sujets de préoccupation.

Ne vous inquiétez pas du sharding jusqu'à ce que vous besoin pour le faire. Vous essayez d'optimiser prématurément un problème qui peut ou non exister et, dans le processus, vous paralyserez sévèrement la vitesse à laquelle vous pourrez innover. Soyez rapide à lancer et trouvez les problèmes à mesure qu'ils surviennent. Vous ne pouvez pas prédire à l'avance quels seront vos défis de mise à l'échelle.

Quand et si jamais vous atteignez cette échelle, vous aurez alors pas mal d'argent et de ressources pour vous lancer dans ce genre de problème.

31
Aaron Brown

Je ne sais pas si des consultants externes seraient le meilleur support pour votre entreprise si vous allez gérer de très grands ensembles de données et que vous devez partir du sol. S'il vous plaît, ne vous méprenez pas, mais si quelqu'un bousille un projet avec autant de clients, cela aura un impact RP sur votre entreprise.

En ce qui concerne les tuples 10M dans une table, si vous avez une bonne indexation, ce sera bien. Nous devons stocker plusieurs tuples de 100 millions dans une table ici (articles vendus), ce qui fonctionne bien sur un grand Oracle 11g

Voici une publication de 2010 avec une carte de la conception de la base de données facebook: conception de la base de données Facebook

Vous voudrez peut-être lire la documentation mysql sur les types de partitions comme ceci: documentation MySQL: Partinioning

MySQL prend en charge ces types:

[~ # ~] plage de partitionnement [~ # ~] . Ce type de partitionnement attribue des lignes aux partitions en fonction des valeurs de colonne comprises dans une plage donnée. Voir Section 18.2.1, "Partitionnement de RANGE".

[~ # ~] liste [~ # ~] partitionnement. Similaire au partitionnement par RANGE, sauf que la partition est sélectionnée en fonction de colonnes correspondant à l'une d'un ensemble de valeurs discrètes. Voir Section 18.2.2, "Partitionnement de LISTE".

[~ # ~] hachage [~ # ~] partitionnement. Avec ce type de partitionnement, une partition est sélectionnée en fonction de la valeur renvoyée par une expression définie par l'utilisateur qui opère sur les valeurs de colonne dans les lignes à insérer dans la table. La fonction peut être constituée de toute expression valide dans MySQL qui donne une valeur entière non négative. Une extension de ce type, LINEAR HASH, est également disponible. Voir Section 18.2.3, "Partitionnement HASH".

Partitionnement de la touche [~ # ~] [~ # ~] . Ce type de partitionnement est similaire au partitionnement par HASH, sauf qu'une seule ou plusieurs colonnes à évaluer sont fournies et que le serveur MySQL fournit sa propre fonction de hachage. Ces colonnes peuvent contenir des valeurs autres que des entiers, car la fonction de hachage fournie par MySQL garantit un résultat entier quel que soit le type de données de la colonne. Une extension de ce type, LINEAR KEY, est également disponible. Voir Section 18.2.4, "Partitionnement des touches".

16
user10519

Tout d'abord, ne séparez pas les utilisateurs dans des tables distinctes. Cela rendra les choses complexes et inutiles. Les bases de données comme MySQL et autres peuvent fonctionner avec les bases de données de millions d'enregistrements dans la même table sans aucun problème (avoir les bonnes clés primaires configurées). Utilisez le champ de clé unique AUTO_INCREMENT AND PRIMARY pour chaque utilisateur (dans la table utilisateur principale), afin que chaque enregistrement soit unique (UID). Ensuite, dans les autres tableaux auxquels vous faites référence en utilisant cet identifiant unique. Assurez-vous ensuite que dans chaque table que vous avez définie comme PRIMARY KEY, cela accélérera le traitement des informations dans le serveur de base de données. Vous pouvez apprendre de Drupal CMS comment il stocke les informations des utilisateurs. Testé en plus de 10 ans par des millions d'utilisateurs et de très grandes entreprises (utilisé par les grandes sociétés de médias, le gouvernement, même les plus grandes banques du Sur www.drupal.org, vous trouverez plus de 1,6 millions de pages (nœuds) stockées dans la même table et il a plus de millions de visiteurs uniques par mois et le site Web fonctionne sans problème. l'optimisation et la configuration appropriées.

Après 10 millions d'enregistrements, si vous n'êtes pas satisfait des performances (après une optimisation correcte et des modifications de configuration de la base de données), vous pouvez décider si vous voulez vraiment séparer les utilisateurs par différentes tables. Vous pouvez donc réellement étendre la fonctionnalité en ajoutant une nouvelle table contenant des informations sur l'emplacement des enregistrements des utilisateurs: UID et nom_table. Ensuite, dans l'une des autres tables, demandez ces informations, cette table cherchera la bonne table. Mais je vous conseille vraiment d'avoir une grande table pour les utilisateurs, sauf si vous avez plus de 10 à 100 millions d'enregistrements. Mais cela n'améliorera pas beaucoup les performances (les bases de données sont conçues pour traiter les énormes données). Il vaut mieux garder les informations simples. Habituellement, les entreprises décident simplement d'un autre serveur de base de données (maître et esclaves), et d'un autre, puis elles travaillent ensemble avec la fonctionnalité d'équilibrage de charge. Si vous avez ces 10 millions d'utilisateurs, vous pourriez payer pour un autre serveur db, non?

Voir l'exemple du schéma de table user dans le fichier ser.install .

7
kenorb

Comme les autres réponses le suggèrent, ce n'est pas une bonne idée de diviser les utilisateurs en plusieurs tables. La plupart des bases de données avec des index sur l'ID utilisateur peuvent gérer des millions de lignes. Cependant, la latence par requête peut augmenter en fonction du nombre total d'entrées dans l'index. Tant que l'ensemble de données est petit, vous pouvez gérer avec une seule table dans des bases de données normales.

J'essaierai d'introduire une idée différente également pour votre future considération si vous grandissez bien au-delà d'un million de disques ou plus. Avec un si grand nombre de clients, vous ne voulez pas de temps d'arrêt, etc. Il y a donc un tas de bases de données nosql que vous pouvez consulter. Ils feront le sharding pour vous au lieu de gérer vous-même le sharding depuis l'application. Ils donneront également une redondance des données et donc une plus grande disponibilité. Facebook et tous utilisent beaucoup memcache, etc. pour leur cache. Mais je ne sais pas ce qu'ils utilisent pour leur magasin permanent.

Une chose importante que vous devez noter est que vous ne pouvez pas faire de jointures, etc. avec des bases de données nosql. Alors, planifiez votre cas d'utilisation et décidez. Si les jointures et les transactions multi-enregistrements sont une nécessité pour vous, les bases de données nosql ne sont pas pour vous.

3
sunil