如何设置MySQL主 - 主复制

第二部分的“缩放Web应用程序”将列出通过两个VPS缩放mysql部署所需的步骤。

简介

第二部分的“缩放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,我们可以通过键入以下内容获得我们的根mysql用户:

mysql -u root -p 

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

mysql> 

一旦我们登录,我们需要运行几个命令。

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

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

接下来,我们需要授予此用户权限以复制我们的mysql数据:

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

不幸的是,复制的权限不能在每个数据库的基础上给出。 我们的用户将只复制我们在配置文件中指定的数据库。

对于初始Server C配置的最后一步,我们需要获取有关当前MySQL实例的一些信息,我们稍后将提供给Server 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

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

sudo apt-get install mysql-server mysql-client

一旦两个软件包正确安装,我们需要配置它与我们配置Server 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的服务器标识不能设置为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 

首先,与在Server C上一样,我们将创建将负责复制的伪用户。 将“password”替换为您要使用的密码。

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 master-master复制之前,我们要做的最后一件事是记录主日志文件和位置,用于在另一个方向(从服务器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上的复制

回到Server 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上运行“show tables”命令将不会显示任何表:

Empty set (0.00 sec)

你有它! 工作mysql master-master复制。 和往常一样,任何反馈都是欢迎。