И так для себя хочу разобрать как сделать/настраивается связь двух серверов и баз MySQL в режиме: мастер <=> мастер
для этого мне понадобится две системы с осью на борту Ubuntu 14.04.3 Server amd64, где каждую систему нужно обновить до самого актуального состояния и установить пакеты: mysql-server & mysql-client:
aollo@system:~> ssh -l ekzorchik 10.7.8.143
ekzorchik@srv-glpi:~$ sudo apt-get update && sudo apt-get upgrade -y
ekzorchik@srv-glpi:~$ sudo apt-get install mysql-server mysql-client -y
New password for the MySQL “root” user:712mbddr@
Repeat password for the MySQL “root” user: 712mbddr@
aollo@system:~> ssh -l ekzorchik 10.7.8.155
ekzorchik@srv-server:~$ sudo apt-get update && sudo apt-get upgrade -y
ekzorchik@srv-server:~$ sudo apt-get install mysql-server mysql-client -y
New password for the MySQL “root” user: 712mbddr@
Repeat password for the MySQL “root” user: 712mbddr@
После на каждом сервере где развернута база данных MySQL добавим/изменим конфигурационный файл /etc/mysql/my.cnf
ekzorchik@srv-glpi:~$ sudo nano /etc/mysql/my.cnf
# уникальный ID сервера, участвующий в рассматриваемой заметки по части Master <=> Master
server-id = 1
# путь к файлу журнала и индекса репликации для зеркала
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
# путь к файлам журнала изменений, полученных с зеркала
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
expire_logs_days = 10
max_binlog_size = 100M
# чтобы не было конфликтов автоинкремента, говорим серверу,
# чтобы айдишники он генерил начиная с 1го прибавляя по 2,
# например 1, 3, 5, 7… Зеркало будет генерить 2, 4, 6, 8…
auto-increment-increment = 2
auto-increment-offset = 1
# указываем базу данных содержимое которой будет реплицировать с одного сервера на другой.
binlog_do_db = owncloud
bind-address = 10.7.8.143
ekzorchik@srv-glpi:~$ sudo service mysql restart
[sudo] password for ekzorchik:
mysql stop/waiting
mysql start/running, process 5058
ekzorchik@srv-server:~$ sudo nano /etc/mysql/my.cnf
# уникальный ID сервера, участвующий в рассматриваемой заметки по части Master <=> Master
server-id = 2
# путь к файлу журнала и индекса репликации для зеркала
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
# путь к файлам журнала изменений, полученных с зеркала
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
expire_logs_days = 10
max_binlog_size = 100M
# чтобы не было конфликтов автоинкремента, говорим серверу,
# чтобы айдишники он генерил начиная с 1го прибавляя по 2,
# например 1, 3, 5, 7… Зеркало будет генерить 2, 4, 6, 8…
auto-increment-increment = 2
auto-increment-offset = 1
# указываем базу данных содержимое которой будет реплицировать с одного сервера на другой.
binlog_do_db = owncloud
bind-address = 10.7.8.155
ekzorchik@srv-server:~$ sudo service mysql restart
mysql stop/waiting
mysql start/running, process 4931
После на каждой ноде сервера создадим специального пользователя в базе mysql ответственного за репликацию:
ekzorchik@srv-glpi:~$ mysql -u root -p712mbddr@
mysql> create user 'replicator'@'%' identified by '612mbddr@';
mysql> grant replication slave on *.* to 'replicator'@'%';
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
# создаем базу данных owncloud
mysql> create database owncloud;
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
ekzorchik@srv-server:~$ mysql -u root -p712mbddr@;
mysql> create user 'replicator'@'%' identified by '612mbddr@';
mysql> grant replication slave on *.* to 'replicator'@'%';
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
# создаем базу данных owncloud
mysql> create database owncloud;
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
После с каждого сервера проверяем, что можем под созданным пользователем replication подключиться:
ekzorchik@srv-server:~$ mysql -ureplication -p612mbddr@ -h 10.7.8.143 -P 3306
успешно
ekzorchik@srv-glpi:~$ mysql -ureplication -p612mbddr@ -h 10.7.8.155 -P 3306
успешно
Теперь на сервере srv-glpi создаем запрос – а кто сейчас в статусе master:
ekzorchik@srv-glpi:~$ mysql -u root -p712mbddr@
mysql> show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000004 | 354 | owncloud | |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
mysql> quit
Bye
Отлично, теперь повторяем все тоже самое на сервере srv-server:
ekzorchik@srv-server:~$ mysql -u root -p712mbddr@
mysql> show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000004 | 354 | owncloud | |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
Теперь из этих двух выводов статуса Мастер мне понадобятся следующие значения, а именно наименование файла и позиция (все эти значения должны быть одинаковыми):
File = mysql-bin.000004
Position = 354
Binlog_Do_DB = owncloud
Результат идентичный, все хорошо.
После включаю репликацию на втором сервере (server-id = 2) , для этого мне понадобятся такие данные как информация о позиции и название лог файла:
mysql> slave stop;
Query OK, 0 rows affected (0.02 sec)
mysql> change master to master_host = '10.7.8.143', master_user ='replicator',master_password='612mbddr@',master_log_file='mysql-bin.000004',master_log_pos =354;
Query OK, 0 rows affected (0.03 sec)
mysql> slave start;
также точно такие же действия нужно выполнить на первом сервере (server-id = 1) только указать IP адрес второго сервера:
mysql> slave stop;
Query OK, 0 rows affected (0.02 sec)
mysql> change master to master_host = '10.7.8.155', master_user ='replicator',master_password='612mbddr@',master_log_file='mysql-bin.000004',master_log_pos =354;
Query OK, 0 rows affected (0.02 sec)
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
Теперь как все настроили, нужно проверить – без проверки никуда, для это имеет смысл создать внутри базы данных owncloud какие-либо таблицы, вообщем наполнить содержимым и посмотреть, отобразилось ли содержимое на другом сервере:
# server-id = 1
mysql> use owncloud;
Database changed
mysql> CREATE TABLE authors (id INT, name VARCHAR(20), email VARCHAR(20));
Query OK, 0 rows affected (0.01 sec)
Смотрим, что на втором сервере (server-id = 2):
mysql> show tables;
+——————–+
| Tables_in_owncloud |
+——————–+
| authors |
+——————–+
1 row in set (0.00 sec)
Отлично работает. У меня получилось разобрать в рамках этой заметки, как же все таки сделать много раз виденную и используемую репликацию Master <=> Master. Подытожу: чтобы настроить данную репликацю нужно знать уникальный идентификатор (position) и именование файла. Данная заметка писалась в ходе моего опыта по повышению квалификации, ею я не претендую на полное развертывание материала репликации – я учусь, и все что я буду для себя узнавать буду публиковать на своем блоге. На этом все, с уважением, автор блога – ekzorchik.