Comment gérer des millions d'utilisateurs?


17

Je suis sur le point de lancer quelque chose de vraiment grand. 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 cet utilisateur jay@mail.comest lié à la table d'utilisateurs # 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.


I can't believe they would have one global user table with 950 million entries.Je peux, ce n'est pas si grand. J'ai travaillé avec des tables plus grandes. C'est assez commun. L'autre option que je considérerais si vous avez beaucoup d'autres données est une base de données NoSQL .
NimChimpsky

5
Si vous prévoyez d'avoir un grand nombre d'utilisateurs et une grande quantité de données, vous devez engager un spécialiste de base de données pour concevoir cela. Je ne regarderais personne qui n'a pas au moins dix ans d'expérience dans la base de données et au moins 5 ans d'expérience dans la conception de grandes bases de données. Il s'agit d'un sous-thème complexe qui nécessite des connaissances approfondies.
HLGEM

Réponses:


30

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 partage avant d' avoir besoin de le faire. Vous essayez d'optimiser prématurément un problème qui peut ou non exister et, ce faisant, vous paralyserez gravement le rythme auquel 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.


4
Be fast to launch and find the problems as they comecette partie est excellente. C'est vrai. Si nous découvrons des problèmes à mesure qu'ils surviennent, il n'y aura pas de problème grave ultérieurement. +1
ALH

16

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 11 g

Voici une publication de 2010 avec une carte de conception de facebooks db: Conception de 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:

Partitionnement RANGE . 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».

Partitionnement LIST . 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 LISTE».

Partitionnement HASH . 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 KEY . 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».


7

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 principale des utilisateurs), 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 utilisateur. Testé en plus de 10 ans par des millions d'utilisateurs et de très grandes entreprises (utilisé par les grandes entreprises médiatiques, le gouvernement, voire les plus grandes banques du monde). 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. Tout est question d'optimisation et de 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. Ainsi, vous pouvez 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 ils ' re travailler 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 de userschéma de table dans le fichier user.install .


3

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 voudrez peut-être 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

pourquoi ne pas diviser en fonction de la gamme alphabétique? Si vous avez des millions d'utilisateurs, créez un tableau séparé pour chaque lettre ou pour une paire de lettres (tableau «a» pour les utilisateurs dont le nom d'utilisateur commence par «a»). Ce sera beaucoup de frais généraux au début, mais puisque vous vous attendez à une grande base de données et que vous voulez pouvoir distinguer quelle table doit être utilisée pour un utilisateur particulier - je suppose que l'ordre alphabétique est le choix le plus évident et le plus simple.


9
C'est une super mauvaise idée. Par exemple, votre logiciel devra migrer automatiquement les lignes si les utilisateurs changent de nom de famille ... sauf si vous cessez de vous soucier de la cohérence. Cette stratégie invite ces types de contingences.
randomx
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.