Поиск по сайту:

Как настроить репликацию 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. Как всегда, любые отзывы более чем приветствуются.