{{tag>mysql replication HA haute_disponibilité master_master sysadmin cluster mysql-mmm}} ====== Replication Mysql master/master en utilisant Multi-Master Replication Manager ====== Cette page est dans les cartons depuis bien trop longtemps je profite d'un peu de disponibilité pour la mettre en ligne Nous allons donc voir comment mettre en oeuvre un cluster MySQL haute disponibilité en utilisant une réplication master/maseter et [[http://mysql-mmm.org/|Multi-Master Replication Manager for MySQL]] L'installation sera effectuée sur une ubuntu 10.04.2 LTS lucid, elle nécessite au moins 3 machines : * serveur MySQL 1 * serveur MySQL 2 * serveur de monitor MMM ^ Machine ^ Adresse IP ^ Rôle ^ | frtls-testmysql-1 | 10.41.51.163 | noeud 1 mysql master | | frtls-testmysql-2 | 10.41.51.145 | noeud 2 mysql master | | frtls-testmysql-mon | 10.41.51.184 | monitor MMM | ===== Mise en place de la replication master/master ===== ==== Installation initiale ==== Sur chacun des deux noeuds mysql : apt-get install mysql-server ==== Configuration de la replication master-master ==== * ajouter sur chaque noeud la configuration suivante : * Noeud 1 : fichier /etc/mysql/conf.d/mysqld_master_master_1.cnf [mysqld] #bind-address = 10.41.51.163 bind-address =0.0.0.0 server-id = 1 auto-increment-increment = 2 auto-increment-offset = 1 master-host=10.41.51.145 master-user=replicationUser master-password=replicationPass master-port=3306 #replicate-ignore-db : which database must NOT be replicated by the server as slave. replicate-ignore-db = mysql replicate-ignore-db = information_schema #binlog-ignore-db : specifies on which databases the binary logging must NOT be active binlog-ignore-db = mysql binlog-ignore-db = information_schema log_bin = /var/log/mysql/mysql-bin.log * Noeud 2 : fichier /etc/mysql/conf.d/mysqld_master_master_2.cnf [mysqld] #bind-address = 10.41.51.145 bind-address = 0.0.0.0 server-id = 2 auto-increment-increment = 2 auto-increment-offset = 2 master-host=10.41.51.163 master-user=replicationUser master-password=replicationPass master-port=3306 #replicate-ignore-db : which database must NOT be replicated by the server as slave. replicate-ignore-db = mysql replicate-ignore-db = information_schema #binlog-ignore-db : specifies on which databases the binary logging must NOT be active binlog-ignore-db = mysql binlog-ignore-db = information_schema log_bin = /var/log/mysql/mysql-bin.log Attention, les regles suivantes sont a respecter scrupuleusement : * Chaque server-id doit etre unique * mettre l'auto-increment-offset a 1 sur le premier serveur et 2 sur le second. auto-increment-offset marche en conjonction avec auto-increment-increment pour controler la generation des valeurs d'auto-increment. Chaque serveur nécessite un auto-increment-offset différent pour éviter les conflits. Si par exemple on a deux serveurs, avec auto-increment-increment à 2 et auto-increment-offset à 1 et 2 respectivement sur les noeuds 1 et 2, on obtiendra (et c'est notre but :-) )les sequences suivantes d'autoincrément pour conserver un identifiant unique global quel que soit le nombre de noeuds : Serveur 1: 1,3,5,7,9,11,... Serveur 2: 2,4,6,8,10,12,... * ajouter l'utilisateur de replication sur les 2 noeuds : * noeud 1 (IP 10.41.51.163) mysql> grant replication slave, replication client on *.* to 'replicationUser'@'10.41.51.145' identified by 'replicationPass'; mysql> flush privileges; * noeud 2 (IP 10.41.51.145) mysql> grant replication slave, replication client on *.* to 'replicationUser'@'10.41.51.163' identified by 'replicationPass'; mysql> flush privileges; * redémarrer les services mysql sur les deux noeuds : /etc/inid.d/mysql restart * On peut vérifier le status de la replication master/master à l'aide des commandes suivantes : la position sur un noeud du "show master status" doit correspondre avec Read_Master_Log_Pos obtenu sur le "show slave status" sur l'autre noeud, et vice et versa, par exemple : * noeud 1 : mysql> show master status\G *************************** 1. row *************************** File: mysql-bin.000001 Position: 348 Binlog_Do_DB: kikoo Binlog_Ignore_DB: 1 row in set (0.00 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.41.51.145 Master_User: replicationUser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 106 Relay_Log_File: frtls-testmysql-1-relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: kikoo Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 106 Relay_Log_Space: 418 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec) * noeud 2 : mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.41.51.163 Master_User: replicationUser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 348 Relay_Log_File: frtls-testmysql-2-relay-bin.000002 Relay_Log_Pos: 493 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: kikoo Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 348 Relay_Log_Space: 660 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec) mysql> show master status ; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 106 | kikoo | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) On dispose maintenant d'un cluster MySQL en replication Master/Master qui fonctionne Si l'on désire changer l'utilisateur servant a la réplication, il faut le changer dans les fichiers de configuration, mais en plus effectuer les opérations suivantes sur chacun des noeuds (par exemple pour renommer l'utilisateur en "replicate_user" : stop slave ; CHANGE MASTER TO MASTER_USER='replicate_user' ; start slave ; ===== Mise en place de la HA sur ce cluster avec MMM ==== MMM nécessite un agent sur chaque noeud MySQL et un moniteur tournant sur une machine tierce qui sert a détecter les erreurs de disponibilité et/ou réplication des noeuds, et basculer le service entre les noeuds (en utilisant une IP flottante) ==== Téléchargement ==== Les paquets .deb sont disponibles [[http://mysql-mmm.org/downloads|ici]] ==== Installation ==== * Sur chaque noeud MySQL : * Installation des prérequis :apt-get install liblog-log4perl-perl libmailtools-perl liblog-dispatch-perl iproute libnet-arp-perl libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl * Installation de mmm-agent à l'aide des paquets récupérés :dpkg -i mysql-mmm-common_2.2.1-1_all.deb mysql-mmm-agent_2.2.1-1_all.deb * Sur la machine moniteur : * Installation des prérequis :apt-get install liblog-log4perl-perl libmailtools-perl liblog-dispatch-perl libclass-singleton-perl libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl * Installation de mmm-monitor à l'aide des paquets récupérés : dpkg -i mysql-mmm-common_2.2.1-1_all.deb mysql-mmm-monitor_2.2.1-1_all.deb ==== Configuration ==== * Sur chaque noeud MySQL * Editer le fichier /etc/mysql-mmm/mmm_agent.conf et modifier la directive "this db1" pour refléter le nom de chaque noeud (respectivement "this db1" et "this db2" sur le noeud 1 et le noeud 2 par exemple) * ajouter les droits mysql sur les bases pour les agents et le mmm-monitor : grant replication client on *.* to 'mmm_monitorUser'@'10.41.51.184' IDENTIFIED BY 'mmm_monitorPass' ; grant super, replication client, process on *.* to 'mmm_agentUser'@'10.41.51.163' IDENTIFIED BY 'mmm_agentPass'; grant super, replication client, process on *.* to 'mmm_agentUser'@'10.41.51.145' IDENTIFIED BY 'mmm_agentPass'; flush privileges ; * Sur le moniteur, ajouter un fichier /etc/mysql-mmm/mmm_mon.conf : include mmm_common.conf ip 127.0.0.1 pid_path /var/run/mmm_mond.pid bin_path /usr/lib/mysql-mmm/ status_path /var/lib/misc/mmm_mond.status ping_ips 10.41.51.254, 10.41.51.145, 10.41.51.163 monitor_user mmm_monitorUser monitor_password mmm_monitorPass debug 0 10.41.51.254 est une IP "neutre" utilisée pour verifier le lien reseau du monitor (hors noeuds mysql), ici le routeur * Sur toutes les machines (les 2 noeuds et le moniteur), ajouter un fichier /etc/mysql-mmm/mmm_common.conf contenant : active_master_role writer cluster_interface eth0 pid_path /var/run/mmm_agentd.pid bin_path /usr/lib/mysql-mmm/ replication_user replicationUser replication_password replicationPass agent_user mmm_agentUser agent_password mmm_agentPass ip 10.41.51.163 mode master peer db2 ip 10.41.51.145 mode master peer db1 hosts db1, db2 ips 10.41.51.240 mode exclusive hosts db1, db2 ips 10.41.51.241 mode balanced où 10.41.51.240 et 10.41.51.241 sont les IPs flottantes respectives pour les roles "ecrivain" et "lecteur". Le lecteur sera utilisé si l'application le permet pour effectuer les requêtes en lecture sur un noeud non chargé par le role d'ecrivain * activer et demarrer tout ca : * sur les noeuds mysql : sed -i "s/ENABLED=0/ENABLED=1/" /etc/default/mysql-mmm-agent /etc/init.d/mysql-mmm-agent start * sur le monitor : sed -i "s/ENABLED=0/ENABLED=1/" /etc/default/mysql-mmm-monitor /etc/init.d/mysql-mmm-monitor start * pour verifier que tout va bien, lancer depuis le moniteur : mmm_control show qui doit retourner un résultat similaire à : db1(10.41.51.163) master/AWAITING_RECOVERY. Roles: db2(10.41.51.145) master/AWAITING_RECOVERY. Roles: * jusqu'ici le awaiting recovery est normal, il faut mettre les noeuds en ligne manuellement grace a la commande mmm_control set_online db1 * le status doit maintenant etre le suivant : mmm_control show db1(10.41.51.163) master/ONLINE. Roles: reader(10.41.51.241), writer(10.41.51.240) db2(10.41.51.145) master/AWAITING_RECOVERY. Roles: * enfin activer le second noeudmmm_control set_online db2 * le status doit maintenant etre le suivant : mmm_control show db1(10.41.51.163) master/ONLINE. Roles: writer(10.41.51.240) db2(10.41.51.145) master/ONLINE. Roles: reader(10.41.51.241) il est possible d'utiliser la directive [[http://mysql-mmm.org/mysql-mmm.html#SEC54|auto_set_online]] du monitor pour définir une valeur en seconde pour passer automatiquement de l'etat AWAITING_RECOVERY a l'etat ONLINE. Pour moi cette manipulation doit rester manuelle : si on en est la c'est qu'il y a eu un problème sur un des noeuds, et s'il y a eu un problème autant le réparer avant d'aller plus loin ;-) Et voila on a un cluster mysql-mmm opérationnel : il ne reste plus qu'a y créer des bases. ===== Ajout de bases de données et utilisateurs ===== * Une base de donnée crée sur l'un des nœuds est automatiquement crée sur les autres * La creation des utilisateurs ainsi que leurs GRANT doit impérativement être effectuée sur tous les nœuds ===== Références externes ===== * mysql replication master-master : * http://www.howtoforge.com/mysql_master_master_replication * http://www.neocodesoftware.com/replication/ * http://www.lefred.be/?q=node/45 * http://blogs.reliablepenguin.com/2011/03/27/mysql-master-master-ha-cluster * http://lists.mysql.com/replication/386 * monitoring : * http://exchange.nagios.org/components/com_mtree/attachment.php?link_id=203&cf_id=24 : check_replication.pl - Check if a MySQL slave is running (IO thread), plus check the master and server to see their current replication BINLOG positions. These are a few useful Nagios style checks we use for doing MySQL database and interface stuff. Please send comments, patches, and chocolate to: james_AT_rcpt.to. * mysql-mmm : * http://kovyrin.net/2007/04/23/master-master-replication-example-using-mmm/ * http://mysql-mmm.org/mmm2:guide * http://mysql-mmm.org/mysql-mmm.html#SEC12 * http://blog.mysql-mmm.org/2009/10/mmm-nagios-plugin/ * http://code.openark.org/blog/mysql/mmm-for-mysql-single-reader-role