如何设置 MySQL 主主复制

2023-11-05

Status:已弃用

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

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

请参阅:您可以阅读最新的如何在 Ubuntu 16.04 上配置 MySQL 组复制设置多主复制组的教程。

Intro

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

本系列的第一篇文章列出了在两个 VPS 上对 nginx 进行负载平衡所需的步骤,建议您阅读那篇文章 first.

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

本文中的示例将基于两个 VPS,名为服务器 C 和服务器 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 进程仅接受本地主机 (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 的 server-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; 

您需要将“password”替换为您选择用于复制的密码。您的 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 步 - 测试主主复制

现在已经设置了所有配置,我们现在要对其进行测试。为此,我们将在服务器 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 上运行“showtables”命令将不会显示任何表:

Empty set (0.00 sec)

现在你就拥有了!工作 mysql 主主复制。一如既往,我们非常欢迎任何反馈。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何设置 MySQL 主主复制 的相关文章