Как настроить репликацию MySQL Master-Master
Статус: устарело
Этот учебник устарел и больше не поддерживается.
Причина:
Смотрите вместо этого:
вступление
В этом втором выпуске «Масштабирование веб-приложений» перечислены шаги, необходимые для масштабирования развертывания mysql на двух VPS.
В первой статье этой серии изложены шаги, необходимые для балансировки нагрузки nginx на двух VPS, и рекомендуется сначала прочитать эту статью.
Репликация MySQL — это процесс, посредством которого один набор данных, хранящийся в базе данных MySQL, будет скопирован на второй сервер в режиме реального времени. Эта конфигурация, называемая репликацией «главный-ведомый», является типичной. Наша конфигурация будет лучше, поскольку репликация «главный-главный» позволяет копировать данные с одного сервера на другой. Это тонкое, но важное отличие позволяет нам для выполнения чтения или записи mysql с любого сервера.Эта конфигурация добавляет избыточность и повышает эффективность при доступе к данным.
Примеры в этой статье будут основаны на двух VPS с именами Server C и Server D.
Сервер C: 3.3.3.3
Сервер D: 4.4.4.4
Шаг 1. Установите и настройте MySQL на сервере C.
Первое, что нам нужно сделать, это установить пакеты mysql-server и mysql-client на наш сервер. Мы можем сделать это, набрав следующее:
sudo apt-get install mysql-server mysql-client
По умолчанию процесс mysql будет принимать соединения только на локальном хосте (127.0.0.1). Чтобы изменить это поведение по умолчанию и изменить несколько других параметров, необходимых для правильной работы репликации, нам нужно отредактировать /etc/mysql/my.cnf на сервере C. Нам нужно изменить четыре строки, которые в настоящее время установлены на следующий:
#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. Вернувшись в нашу оболочку, мы можем получить доступ к нашему корневому пользователю mysql, набрав следующее:
mysql -u root -p
Обратите внимание, что эта команда запросит у вас пароль пользователя root mysql, а не пользователя root в нашей капле. Чтобы подтвердить, что вы вошли в оболочку mysql, приглашение должно выглядеть следующим образом.
mysql>
После входа в систему нам нужно выполнить несколько команд.
Нам нужно создать псевдо-пользователя, который будет использоваться для репликации данных между двумя нашими VPS. В примерах в этой статье предполагается, что вы называете этого пользователя «репликатор». Замените «пароль» на пароль, который вы хотите использовать для репликации.
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. Установите и настройте MySQL на сервере D.
Нам нужно повторить те же шаги, которые мы выполнили на сервере 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 не может быть установлен равным 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 и установить дополнительные параметры конфигурации.
mysql -u root -p
Во-первых, как и на сервере C, мы собираемся создать псевдо-пользователя, который будет отвечать за репликацию. Замените \пароль на пароль, который вы хотите использовать.
create user 'replicator'@'%' identified by 'password';
Далее нам нужно создать базу данных, которую мы собираемся реплицировать на нашем VPS.
create database example;
И нам нужно дать нашему вновь созданному пользователю «репликации» разрешения на его репликацию.
grant replication slave on *.* to 'replicator'@'%';
Следующий шаг включает в себя получение информации, которую мы приняли к сведению ранее, и применение ее к нашему экземпляру mysql. Это позволит начать репликацию. Следующее должно быть напечатано в оболочке mysql:
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 могут отличаться от приведенных выше. Вы должны скопировать значения, которые \SHOW MASTER STATUS возвращает на сервере C.
Последнее, что нам нужно сделать, прежде чем мы завершим репликацию 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
Вернувшись на сервер 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:
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;
Чтобы убедиться в этом, запустив команду «show table» на сервере C, таблицы не будут отображаться:
Empty set (0.00 sec)
И вот оно! Рабочая репликация mysql master-master. Как всегда, любые отзывы более чем приветствуются.