80 votes

Solutions de mise à l'échelle pour MySQL (Réplication, Clustering)

Au démarrage Je travaille chez nous et nous envisageons actuellement des solutions de mise à l'échelle pour notre base de données. Les choses deviennent quelque peu confuses (pour moi en tout cas) avec MySQL, qui a la fonction Cluster MySQL , réplication y Réplication des clusters MySQL (à partir de la version 5.1.6), qui est une version asynchrone du cluster MySQL. Le manuel de MySQL explique certaines des différences dans ses FAQ sur les regroupements mais il est difficile de savoir quand utiliser l'un ou l'autre.

J'apprécierais tout conseil de la part de personnes qui connaissent les différences entre ces solutions, quels sont les avantages et les inconvénients, et quand recommandez-vous d'utiliser chacune d'elles.

100voto

Eran Galperin Points 49594

J'ai beaucoup lu sur les options disponibles. J'ai également mis la main sur High Performance MySQL 2nd edition, que je recommande vivement.

C'est ce que j'ai réussi à reconstituer :

Regroupement

Au sens général, la mise en grappe consiste à répartir la charge sur de nombreux serveurs qui, pour une application extérieure, apparaissent comme un seul serveur.

Cluster MySQL NDB

MySQL NDB Cluster est un moteur de stockage distribué, en mémoire, sans partage, avec réplication synchrone et partitionnement automatique des données (excusez-moi, j'emprunte littéralement au livre High Performance, mais ils l'ont très bien formulé). Il peut être une solution de haute performance pour certaines applications, mais les applications web ne fonctionnent généralement pas bien avec lui.

Le problème majeur est qu'au-delà des requêtes très simples (qui ne touchent qu'une seule table), le cluster devra généralement rechercher des données sur plusieurs nœuds, ce qui permet à la latence du réseau de s'immiscer et de ralentir considérablement le temps d'exécution des requêtes. Comme l'application traite le cluster comme un seul ordinateur, elle ne peut pas lui indiquer à partir de quel nœud il doit aller chercher les données.

En outre, l'exigence d'une utilisation en mémoire n'est pas réalisable pour de nombreuses grandes bases de données.

Séquoia continu

Il s'agit d'une autre solution de mise en grappe pour MySQL, qui agit comme un intergiciel au-dessus du serveur MySQL. Elle offre une réplication synchrone, un équilibrage de la charge et un basculement. Il garantit également que les requêtes obtiennent toujours les données de la dernière copie, en choisissant automatiquement un nœud qui possède les données les plus récentes.

J'ai lu quelques bonnes choses sur elle, et dans l'ensemble, elle semble assez prometteuse.

Fédération

La fédération est similaire à la mise en grappe, c'est pourquoi je l'ai également abordée ici. MySQL propose la fédération via le moteur de stockage fédéré. Comme la solution du cluster NDB, elle fonctionne bien pour les requêtes simples uniquement - mais encore moins bien que le cluster pour les requêtes compliquées (puisque la latence du réseau est beaucoup plus élevée).

Réplication et équilibrage de charge

MySQL a la capacité intégrée de créer des réplications d'une base de données sur différents serveurs. Cette fonction peut être utilisée pour de nombreuses raisons : répartition de la charge entre les serveurs, sauvegardes à chaud, création de serveurs de test et basculement.

La configuration de base de la réplication implique un serveur maître gérant principalement les écritures et un ou plusieurs esclaves gérant uniquement les lectures. Une variante plus avancée est celle de la maître-maître qui permet de faire évoluer les écritures également en ayant plusieurs serveurs qui écrivent en même temps.

Chaque configuration a ses avantages et ses inconvénients, mais le problème qu'elles partagent toutes est le décalage de la réplication. La réplication MySQL étant asynchrone, tous les nœuds ne disposent pas des données les plus récentes à tout moment. L'application doit donc être consciente de la réplication et intégrer des requêtes tenant compte de 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 récentes, les choses se compliquent quelque peu.

La réplication nécessite un certain équilibrage de la charge pour répartir la charge entre les nœuds. Il peut s'agir d'une simple modification du code de l'application ou de l'utilisation de solutions logicielles et matérielles dédiées.

Sharding et partionnement

Le sharding est une approche couramment utilisée pour faire évoluer les solutions de bases de données. Vous divisez les données en plus petits morceaux et les répartissez sur différents nœuds de serveur. Pour fonctionner efficacement, l'application doit être consciente de la modification du stockage des données, car elle doit savoir où trouver les informations dont elle a besoin.

Il existe des cadres d'abstraction qui permettent de gérer le partage des données, tels que Shards d'Hibernate Il s'agit d'une extension de l'ORM Hibernate (qui est malheureusement en Java. J'utilise PHP). HiveDB est une autre solution de ce type qui prend également en charge le rééquilibrage des shards.

Autres

Sphinx

Sphinx est un moteur de recherche en texte intégral, qui peut être utilisé pour bien plus que des recherches d'essai. Pour de nombreuses requêtes, il est beaucoup plus rapide que MySQL (en particulier pour le regroupement et le tri), et peut interroger des systèmes distants en parallèle et agréger les résultats - ce qui le rend très utile en cas d'utilisation de sharding.

En général, sphinx devrait être utilisé avec d'autres solutions de mise à l'échelle pour tirer le meilleur parti du matériel et de l'infrastructure disponibles. L'inconvénient est qu'une fois encore, le code de l'application doit connaître sphinx pour l'utiliser à bon escient.

Résumé

Les solutions de mise à l'échelle diffèrent en fonction des besoins de l'application qui en a besoin. Pour nous et pour la plupart des applications web, je pense que la réplication (probablement multi-maître) est la solution à adopter avec un équilibreur de charge distribuant la charge. Le sharding de zones problématiques spécifiques (tables énormes) est également indispensable pour pouvoir évoluer horizontalement.

Je vais aussi essayer Continuent Sequoia et voir s'il peut vraiment faire ce qu'il promet puisqu'il implique le moins de changements au code de l'application.

12voto

nathan Points 2755

Avertissement : je n'ai pas utilisé MySQL Cluster, je me base donc uniquement sur ce que j'ai entendu.

MySQL Cluster est une solution HA (haute disponibilité). Elle est rapide, car tout se fait en mémoire, mais son véritable argument de vente est la disponibilité. Il n'y a pas de point de défaillance unique. Avec la réplication, par contre, si le maître tombe en panne, vous devez passer à la réplique, ce qui peut entraîner un petit temps d'arrêt. (bien que la solution DRBD soit une autre alternative qui offre une haute disponibilité)

Cluster exige que la totalité de votre base de données tienne en mémoire. Cela signifie que chaque machine du cluster doit disposer d'une mémoire suffisante pour stocker la totalité de la base de données. Ce n'est donc pas une solution envisageable 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 ne soit super important (lire : probablement pas), c'est plus de tracas (et d'argent) que ça n'en vaut la peine. La réplication est plus souvent la meilleure solution.

Editar: J'ai également oublié de mentionner que Cluster n'autorise pas les clés étrangères et que les balayages de plage sont plus lents que sur les autres moteurs. Voici un lien qui parle de Limitations connues de MySQL Cluster

4voto

acrosman Points 7688

Il y a de bonnes discussions sur la façon dont les personnes qui maintiennent drupal.org ont structuré leurs serveurs de base de données :

Ces deux documents datent de 2007, de sorte que la prise en charge de la mise en grappe est peut-être plus solide aujourd'hui, mais à l'époque, ils ont choisi la réplication.

2voto

Zak Points 10160

Ce qui est bien avec la réplication, c'est que c'est facile. Il suffit de configurer 2 boîtes mysql, de changer le serverID de la seconde boîte, puis de faire pointer la seconde boîte vers la première en utilisant la commande change master to.

Voici l'exemple pertinent de configuration de l'esclave my.cnf

#
#       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

Assurez-vous que chaque esclave reçoit un serverID incrémenté de 1 (donc le prochain esclave est le serveur 3).

configurer un nom d'utilisateur et un mot de passe sur lesquels l'esclave peut se connecter, Puis exécutez changez le maître en MASTER_HOST = 'x.x.x.x' ; changez le maître en MASTER_PASSWORD = 'xxxxx' ;

et ainsi de suite.

enfin, lancez "start slave ;"

Votre esclave arrive et commence à répliquer. Super, hein !

Cela suppose que vous commencez avec 2 serveurs vides. Ensuite, vous pouvez décharger votre base de données sur le serveur maître, et comme il se charge là, il se chargera également sur l'esclave.

Vous pouvez vérifier l'état de l'esclave en exécutant :

\G

Amusez-vous bien avec. C'est si facile...

1voto

Adi Points 11

En faisant une étude sur la haute disponibilité, j'ai rencontré de nombreuses solutions et probablement dans notre cas, qui était un système plus intensif en écriture, j'ai trouvé le cluster DRBD meilleur que le cluster NDB car il fournit plus de transactions par seconde.

La réplication Mysql peut vous fournir une machine de sauvegarde qui peut être utilisée comme esclave de lecture ou être utilisée en cas de reprise après sinistre.

Grâce aux différents modes de gestion des transactions fournis par DRBD, vous pouvez, dans une certaine mesure, réduire l'impact sur les performances de la réplication des données au niveau du périphérique sur le réseau. Pour un système fiable qui ne doit perdre aucune transaction en cas de panne, utilisez le mode C, sinon optez pour le mode B.

J'ai essayé de dresser la liste de ce que j'ai appris lors de la mise en place du cluster DRBD à l'adresse suivante http://www.techiegyan.com/?p=132

Il fonctionne très bien avec une connexion dédiée à la réplication, c'est-à-dire qu'il faut réserver des interfaces séparées à haut débit sur les deux machines uniquement pour la réplication de drbd. Heartbeat peut contrôler le cluster avec tous les services un par un, c'est-à-dire les adresses IP, les partitions, drbd et mysql.

Je n'ai pas encore découvert la configuration Master-Master sur DRBD. Je vous tiendrai au courant dès que j'aurai réussi à le faire.

Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X