Doubler la fiabilité avec un miroir MySQL, un mini-Howto
linux tutoriels - 📁 tranche-de-vie
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
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