Есть вопросы?
Закажите звонок специалиста!
Есть вопросы?
Закажите звонок специалиста!
В MySQL существуют два типа репликации данных:
В данной статье мы рассмотрим репликацию Master-Master. При данной репликации данные, попавшие на тот или иной сервер в кластере будут реплицированы между собой.
Тестовый стенд:
Разделим процесс настройки репликации Master-Master на 2 этапа:
Установку MySQL мы рассматривали в данной статье, поэтому этот этап мы не будем рассматривать.
На двух серверах поднят MySQL. Первым делом нам необходимо провести редактирование файла my.cnf на каждом сервере.
Сервер Master_1 (192.168.15.2)
# mcedit /etc/mysql/my.cnf
В открывшимся файле приводим всё к данному виду:
[mysqld] #Уникальный идентификатор сервера server-id = 1 #Логи ошибок log_error = /var/log/mysql/mysql.err #Путь к bin-логам сервера(бин-лог, который заполняет мастер) log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index #Путь к relay-логам слейва (бин-лог, скачанный с мастера) relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index #БД, которые нужно/не нужно реплицировать #replicate-do-db = testdb replicate-ignore-db=information_schema replicate-ignore-db=mysql replicate-ignore-db=performance_schema #Не вести журнал бин-лога для БД binlog-ignore-db = information_schema binlog-ignore-db = mysql binlog-ignore-db = performance_schema #Чтобы не было конфликтов автоматического инкремента, сообщаем серверу, #чтобы id генерировались начиная с 1-го прибавляя по 2, # например 13, 23, 33, 43... auto_increment_increment = 2 auto_increment_offset = 1 #Сохранять логи с мастера в свой бин-лог, чтобы передать слейв-серверу log-slave-updates #log_slave_updates = 1 # Сколько дней хранить бин-логи expire_logs_days = 7 # Максимальный размер бин-лога max_binlog_size = 500M # Адрес 1-го мастера bind-address = 192.168.15.2
Далее создаем пользователя для репликации:
mysql> create user 'replica'@'%' identified by '%repl2021'; Query OK, 0 rows affected (0.00 sec) mysql> grant replication slave on *.* to 'replica'@'%'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> exit
Указываем IP адрес для пользователя репликации:
# create user 'replica'@'192.168.15.2' identified by '%repl2021'; # GRANT REPLICATION SLAVE ON *.* TO 'replica'@'192.168.15.2' IDENTIFIED BY '%repl2021';
Производим перезапуск MySQL сервера:
# service mysql restart
Первый Master-сервер развернут.
Проверяем статус созданного нами мастер сервера:
mysql> show master status; +------------------+----------+--------------+---------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+---------------------------------------------+ | mysql-bin.000002 | 107 | | information_schema,mysql,performance_schema | +------------------+----------+--------------+---------------------------------------------+ 1 row in set (0.00 sec) mysql>
Далее переходим ко второму серверу Master_2 (192.168.15.3):
#mcedit /etc/my.cnf
Редактируем файл аналогичным образом, как в конфиге ниже:
#Уникальный идентификатор сервера server-id = 2 #Логи ошибок log_error = /var/log/mysql/mysql.err #Путь к bin-логам сервера(бин-лог, который заполняеи мастер) log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index #Путь к relay-логам слейва (бин-лог, скачанный с мастера) relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index #БД, которые нужно/не нужно реплицировать #replicate-do-db = testdb replicate-ignore-db=information_schema replicate-ignore-db=mysql replicate-ignore-db=performance_schema #Не вести журнал бин-лога для БД binlog-ignore-db = information_schema binlog-ignore-db = mysql binlog-ignore-db = performance_schema #Чтобы не было конфликтов автоинкремента, говорим серверу, #чтобы id генерировались начиная с 2-го прибавляя по 2, # например 13, 23, 33, 43... auto_increment_increment = 2 auto_increment_offset = 2 #Сохранять логи с мастера в своий бин-лог, чтобы передать слейву log-slave-updates #log_slave_updates = 1 # Сколько дней хранить бин-логи expire_logs_days = 7 # Максимальный размер бин-лога max_binlog_size = 500M # Адрес 2-го мастера bind-address = 192.168.15.3
На данном этапе создаем папку и файлы, куда будут записываться логи):
# mkdir /var/log/mysql # chown -R mysql. /var/log/mysql
mysql> create user 'replica'@'%' identified by '%repl2021'; Query OK, 0 rows affected (0.00 sec) mysql> grant replication slave on *.* to 'replica'@'%'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> exit
Перезапускаем MySQL сервер:
# service mysql restart
На данном этапе мы настраиваем непосредственно репликацию. Запускаем репликацию на втором сервере (Master_2). Для того, чтобы это сделать нам необходимо узнать MASTER_LOG_FILE и MASTER_LOG_POS на первом сервере (Master_1).
Статус мастера на сервере Master_1
# mysql -u root -p -e 'show master status;'
Вывод команды:
+------------------+----------+--------------+---------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+---------------------------------------------+ | mysql-bin.000002 | 107 | | information_schema,mysql,performance_schema | +------------------+----------+--------------+---------------------------------------------+ 1 row in set (0.00 sec)
Обратим внимание, что MASTER_LOG_FILE это mysql-bin.000002, а MASTER_LOG_POS равен 107.
На втором сервере (Master_2) выполняем:
mysql> slave stop; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CHANGE MASTER TO MASTER_HOST = '192.168.15.2', MASTER_USER = 'replica', MASTER_PASSWORD = '%repl2021', MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 107; Query OK, 0 rows affected (0.02 sec) mysql> slave start; Query OK, 0 rows affected (0.00 sec) mysql>
Далее производим репликацию на 1-ом сервере. Для этого нужно посмотреть статус мастера на Master_2 сервере:
mysql> SHOW MASTER STATUS; +------------------+----------+--------------+---------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+---------------------------------------------+ | mysql-bin.000002 | 106 | | information_schema,mysql,performance_schema | +------------------+----------+--------------+---------------------------------------------+ 1 row in set (0.00 sec) mysql>
Обратим внимание, что MASTER_LOG_FILE это mysql-bin.000002, а MASTER_LOG_POS равен 106.
На сервере Master_1 выполняем команду:
mysql> slave stop; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> CHANGE MASTER TO MASTER_HOST = '192.168.15.3', MASTER_USER = 'replica', MASTER_PASSWORD = '%repl2021', MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106; Query OK, 0 rows affected (0.03 sec) mysql> slave start; Query OK, 0 rows affected (0.00 sec) mysql>
После всех действий просматриваем статус слейва на всех мастер-серверах:
Master_1
mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.15.3 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 106 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 252 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: information_schema,mysql,performance_schema Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 106 Relay_Log_Space: 408 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 2 1 row in set (0.00 sec) ERROR: No query specified mysql>
Master_2
mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.15.2 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 107 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 252 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: information_schema,mysql,performance_schema Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 407 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec) ERROR: No query specified mysql>
Кластер из двух мастер-серверов готов.