简介
第二部分的“缩放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复制。 和往常一样,任何反馈都是欢迎。