Doubler la fiabilité avec un miroir MySQL, un mini-Howto

Tags

Imaginez que vous avec plusieurs sites a gérer. Sur un serveur, disons, monté en RAID-1 sur deux disques SATA en md-devices. C'est bien, les données sont dupliqués et si un disque dur brise, les données survivent. Évidemment ça ne nous protège pas des erreur de manipulation.

Une redondance comme je l'ai monté implique deux serveurs distincts qui ont chacun leur adresse ip et leur setup. Les serveurs ont deux adapteurs réseau et je les ai reliés ensemble et donné une adresse ip privé pour qu'ils puissent parler ensemble sans passer par Internet. Chaque serveur à les fichiers de sites pour chaque usager et chacun se connecte a mysql en localhost. La réplication se passe donc par l'adresse privée donc aucune encryption est nécessaire entre les peers.

Plus tard je devrai monter un service de miroirisation via rsync mais ce n'est pas le but de "ce" post.

Veuillez noter qu'il s'agit d'un howto TR√àS TECHNIQUE et je NE PEUT PAS nécessairement GARANTIR le FONCTIONNEMENT si vous faites simplement que COPIER SANS RÉFLÉCHIR.

Voici ce que j'ai fait pour préparer la redondance des serveurs. Actuellement seulement une Base de donnée est répliquée sur les deux machines, plus tard la redondance sera faite sur tout les sites publics et les applications, je teste encore pour m'assurer de savoir les choses a ne pas faire.

La réplication de base de donnée est un processus qui demande de la préparation. J'ai commencé avec:

  • Quelles tables répliquer
  • Quelles machines seront les nodes
  • Quelle version du serveur
Dans mon exemple je ne fait que répliquer qu'une seule BdD, si vous voulez en faire plus, faudra attendre que je sorte un autre billet, ou faire comme je fait... chercher :)

Considérations

Les serveurs sont connectés entre eux avec un cross-over cable et ont chacun leur adresses privés dans leur /etc/hosts que l'un pointe vers l'autre et vice versa.

Dans mon setup: La machine web1 EST mysql1, et web2 EST mysql2

Préparer l'espace de travail

  • Screen window 1, par exemple:
  • Faire un tail-follow sur les fichiers log, sur les deux machines.
    $ sudo tail -f /var/log/mysql/error_log.err
  • Screen window 0, par exemple:
  • se connecter en shell mysql sur la machine locale, sur chaque machine:
    $ mysql -u da_admin -p
    (utiliser le compte qui a les acces nécessaires, da_admin devrait suffir, sinon root)
  • Screen window 2, par exemple:
  • Avoir une session root, pour redémarrer les services au besoin et éditer les fichiers

MODIFIER les fichiers de config

  • Vérifier /etc/my.cnf, modifier en fonction des besoins
  • Modifier au niveau du bloc [mysqld]
  • AVOIR, un équivalent logique au web2:
  • /etc/my.ini sur web2, exemple
    server-id                       = 2
    log-bin                         = mysql-bin
    log-slave-updates
    auto_increment_increment        = 10
    auto_increment_offset           = 2
    log-error = /var/log/mysql/error_log
    replicate-do-db=renoirb_blog
  • AVOIR, un équivalent logique au web1:
  • Voir dans le fichier /etc/my.ini, et modifier le code.
    server-id = 1
    log-bin = mysql-bin
    log-slave-updates
    auto_increment_increment = 10
    auto_increment_offset  = 1
    log-error = /var/log/mysql/error_log
    replicate-do-db = renoirb_blog

Créer les logfiles

$ sudo vdir /var/log/mysql                    # VOIR si existant, sinon;
$ sudo mkdir /var/log/mysql
$ ps aux | grep mysqld                        # VOIR LE USER QUI ROULE MYSQLD
$ chown mysql.root /var/log/mysql        # DONNER les permissions au dossier
# service mysqld restart                      # REDEMARRER, en root, mysqld

Création des usagers

  • Aller sur l'application phpmyadmin de votre serveur
  • Dans phpmyadmin, aller dans la page d'accueil et privileges, Ajouter un unager avec les droits RELOAD, REPLICATION CLIENT, REPLICATION SLAVE
  • Ne pas oublier de le faire sur les deux machines
  • J'ai aussi ajouté les droits d'utilisation aux tables que je veut répliquer.
  • Aller sur le screen window 0 (le shell SQL)>
  • Le faire sur chaque machine
    mysql> FLUSH PRIVILEGES;                            # RECHARGER les privileges
    mysql> USE renoirb_blog;                                # ALLER dans table desiree de replication
    mysql> FLUSH TABLES WITH READ LOCK;       # Deverrouiller les tables, au cas
    mysql> SHOW MASTER STATUS;                     # Voir le log
  • Donne un output similaire a ceci:
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000003 | 325617   |              |                  |
    +------------------+----------+--------------+------------------+
    
  • Ensuite, on prépare la réplication
  • MODIFIER accordignly a la machine EN SHELL mysql:
  • SI vous êtes sur web2, placer mysql1 comme MASTER_HOST, et vice versa.
    mysql> CHANGE MASTER TO MASTER_HOST='mysql1',
    > MASTER_USER='replication_user',
    > MASTER_PASSWORD='LE MOT DE PASSE',
    > MASTER_LOG_FILE='mysql-bin.',
    > MASTER_LOG_POS=;
    mysql> SLAVE START;                        # DEMARRER LA REPLICATION sur chaque machine

Sources