在Ubuntu 16.04上设置MySQL Master Master复制的5个步骤

时间:2020-03-05 15:25:51  来源:igfitidea点击:

MySQL数据库中的主从复制为数据库提供了负载平衡。
但是它不提供任何故障转移方案。
如果主服务器发生故障,我们将无法直接在从服务器上执行查询。
除了负载平衡外,如果在我们的场景中需要故障转移,我们可以在Master-Master复制中设置2个MySQL实例。
本文介绍了如何在Ubuntu 16.04服务器上的5个简单步骤中实现此目标。

在主控主复制中,两个服务器都彼此扮演主控和从属的角色,如下图所示:

每个服务器同时充当另一个从属服务器的主服务器。
因此,如果我们熟悉MySQL中的主从复制,那么这对我们来说一定是小菜一碟。

准备工作:

本文假定我们正在运行基于Linux的操作系统。
还需要MySQL服务器。
此演示使用以下OS /软件包:

  • Ubuntu 16.04 LTS(Xenial Xerus)
  • mysqld Ver 5.7.12-0ubuntu1.1

我们还使用2台将处于Master-Master配置的服务器。
这些服务器称为:

  • theitroadMasterLeft(IP-192.168.1.101)
  • theitroadMasterRight(IP-192.168.1.102)

此设置也可以在其他基于Linux的操作系统上使用,但是某些配置文件路径可能会更改。

现在,让我们从用于MySQL复制的步骤开始:

步骤1:安装MySQL服务器

MySQL服务器需要同时安装在两台服务器上。
这两个服务器的步骤相同:

igi@theitroadMasterLeft:~$sudo apt-get update && sudo apt-get install mysql-client mysql-server
root@theitroadMasterRight:~# sudo apt-get update && sudo apt-get install mysql-client mysql-server

此安装将提示我们选择一个MySQL根密码。
选择一个安全的密码,并确保密码安全。

现在,根据用例,我们可能想要复制一个数据库或者多个数据库。

用例1:我们只需要复制选定数量的数据库。
使用MySQL配置文件中的“ binlog_do_db”选项指定要复制的数据库名称。

用例2:我们需要复制所有数据库,除了少数数据库。
我们可能希望将来创建新数据库,然后将它们手动添加到列表中可能会出现问题。
因此,在这种情况下,请勿使用选项“ binlog_do_db”。
如果我们未在配置中放置此选项,则默认情况下,MySQL将复制所有数据库。
我们只是将不需要复制的数据库(如“ information_schema”和“ mysql”)放入选项“ binlog_ignore_db”。

如果需要的话,我们也可以同时使用这两个选项。
就本演示而言,我们将仅复制1个数据库(如情况1所示)。

参与复制的MySQL实例是(复制)组的一部分。
该组中的所有服务器都有唯一的ID。
在配置服务器以进行复制时,我们需要确保此ID不重复。
我们将在一段时间后看到这一点。

步骤2:将MySQL配置为侦听私有IP地址。

在我们的设置中,MySQL配置包含在另一个目录中的文件中。
打开MySQL配置文件/etc/mysql/my.cnf,以确认存在带有“ /etc/mysql/mysql.conf.d/”的行。
(此文件不执行任何操作,但包括其他目录中的文件。

确保此文件中存在以下行:

!includedir /etc/mysql/mysql.conf.d/

现在我们将编辑文件“ /etc/mysql/mysql.conf.d/mysqld.cnf”。

我们要做的第一件事是使MySQL守护程序能够侦听私有IP地址。
缺省情况下,守护程序将自己与回送IP地址绑定。
(我们也可以使其监听公共IP地址,但是通常不需要直接从Internet访问DB服务器)。
因此,我们更改了这一行:

bind-address = 127.0.0.1

看起来像:

bind-address = 192.168.1.101

确保将此IP地址更改为服务器的IP地址。

我们在另一台MySQL服务器上进行了相同的更改。

检查/etc/mysql/my.cnf:

!includedir /etc/mysql/mysql.conf.d/

并在/etc/mysql/mysql.conf.d/mysqld.cnf中进行更改:

bind-address = 192.168.1.102

步骤3:复制配置

现在我们的MySQL服务器已设置为侦听专用IP地址,是时候在MySQL配置中启用复制了。
让我们从theitroadMasterLeft服务器开始。

在同一配置文件中,查找以下几行:

# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you Jan need to change.
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name

我们需要取消注释这些行,并提及我们将要复制的数据库。
更改后,它将如下所示:

# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you Jan need to change.
server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = theitroaddb
#binlog_ignore_db = include_database_name

由于我们仅复制一个数据库,因此不需要用“ #binlog_ignore_db”取消注释该行。

也可以在其他服务器上theitroadMasterRight进行相应的更改:

# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you Jan need to change.
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = theitroaddb
#binlog_ignore_db = include_database_name

现在,两个服务器上的配置文件都已更改,我们将重新启动MySQL服务:

root@theitroadMasterLeft:~# service mysql restart

在另一台服务器上:

root@theitroadMasterRight:~# service mysql restart

我们可以检查是否已加载配置更改,并且服务器正在侦听正确的IP地址:

root@theitroadMasterLeft:~# netstat -ntpl | grep mysql
tcp 0 0 192.168.1.101:3306 0.0.0.0:* LISTEN 1924/mysqld

root@theitroadMasterRight:~# netstat -ntpl | grep mysql
tcp 0 0 192.168.1.102:3306 0.0.0.0:* LISTEN 1422/mysqld

步骤4:创建复制用户

对于MySQL复制,我们需要创建一个新的复制用户,该用户将对所有数据库具有复制权限。
让我们使用以下MySQL查询创建该用户:

使用以下命令在theitroadMasterLeft服务器上打开MySQL提示符:

root@theitroadMasterLeft:~# mysql -u root -p
Enter password:

提供我们在安装MySQL服务器时选择的密码。
它将在MySQL提示符下将我们放下。
在此提示符下输入以下命令:

mysql> CREATE USER 'theitroadleftuser'@'%' identified by 'replicatepass';
Query OK, 0 rows affected (0.09 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'theitroadleftuser'@'%';
Query OK, 0 rows affected (0.00 sec)

现在,我们在其他服务器theitroadMasterRight上创建类似用户:

mysql> CREATE USER 'theitroadrightuser'@'%' identified by 'replicatepass';
Query OK, 0 rows affected (0.04 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'theitroadrightuser'@'%';
Query OK, 0 rows affected (0.00 sec)

步骤5:在两台服务器上配置MySQL Master:

现在,在最后一步中,我们告诉每个服务器另一个服务器是它要从其同步的主服务器。

步骤5.1:向theitroadMasterRight告知其主人:

首先,我们将检查theitroadMasterLeft服务器的Master状态。
在MySQL提示符下运行以下命令以检查主服务器状态:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1447 | theitroaddb | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

其中我们需要2条信息:文件(mysql-bin.000001)和位置(1447),用于将该服务器设置为theitroadMasterRight的主服务器(以及在上一步中设置的用户名和密码)。

在theitroadMasterRight上运行以下命令,以告诉它theitroadMasterLeft是其主节点:

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CHANGE MASTER TO MASTER_HOST = 'theitroadMasterLeft', MASTER_USER = 'theitroadleftuser', MASTER_PASSWORD = 'replicatepass', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 1447;
Query OK, 0 rows affected, 2 warnings (0.07 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

对另一台服务器重复类似的步骤。

步骤5.2:告知theitroadMasterLeft其主人

在theitroadMasterRight上运行以下命令以检查其主状态:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 621 | theitroaddb | | |
+------------------+----------+--------------+------------------+-------------------+

通过运行以下命令,配置theitroadMasterLeft并告知其主服务器:

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CHANGE MASTER TO MASTER_HOST = 'theitroadMasterRight', MASTER_USER = 'theitroadrightuser', MASTER_PASSWORD = 'replicatepass', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 621;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

就是这样。
ew ...这是很多配置。
现在我们已经完成了很多工作,让我们检查一下我们的配置是否正常。
请注意,下一步是可选的,并且不是MySQL Master-Master复制设置的一部分。

步骤6:测试复制

让我们在theitroadMasterLeft上创建数据库:

mysql> create database theitroaddb;
Query OK, 1 row affected (0.00 sec)

让我们检查一下是否在theitroadMasterRight上创建了该数据库:

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| theitroaddb |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)

现在,我们将从theitroadMasterRight在此数据库中创建一个表,并从其他服务器进行检查。

在theitroadMasterRight上运行以下命令:

mysql> CREATE TABLE theitroaddb.testuser ( id INT, name VARCHAR(20));
Query OK, 0 rows affected (0.40 sec)

让我们从theitroadMasterLeft中检查此表:

mysql> show tables;
+----------------------+
| Tables_in_theitroaddb |
+----------------------+
| testuser |
+----------------------+
1 row in set (0.00 sec)

我们的复制工作正常。

如我们所见,Master-Master Replication只不过是在Master-Slave模式下为彼此配置2台服务器。
在主从配置中,需要确保在从服务器上不执行任何查询(复制查询除外),否则复制会中断。
但是,对于Master-Master复制,查询可以在2个服务器中的任何一个上运行,从而为我们提供了容错和安全的环境。