Репликация 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 спешно настроена.