Репликация баз данных MySQL по типу Master-Master

Published by Leave your thoughts

Репликация MySQL – это процесс, во время которого единый набор данных, хранящийся в БД MySQL, используется несколькими серверами одновременно. Как правило, репликация настраивается по типу master-slave (где есть ведущий и ведомые серверы). Однако репликация по типу master-master (где, условно говоря, все серверы – ведущие) позволяет копировать данные с любого сервера, потому она более производительна. Это тонкое, но очень важное различие позволяет MySQL выполнять операции записи и чтения с любого сервера.

Примечание: В предыдущей статье рассказывается о балансировке нагрузки nginx.

В данном руководстве используется два сервера:

  • Сервер А: 3.3.3.3
  • Сервер Б: 4.4.4.4

1: Установка и настройка MySQL на сервере А

Для начала нужно установить пакеты mysql-server и mysql-client. Для этого введите:

sudo apt-get install mysql-server mysql-client

По умолчанию mysql принимает соединения на локальный хост (127.0.0.1). Чтобы изменить эту и некоторые другие стандартные настройки, необходимые для репликации, отредактируйте /etc/mysql/my.cnf на сервере А. В нём нужно изменить следующие 4 строки, которые на данный момент выглядят так:

#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. Вернитесь в оболочку и откройте сессию root-пользователя mysql:

mysql -u root -p

Примечание: При этом программа запросит root-пароль mysql (не root-пароль сервера).

После успешной авторизации командная строка будет выглядеть так:

mysql>

Теперь нужно запустить несколько команд.

Создайте псевдопользователя, который будет использоваться для репликации данных между серверами. В данном руководстве этот пользователь будет называться replicator (замените это условное имя и слово password соответствующими данными).

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

Затем нужно дать этому пользователю права на репликацию данных:

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

К сожалению, права на репликацию выдаются глобально (а не индивидуально для каждой отдельной БД). Чтобы объяснить пользователю, какие БД нужно дублировать, используется отдельный конфигурационный файл.

В завершение нужно получить некоторые сведения о текущем экземпляре MySQL, которые позже нужно предоставить серверу Б. Для этого запустите команду:

show master status;

На экране появится подобный вывод:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 | example      |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Запишите данные File и Position, они понадобятся в дальнейшем.

2: Установка и настройка MySQL на сервере Б

Теперь нужно повторить те же действия на втором сервере. Установите все необходимые пакеты:

sudo apt-get install mysql-server mysql-client

После этого отредактируйте файл /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

Эти строки должны выглядеть следующим образом (пожалуйста, обратите внимание: сервер Б не может содержать в настройках 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

Сначала, как и на сервере А, нужно создать пользователя для выполнения репликации.

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

Примечание: Не забудьте заменить условные данные в команде своими данными.

Затем создайте БД, которая будет дублирована:

create database example;

Теперь передайте права на репликацию БД ранее созданному пользователю.

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

Чтобы запустить репликацию, необходимо предоставить серверу Б информацию о сервере А (которая была записана ранее). Введите:

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 могут отличаться; скопируйте значения, полученные при помощи команды show master status на сервере А.

Последнее, что нужно сделать в настройке репликации по типу master-master, — записать значения File и Position сервера Б.

Для этого используйте команду:

SHOW MASTER STATUS;

На экране появится результат:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      107 | example      |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Запишите эти значения, в дальнейшем их нужно будет передать серверу А.

3: Завершение репликации

Вернитесь на сервер А и завершите настройку при помощи командной строки. запустите:

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 своим паролем, установленным для пользователя replicator.

Результат будет выглядеть примерно так:

Query OK, 0 rows affected (0.01 sec)

Осталось только убедиться в том, что все настройки работают должным образом.

4: Тестирование репликации Master-Master

Теперь серверы настроены и готовы к репликации данных. Чтобы протестировать репликацию, создайте таблицу в тестовой БД. Эта таблица должна появиться на обоих серверах. Также таблица должна исчезнуть на обоих серверах после удаления.

На сервере А создайте БД example, которая будет дублирована между серверами. В оболочке mysql запустите:

create database example;

Затем создайте тестовую таблицу (условно назовём её test):

create table example.test (`id` varchar(10));

Проверьте, появилась ли БД и таблица на сервере Б:

show tables in example;

На экране должен появиться прмерно такой вывод:

+-------------------+
| Tables_in_example |
+-------------------+
| test              |
+-------------------+
1 row in set (0.00 sec)

Теперь попробуйте удалить тестовую таблицу на сервере Б. Она должна исчезнуть и на сервере А.

На сервере Б запустите:

DROP TABLE test;

Теперь команда show tables на сервере А должна вернуть следующее:

Empty set (0.00 sec)

Готово! Репликация данных mysql по типу master-master спешно настроена.

Tags:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>