Solutions d'échelle pour MySQL (réplication, Clustering)
au startup je travaille à nous sommes maintenant en train d'envisager des solutions de mise à l'échelle pour notre base de données. Les choses deviennent quelque peu confuses (pour moi au moins) avec MySQL, qui a le cluster MySQL , réplication et réplication cluster MySQL (de ver. 5.1.6), qui est une version asynchrone du cluster MySQL. Le manuel MySQL explique certaines des différences dans sa FAQ , mais il est difficile de déterminer à partir de quand utiliser l'un ou l'autre.
j'apprécierais tous les conseils de personnes qui connaissent les différences entre ces solutions et quels sont les avantages et les inconvénients, et quand recommandez-vous de les utiliser.
9 réponses
j'ai fait BEAUCOUP de lecture sur les options disponibles. J'ai aussi obtenu mes mains sur la haute performance MySQL 2e édition, que je recommande fortement.
C'est ce que j'ai réussi à reconstituer:
Clustering
Clustering dans le sens général est la distribution de la charge sur plusieurs serveurs qui apparaissent à l'extérieur de l'application comme un serveur.
MySQL NDB Cluster
MySQL NDB Cluster est un moteur de stockage distribué, en mémoire, partagé-rien avec la réplication synchrone et le cloisonnement automatique de données (excusez-moi j'emprunte littéralement du livre de haute Performance, mais ils l'ont mis très bien là). Il peut être une solution de haute performance pour certaines applications, mais les applications web ne fonctionnent généralement pas bien sur elle.
le problème majeur est qu'au-delà des requêtes très simples (qui ne touchent qu'une table), le cluster devra généralement rechercher des données sur plusieurs nœuds, ce qui permet à la latence réseau de s'infiltrer et ralentit considérablement le temps de traitement des requêtes. Puisque l'application traite le cluster comme un ordinateur, il ne peut pas lui dire à quel noeud récupérer les données.
de plus, l'exigence relative à la mémoire n'est pas applicable à de nombreuses grandes bases de données.
Continuent Sequoia
C'est une autre solution de clustering pour MySQL, qui agit comme un middleware en plus de la MySQL server. Il offre la réplication synchrone, l'équilibrage de charge et le basculement. Il garantit également que les requêtes obtiennent toujours les données de la dernière copie, en choisissant automatiquement un noeud qui a les données fraîches.
j'ai lu quelques "1519210920 de" bonnes choses sur elle, et l'ensemble, il semble assez prometteur.
Fédération
La Fédérationest similaire au clustering, donc je l'ai fait ici aussi. MySQL offre la Fédération via le fédérés moteur de stockage. Similaire à la solution de cluster NDB, il fonctionne bien avec des requêtes simples seulement - mais pire encore le cluster pour les plus compliquées (puisque la latence réseau est beaucoup plus élevée).
réplication et équilibrage de charge
MySQL a la capacité construite pour créer des répliques d'une base de données sur différents serveurs. Cela peut être utilisé pour de nombreuses choses - partage de la charge entre les serveurs, sauvegardes chaudes, création de serveurs d'essai et basculement.
la configuration de base de la réplication implique qu'un serveur maître gère principalement les Écritures et qu'un ou plusieurs esclaves gèrent uniquement les lectures. Une variante plus avancée est celle de la configuration master-master , qui permet d'écrire à l'échelle aussi bien en ayant plusieurs serveurs écrivant en même temps.
chaque configuration a ses avantages et ses inconvénients, mais un problème qu'ils partagent tous est le délai de réplication-puisque la réplication MySQL est asynchrone, tous les noeuds n'ont pas les données les plus récentes à tout moment. Pour cela, l'application doit être consciente de la réplication et intégrer des requêtes compatibles avec la réplication pour fonctionner comme prévu. Pour certaines applications, cela peut ne pas être un problème, mais si vous avez toujours besoin des données les plus fraîches, les choses deviennent un peu compliquées.
La réplication denécessite un certain équilibrage de la charge pour répartir la charge entre les noeuds. Cela peut être aussi simple que quelques modifications au code d'application, ou en utilisant dédié solutions logicielles et matérielles.
Sharding et partioning
Sharding est une approche couramment utilisée pour les solutions de base de données à échelle. Vous divisez les données en morceaux plus petits et les répartissez autour de différents noeuds de serveur. Pour ce faire, l'application doit être consciente de la modification apportée au stockage des données afin de fonctionner efficacement, car elle doit savoir où trouver l'information dont elle a besoin.
il y a des cadres d'abstraction disponible pour aider à traiter le partage de données, comme Hibernate Shards , une extension de L'ORM Hibernate (qui est malheureusement en Java. Je suis à l'aide de PHP). HiveDB en est une autre solution qui prend également en charge éclat de rééquilibrage.
autres
Sphinx
Sphinx est un moteur de recherche plein-texte, qui peut être utilisé pour beaucoup plus que des recherches de test. Pour de nombreux requêtes il est beaucoup plus rapide que MySQL (spécialement pour le groupement et le tri), et peut interroger les systèmes distants en parallèle et agréger les résultats - ce qui le rend très utile dans l'utilisation avec sharding.
en général sphinx doit être utilisé avec d'autres solutions de mise à l'échelle pour obtenir plus du matériel et de l'infrastructure disponibles. L'inconvénient est que, encore une fois, vous avez besoin du code d'application pour être conscient de sphinx pour l'utiliser à bon escient.
résumé
les solutions D'échelle diffèrent selon les besoins de l'application qui en a besoin. Pour nous et pour la plupart des applications web, Je crois que la réplication (probablement Multi-master) est la voie à suivre avec un équilibreur de charge distribuant la charge. Le découpage de zones à problèmes spécifiques (grandes tables) est également un must pour pouvoir se dimensionner horizontalement.
je vais aussi donner un coup de Sequoia continu et voir si elle peut vraiment faire ce qu'elle promet puisqu'elle impliquera le moins de changements au code de l'application.
avis de non-responsabilité: je n'ai pas utilisé MySQL Cluster, donc je vais seulement à partir de ce que j'ai entendu.
MySQL Cluster est une solution HA (haute disponibilité). C'est rapide, parce que tout est dans la mémoire, mais du point de vente réel de la disponibilité. Il n'y a pas de point de défaillance unique. Avec la réplication, d'autre part, si le maître tombe en panne, vous avez fait passer à la réplique, et il peut y avoir une petite quantité de temps. (bien que la solution DRBD soit une autre alternative qui a une grande disponibilité)
Cluster exige que votre base de données entière s'adapte en mémoire. Cela signifie que chaque ordinateur du cluster doit avoir assez de mémoire pour stocker la base de données entière. Ce n'est donc pas une solution réalisable pour les très grandes bases de données (ou du moins, c'est une solution très coûteuse).
je pense qu'à moins que HA soit super important (lire: probablement pas), c'est plus de tracas (et d'argent) que de valeur. La réplication est plus fréquente la meilleure façon d'aller.
Edit: j'ai oublié de mentionner aussi que Cluster ne permet pas les clés étrangères, et les scanners de portée sont plus lents que sur les autres moteurs. Voici un lien qui parle de Limitations connues du Cluster MySQL
Il ya quelques bonnes discussions sur la façon dont les gens qui maintiennent drupal.org ont structuré leurs serveurs de base de données:
" les deux sont de 2007, de sorte que le soutien de regroupement peut être plus fort maintenant, mais à l'époque ils ont choisi la réplication.
ce qui est cool dans la réplication, c'est que c'est facile. Il suffit de configurer 2 boîtes mysql, de changer le serverID sur la deuxième boîte, puis de pointer la deuxième boîte sur la première en utilisant la commande change master.
Voici l'exemple pertinent d'esclave.cnf config
#
# Log names
#
log-bin=binlog
relay-log=relaylog
log-error=errors.log
#
# Log tuning
#
sync_binlog = 1
binlog_cache_size = 1M
#
# Replication rules (what are we interested in listening for...)
#
# In our replicants, we are interested in ANYTHING that isn't a permission table thing
#
replicate-ignore-db = mysql
replicate-wild-ignore-table=mysql.%
#
# Replication server ID
#
server-id = 2
donc assurez-vous que chaque esclave obtienne un serverID incrémenté de 1 (donc le prochain esclave est le serveur 3)
définir un nom d'utilisateur et le mot de passe que l'esclave peut connectez-vous sur, Ensuite, exécutez changez maître en MASTER_HOST = ' X. x.x.x"; remplacer master par MASTER_PASSWORD = "xxxxx";
et ainsi de suite.
enfin, lancez "start slave; "
arrive ton esclave et commence à se répliquer. doux hein!
cela suppose que vous commencez avec 2 serveurs vides. Ensuite, vous pouvez décharger votre db dans le serveur maître, et comme il se charge là, il se chargera aussi sur l'esclave.
You peut vérifier le statut de l'esclave en exécutant:
afficher le statut d'esclave \G
amusez-vous bien.. tellement facile...
la limitation "en mémoire" nous empêche d'utiliser MySQL cluster pour nos presque 50 Go de données, donc nous utilisons DRBD plus Linux Heartbeat .
c'est un peu comme un tableau raid entre deux (ou plus) boîtes qui garde les bases de données / logs / configs sync (mais un seul serveur peut être" live " à la fois). Failover est automatique, utilise la même adresse IP, et est rapide comme un redémarrage mysql, ce qui a été une bonne solution pour nous.
tout en faisant L'étude de haute disponibilité j'ai rencontré beaucoup de solutions et probablement dans notre cas qui était le système plus intensif en écriture, j'ai trouvé cluster DRBD mieux que le cluster NDB car il fournit plus de nombre de transactions par seconde.
la réplication Mysql peut vous fournir une machine de sauvegarde qui peut soit être utilisée comme esclave de lecture ou peut être utilisée en cas de récupération après sinistre.
Avec différents modes de gestion des transactions fournis par DRBD vous pouvez certains ce qui réduisent la performance frappé par la réplication de niveau de périphérique des données sur le réseau. Pour un système fiable qui ne devrait pas perdre de transaction en cas de panne, utilisez le mode C, sinon allez pour B.
j'ai essayé d'énumérer quelques-uns des apprentissages que j'ai faits lors de la mise en place du cluster DRBD à http://www.techiegyan.com/?p=132
il fonctionne vraiment bien sur la connexion dédiée pour la réplication c.-à-d. réserver la haute vitesse séparée interfaces sur les deux machines uniquement pour la réplication drbd. Heartbeat peut contrôler le cluster correctement avec tous les services un par un i.e. adresses IP, partitions, drbd et mysql.
je suis encore à découvrir le Maître-Maître de configuration sur DRBD. Sera mise à jour dès que j'en obtenir le succès.
Merci.
à mon avis, la confusion ici me renvoie à Mnesia. Avec la fragmentation, la façon déclarative et pragmatique de traiter les index, la transparence de L'emplacement de la réplique de base de données.T. c
dans notre configuration, nous exécutons à la fois MySQL Cluster et Mnesia. Nos données sont un peu saisonnières. Donc ce qui se passe, c'est qu'après un certain temps, on soulage mnesia des données qui ne sont plus utilisées et on les jette dans L'amas MYSQL. Cela maintient notre mnesia efficace. Nous avons également mis en œuvre dans le main stream languages (Python, Clojure E. T. c) qui utilisent des données directement de MySQL.
en un mot, on exécute mnesia sur MySQL Cluster. Le Cluster MySQL peut traiter de grands ensembles de données, une base de données peut passer à 50 Go plus. Nous avons mnesia alimentant les applications Erlang/OTP . Java et PHP données d'accès d'amnésie & nbsp; plus de sur-mesure RESTE (récemment l'Épargne ) APIs utilisant JSON et XML comme formats d'échange.
la couche d'accès aux données a un accès abstrait aux données en Mnesia et aux anciennes données expédiées dans le Cluster MySQL si nécessaire. Mnesia est ici essentiellement pour alimenter les applications Erlang/OTP.Une fois qu'il est accaparé par des données, on le jette dans le Cluster MYSQL. La couche d'accès aux données peut accéder aux données en mnesia et MySQL dans une API abstraite au nom de toutes les applications.
ce que je peux dire ici, c'est que Mnesia a été la meilleure option pour nous. Les tables sont très fragmentées et indexées, les requêtes performent très bien et la base de données est répliquée sur 2 sites, connectés sur un tunnel.
plus tôt, nous avons craint que mnesia peut ne pas traiter autant d'enregistrements que possible en raison de la taille de la table limite. Mais nous avons trouvé cette déclaration fausse. Avec un bon accord (fragmentation), nos bases de données mnesia contiennent en moyenne 250 millions d'enregistrements par an.
nous avons a bénéficié de la structure complexe des données D'Erlang et du fait que Mnesia peut l'avaler sans changement. Les applications Erlang /OTP sont les plus efficaces de toutes les autres applications dans les langues anciennes et avec notre système, nous prévoyons de migrer tout cela vers la technologie Erlang/OTP. De Erlang nous accédons apparemment aux données du Cluster MySQL et exécutons des requêtes sur ses serveurs très merveilleusement, en fait, nous avons déduit que son Erlang / OTP qui peut utiliser pleinement les ressources du serveur MySQL en raison de son (Erlang) massif de la simultanéité.
Mnesia a très bien travaillé pour nous.Mnesia a complètement changé la façon dont nous regardons les bases de données en raison de ses performances passionnantes. Nos cœurs de processeurs Solaris server sont maintenus occupés à une moyenne d'environ 48% d'utilisation aux heures de pointe.
je vous conseille de vérifier mnesia et qui sait, il peut répondre à un certain nombre de vos besoins de distribution ou de réplication.
Je ne les ai pas utilisés, mais d'après les documents, je dirais que la réplication est la solution préférée si la charge la plus importante se lit à partir de la base de données.
MySQL cluster est une étrange bestiole et chaque fois que nous l'avons évalué, il est soit très mal exécuté ou a été peu fiable.
c'est horriblement compliqué à configurer (vous avez besoin d'au moins trois noeuds, peut-être plus). En outre, il n'y a aucune disposition pour avoir des clients fail over, donc vous devez le faire vous-même (ou utiliser autre chose pour agir comme un mandataire, etc).
c'est extrêmement intelligent, parce qu'il fait le partitionnement automatique de hachage sur la clé primaire qui vous permet de mettre à l'échelle écrit, et aussi parce qu'il n'a pas un seul point d'échec.
mais je pense vraiment qu'il est mieux adapté aux cas très spéciaux, il a été conçu pour. Dans la plupart des cas, il ne peut pas remplacer un autre moteur de base de données (par exemple InnoDB) en termes de performances ou de fonctionnalités.