如何设置MySQL主-主复制

来自菜鸟教程
跳转至:导航、​搜索

状态: 已弃用

本教程已被弃用,不再维护。

原因: 本教程介绍了一种构建多主拓扑的过时方法。 在本文最初发表时,组复制尚未在 MySQL 中实现。

参见: 你可以阅读较新的 How To Configure MySQL Group Replication on Ubuntu 16.04 教程来设置多主复制组。


介绍

“扩展 Web 应用程序”的第二部分将列出在两个 VPS 上扩展 mysql 部署所需的步骤。

本系列的第一篇文章介绍了在两个 VPS 上负载均衡 nginx 所需的步骤,建议您先阅读 那篇文章

MySQL 复制是将存储在 MySQL 数据库中的单个数据集实时复制到第二台服务器的过程。 这种配置称为“主从”复制,是一种典型设置。 我们的设置会比这更好,因为主-主复制允许将数据从任一服务器复制到另一台服务器。 这个微妙但重要的区别允许我们从任一服务器执行 mysql 读取或写入。 此配置在处理访问数据时增加了冗余并提高了效率。

本文中的示例将基于两个 VPS,名为 Server C 和 Server D。

服务器 C:3.3.3.3

服务器 D:4.4.4.4

第 1 步 - 在服务器 C 上安装和配置 MySQL

我们需要做的第一件事是在我们的服务器上安装 mysql-server 和 mysql-client 包。 我们可以通过键入以下内容来做到这一点:

sudo apt-get install mysql-server mysql-client

默认情况下,mysql 进程只接受 localhost (127.0.0.1) 上的连接。 要更改此默认行为并更改复制正常工作所需的一些其他设置,我们需要编辑服务器 C 上的 /etc/mysql/my.cnf。 我们需要更改四行,目前设置如下:

#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
#binlog_do_db           = include_database_name
bind-address            = 127.0.0.1

这些行中的第一行是在我们的复制配置中唯一标识我们的特定服务器。 我们需要取消注释该行,删除它前面的“#”。 第二行指示将记录对任何 mysql 数据库或表的更改的文件。

第三行指示我们想要在我们的服务器之间复制哪些数据库。 您可以根据需要向该行添加任意数量的数据库。 为简单起见,本文将使用一个名为“example”的数据库。 最后一行告诉我们的服务器接受来自互联网的连接(不监听 127.0.0.1)。

server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
binlog_do_db            = example
# bind-address            = 127.0.0.1

现在我们需要重启mysql:

sudo service mysql restart

接下来,我们需要更改 mysql 实例中的一些命令行设置。 回到我们的 shell,我们可以通过键入以下内容来访问我们的 root mysql 用户:

mysql -u root -p 

请注意,此命令将提示您输入的密码是 root mysql 用户的密码,而不是我们 droplet 上的 root 用户的密码。 要确认您已登录到 mysql shell,提示符应如下所示。

mysql> 

登录后,我们需要运行一些命令。

我们需要创建一个伪用户,用于在我们的两个 VPS 之间复制数据。 本文中的示例将假定您将此用户命名为“replicator”。 将“password”替换为您希望用于复制的密码。

create user 'replicator'@'%' identified by 'password'; 

接下来,我们需要给这个用户权限来复制我们的mysql数据:

grant replication slave on *.* to 'replicator'@'%'; 

遗憾的是,不能在每个数据库的基础上授予复制权限。 我们的用户只会复制我们在配置文件中指示它的数据库。

对于初始服务器 C 配置的最后一步,我们需要获取有关当前 MySQL 实例的一些信息,我们稍后将提供给服务器 D。

以下命令将输出一些重要信息,我们需要注意:

show master status; 

输出将类似于以下内容,并且将包含两条关键信息:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 | example      |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

我们需要记下将在下一步中使用的文件和位置。

第 2 步 - 在服务器 D 上安装和配置 MySQL

我们需要重复在服务器 C 上执行的相同步骤。 首先我们需要安装它,我们可以使用以下命令来完成:

sudo apt-get install mysql-server mysql-client

正确安装这两个包后,我们需要以与配置服务器 C 大致相同的方式对其进行配置。 我们将从编辑 /etc/mysql/my.cnf 文件开始。

sudo nano /etc/mysql/my.cnf

我们需要更改配置文件中与之前更改相同的四行。

下面列出了默认值,然后是我们需要进行的更改。

#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
#binlog_do_db           = include_database_name
bind-address            = 127.0.0.1

我们需要更改这四行以匹配下面的行。 请注意,与服务器 C 不同,服务器 D 的服务器 ID 不能设置为 1。

server-id              = 2
log_bin                = /var/log/mysql/mysql-bin.log
binlog_do_db           = example
# bind-address            = 127.0.0.1

保存并退出该文件后,您需要重新启动 mysql:

sudo service mysql restart

是时候进入 mysql shell 并设置更多配置选项了。

mysql -u root -p 

首先,就像在服务器 C 上一样,我们将创建负责复制的伪用户。 将“密码”替换为您希望使用的密码。

create user 'replicator'@'%' identified by 'password'; 

接下来,我们需要创建要在 VPS 中复制的数据库。

create database example; 

我们需要给我们新创建的“复制”用户权限来复制它。

grant replication slave on *.* to 'replicator'@'%'; 

下一步涉及获取我们之前记下的信息并将其应用于我们的 mysql 实例。 这将允许开始复制。 应在 mysql shell 中键入以下内容:

slave stop; 
CHANGE MASTER TO MASTER_HOST = '3.3.3.3', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 107; 
slave start; 

您需要将“密码”替换为您为复制选择的密码。 MASTER_LOG_FILE 和 MASTER_LOG_POS 的值可能与上述不同。 您应该复制服务器 C 上“SHOW MASTER STATUS”返回的值。

在完成 mysql 主-主复制之前,我们要做的最后一件事是记下主日志文件和位置,以用于在另一个方向(从服务器 D 到服务器 C)进行复制。

我们可以通过键入以下内容来做到这一点:

SHOW MASTER STATUS; 

输出将类似于以下内容:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      107 | example      |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

记下文件和位置,因为我们必须在服务器 C 上输入这些文件和位置,才能完成双向复制。

下一步将解释如何做到这一点。

步骤 3 - 在服务器 C 上完成复制

回到服务器 C,我们需要在命令行上完成复制配置。 运行此命令将复制服务器 D 中的所有数据。

slave stop; 
CHANGE MASTER TO MASTER_HOST = '4.4.4.4', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000004', MASTER_LOG_POS = 107; 
slave start; 

请记住,您的值可能与上述值不同。 还请将 MASTER_PASSWORD 的值替换为您在设置复制用户时创建的密码。

输出将类似于以下内容:

Query OK, 0 rows affected (0.01 sec)

最后要做的是测试复制是否在两个 VPS 上工作。 最后一步将解释测试此配置的简单方法。

第 4 步 - 测试 Master-Master 复制

现在已经设置了所有配置,我们现在将对其进行测试。 为此,我们将在服务器 C 上的示例数据库中创建一个表,并检查服务器 D 以查看它是否显示。 然后,我们将从服务器 D 中删除它,并确保它不再出现在服务器 C 上。

我们现在需要创建将在服务器之间复制的数据库。 我们可以通过在 mysql shell 中键入以下内容来做到这一点:

create database example; 

完成后,让我们在服务器 C 上创建一个虚拟表:

create table example.dummy (`id` varchar(10)); 

我们现在要检查服务器 D 以查看我们的表是否存在。

show tables in example; 

我们应该看到类似于以下的输出:

+-------------------+
| Tables_in_example |
+-------------------+
| dummy             |
+-------------------+
1 row in set (0.00 sec)

最后要做的测试是从服务器 D 中删除我们的虚拟表。 它也应该从服务器 C 中删除。

我们可以通过在服务器 D 上输入以下内容来做到这一点:

DROP TABLE dummy; 

为了确认这一点,在服务器 C 上运行“show tables”命令将不显示任何表:

Empty set (0.00 sec)

你有它! 工作 mysql 主-主复制。 与往常一样,任何反馈都非常受欢迎。