本教程已被弃用并且不再维护。
Reason:本教程介绍了构建多主拓扑的过时方法。在本文最初发表时,MySQL 中尚未实现组复制。
请参阅:您可以阅读最新的如何在 Ubuntu 16.04 上配置 MySQL 组复制设置多主复制组的教程。
“扩展 Web 应用程序”的第二部分将列出在两个 VPS 上扩展 mysql 部署所需的步骤。
本系列的第一篇文章列出了在两个 VPS 上对 nginx 进行负载平衡所需的步骤,建议您阅读那篇文章 first.
MySQL 复制是将存储在 MySQL 数据库中的单个数据集实时复制到第二台服务器的过程。这种配置称为“主从”复制,是一种典型的设置。我们的设置会比这更好,因为主主复制允许将数据从任一服务器复制到另一服务器。这种微妙但重要的区别允许我们从任一服务器执行 mysql 读取或写入。此配置在处理访问数据时增加了冗余并提高了效率。
本文中的示例将基于两个 VPS,名为服务器 C 和服务器 D。
服务器C:3.3.3.3
服务器D:4.4.4.4
我们需要做的第一件事是在我们的服务器上安装 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)
我们需要记下下一步将使用的文件和位置。
我们需要重复在服务器 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 上的文件和位置,才能完成双向复制。
下一步将解释如何做到这一点。
回到服务器 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 上正常工作。最后一步将解释测试此配置的简单方法。
现在已经设置了所有配置,我们现在要对其进行测试。为此,我们将在服务器 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 主主复制。一如既往,我们非常欢迎任何反馈。