Configure Master-Master MySQL Database Replication
Traducciones al EspañolEstamos traduciendo nuestros guías y tutoriales al Español. Es posible que usted esté viendo una traducción generada automáticamente. Estamos trabajando con traductores profesionales para verificar las traducciones de nuestro sitio web. Este proyecto es un trabajo en curso.
What is MySQL Master-Master Replication?
MySQL Master-Master replication adds speed and redundancy for active websites. With replication, two separate MySQL servers act as a cluster. Database clustering is particularly useful for high availability website configurations. Use two separate Linodes to configure database replication, each with private IPv4 addresses.
This guide is written for a non-root user. Commands that require elevated privileges are prefixed with sudo. If you’re not familiar with the sudo command, you can check our
Users and Groups guide.
This guide is written for Ubuntu 18.04 and 20.04.
If you are unsure of which version of MySQL has been installed on your system when following the steps below, enter the following command:
mysql --versionInstall MySQL
Use the following commands to install MySQL on each of the Linodes:
sudo apt-get update sudo apt-get upgrade -y sudo apt-get install mysql-server mysql-clientRun the MySQL secure installation command. You are prompted to create a root password. It is recommended you select yes to all of the questions:
mysql_secure_installation
Edit MySQL’s Configuration
Edit the
/etc/mysql/my.cnffile onServer 1, andServer 2Linodes. Add or modify the following values:Server 1:
- File: /etc/mysql/my.cnf
1 2 3 4 5 6 7 8 9 10 11[mysqld] server_id = 1 log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index expire_logs_days = 10 max_binlog_size = 100M log_replica_updates = 1 auto-increment-increment = 2 auto-increment-offset = 1
Server 2:
- File: /etc/mysql/my.cnf
1 2 3 4 5 6 7 8 9 10 11[mysqld] server_id = 2 log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index expire_logs_days = 10 max_binlog_size = 100M log_replica_updates = 1 auto-increment-increment = 2 auto-increment-offset = 2
Note If using MySQL 8.0.25 or earlier, replacelog_replica_updateswithlog_slave_updates(within both Servers 1 and 2). See MySQL documentation for details.Edit the
bind-addressconfiguration in order to use the private IP addresses, forServer 1andServer 2:Server 1:
- File: /etc/mysql/my.cnf
1bind-address = 192.0.2.1
Server 2:
- File: /etc/mysql/my.cnf
1bind-address = 192.0.2.2
Once completed, restart the MySQL application on
Server 1, andServer 2:sudo systemctl restart mysql
Create Replication Users
Log in to MySQL on
Server 1, andServer 2Linodes:mysql -u root -pConfigure the replication users on each Linode. Replace
192.0.2.1and192.0.2.2with the private IP address of theServer 1andServer 2Linodes and replacepasswordwith a strong password.Server 1
CREATE USER 'replication'@'x.x.x.x' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.0.2.1';Server 2
CREATE USER 'replication'@'x.x.x.x' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.0.2.2';Server 1
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.0.2.1' IDENTIFIED BY 'password';Server 2
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.0.2.2' IDENTIFIED BY 'password';Run the following command to test the configuration. Use the private IP address of the respective Linodes:
Server 1
mysql -u replication -p -h 192.0.2.1 -P 3306Server 2
mysql -u replication -p -h 192.0.2.2 -P 3306This command should connect you to the remote server’s MySQL instance.
Configure Database Replication
Log into MySQL on
Server 1as the root user and query the master status:SHOW MASTER STATUS;Note the file and position values that are displayed:
mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 277 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)On
Server 2at the MySQL prompt, set up the replica functionality for that database. Replace192.0.2.1with the private IP ofServer 1. Also replace the value forsource_log_filewith the file value from the previous step, and the value forsource_log_poswith the position value.STOP REPLICA; CHANGE REPLICATION SOURCE TO source_host='192.0.2.1', source_port=3306, source_user='replication', source_password='password', source_log_file='mysql-bin.000001', source_log_pos=277; START REPLICA;STOP SLAVE; CHANGE MASTER TO master_host='192.0.2.1', master_port=3306, master_user='replication', master_password='password', master_log_file='mysql-bin.000001', master_log_pos=277; START SLAVE;On
Server 2, query the master status. Again note the file and position values.SHOW MASTER STATUS;Set the replica database status on
Server 1, utilizing similar commands as in step 2. When entering the commands, use the IP address ofServer 2and the file and position values you just collected in the previous step forServer 2.Test by creating a database and inserting a row:
Server 1:
create database test; create table test.flowers (`id` varchar(10));Server 2:
show tables in test;
When queried, you should see the tables from Server 1 replicated on Server 2. Congratulations, you now have a MySQL Master-Master cluster!
More Information
You may wish to consult the following resources for additional information on this topic. While these are provided in the hope that they will be useful, please note that we cannot vouch for the accuracy or timeliness of externally hosted materials.
This page was originally published on