Репликация MYSQL-сервера — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
(Новая страница: «Будем настраивать репликацию Percona-MYSQL-5.7 сервера на Debian Stretch. Тип репликации будет master-slave.»)
 
Строка 1: Строка 1:
Будем настраивать репликацию Percona-MYSQL-5.7 сервера на Debian Stretch. Тип репликации будет master-slave.
+
Будем настраивать репликацию Percona-MYSQL-5.7 сервера с помощью Percona XtraBackup на Debian Stretch. Тип репликации будет master-slave.
 +
 
 +
 
 +
'''1. Конфигурим Master'''
 +
 
 +
Рихтуем конфиг под репликацию и перегружаем mysql
 +
server_id                = 1
 +
log_bin                  = /var/log/mysql/binlog_sip01-ett
 +
log_bin_index            = /var/log/mysql/binlog_sip01-ett.index
 +
binlog_format            = row
 +
log_slave_updates        = false
 +
expire_logs_days          = 14
 +
max_binlog_size          = 256M
 +
max_binlog_files          = 25
 +
binlog_cache_size        = 32K
 +
relay_log                = /var/log/mysql/relaylog_sip01-ett
 +
sync_binlog              = 0
 +
slave_compressed_protocol = 0
 +
 
 +
Заводим пользователя для репликации
 +
mysql> GRANT REPLICATION SLAVE ON *.*  TO 'repl'@'%' IDENTIFIED BY 'repl_pass';
 +
 
 +
Проверяем привилегии
 +
mysql> SHOW GRANTS;
 +
 
 +
 
 +
'''2. Делаем бекап Master и подготавливаем его'''
 +
master# xtrabackup --backup --user=user --password=pass --target-dir=/tmp/backupdir
 +
xtrabackup: completed OK!
 +
 
 +
master$ xtrabackup --user=user --password=pass --prepare --target-dir=/tmp/backupdir
 +
 
 +
 
 +
'''3. Копируем бекап на Slave'''
 +
master# rsync -avpP -e ssh /tmp/backupdir slave:/tmp/backup_mysql/
 +
 
 +
После копирования переносим куда-нибудь оригинальную папку с данными mysql, если slave свежеустановленный, можно просто грохнуть.
 +
slave# mv /var/lib/mysql/ /tmp/datadir_backup
 +
 
 +
Переносим бекап в рабочую папку mysql
 +
slave# xtrabackup --move-back --target-dir=/tmp/backupdir
 +
 
 +
Выставляем права
 +
slave# chown mysql:mysql /var/lib/mysql
 +
 
 +
 
 +
'''4. Конфигурим Slave'''
 +
 
 +
Забираем /root/.my.cnf с мастер, ибо пароль рута изменится. Рихтуем конфиг под репликацию и перегружаем mysql
 +
server_id                = 2
 +
log_bin                  = /var/log/mysql/binlog_slave
 +
log_bin_index            = /var/log/mysql/binlog_slave.index
 +
binlog_format            = row
 +
log_slave_updates        = false
 +
expire_logs_days          = 14
 +
max_binlog_size          = 256M
 +
max_binlog_files          = 25
 +
binlog_cache_size        = 32K
 +
relay_log                = /var/log/mysql/relaylog-slave
 +
sync_binlog              = 0
 +
slave_compressed_protocol = 0
 +
 
 +
Смотрим имя бинлога и позицию
 +
slave$ cat /tmp/backupdir/xtrabackup_binlog_info
 +
master-bin.000001    481
 +
 
 +
'''5. Запускаем репликацию'''
 +
mysql> CHANGE MASTER TO MASTER_HOST='master-server-ip', MASTER_USER='repl', MASTER_PASSWORD='repl_pass', MASTER_LOG_FILE='value', MASTER_LOG_POS=value;
 +
mysql> START SLAVE;
 +
 
 +
Проверяем статус на slave
 +
mysql> SHOW SLAVE STATUS \G
 +
 
 +
Если всё хорошо, Last_Error должен быть пустой, Slave_IO_State - “Waiting for master to send event”.
 +
Seconds_Behind_Master - время отставания реплики от мастера
 +
 
 +
Статус на master
 +
mysql> SHOW MASTER STATUS;
 +
 
 +
 
 +
'''Распространенные ошибки'''
 +
 
 +
Ошибка: ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
 +
Решение:
 +
mysql> reset slave;
 +
Query OK, 0 rows affected (0.00 sec)
 +
 
 +
mysql> CHANGE MASTER TO MASTER_HOST='master-server-ip', MASTER_USER='repl_user', MASTER_PASSWORD='repl_user', MASTER_LOG_FILE='value', MASTER_LOG_POS=value, MASTER_CONNECT_RETRY=10;
 +
Query OK, 0 rows affected, 2 warnings (0.05 sec)
 +
 
 +
mysql> start slave;
 +
 
 +
 
 +
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
 +
 
 +
Server UUIDs is automatically generated but it was copied when I cloned mysql instance using AWS AMI
 +
/var/lib/mysql# cat /var/lib/mysql/auto.cnf
 +
[auto]
 +
server-uuid=fea4e713-9552-11e6-a093-06a1a5e379d3
 +
 
 +
Удаляем auto.conf и рестартим mysql.
 +
 
 +
 
 +
Sometimes errors occur in replication. For example, if you accidentally change a row of data on your slave. If this happens, fix the data, then run:
 +
mysql> STOP SLAVE;SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE;

Версия 12:13, 9 сентября 2019

Будем настраивать репликацию Percona-MYSQL-5.7 сервера с помощью Percona XtraBackup на Debian Stretch. Тип репликации будет master-slave.


1. Конфигурим Master

Рихтуем конфиг под репликацию и перегружаем mysql

server_id                 = 1
log_bin                   = /var/log/mysql/binlog_sip01-ett
log_bin_index             = /var/log/mysql/binlog_sip01-ett.index
binlog_format             = row
log_slave_updates         = false
expire_logs_days          = 14
max_binlog_size           = 256M
max_binlog_files          = 25
binlog_cache_size         = 32K
relay_log                 = /var/log/mysql/relaylog_sip01-ett
sync_binlog               = 0
slave_compressed_protocol = 0

Заводим пользователя для репликации

mysql> GRANT REPLICATION SLAVE ON *.*  TO 'repl'@'%' IDENTIFIED BY 'repl_pass';

Проверяем привилегии

mysql> SHOW GRANTS;


2. Делаем бекап Master и подготавливаем его

master# xtrabackup --backup --user=user --password=pass --target-dir=/tmp/backupdir
xtrabackup: completed OK!
master$ xtrabackup --user=user --password=pass --prepare --target-dir=/tmp/backupdir


3. Копируем бекап на Slave

master# rsync -avpP -e ssh /tmp/backupdir slave:/tmp/backup_mysql/

После копирования переносим куда-нибудь оригинальную папку с данными mysql, если slave свежеустановленный, можно просто грохнуть.

slave# mv /var/lib/mysql/ /tmp/datadir_backup

Переносим бекап в рабочую папку mysql

slave# xtrabackup --move-back --target-dir=/tmp/backupdir

Выставляем права

slave# chown mysql:mysql /var/lib/mysql


4. Конфигурим Slave

Забираем /root/.my.cnf с мастер, ибо пароль рута изменится. Рихтуем конфиг под репликацию и перегружаем mysql

server_id                 = 2
log_bin                   = /var/log/mysql/binlog_slave
log_bin_index             = /var/log/mysql/binlog_slave.index
binlog_format             = row
log_slave_updates         = false
expire_logs_days          = 14
max_binlog_size           = 256M
max_binlog_files          = 25
binlog_cache_size         = 32K
relay_log                 = /var/log/mysql/relaylog-slave
sync_binlog               = 0
slave_compressed_protocol = 0

Смотрим имя бинлога и позицию

slave$ cat /tmp/backupdir/xtrabackup_binlog_info
master-bin.000001     481

5. Запускаем репликацию

mysql> CHANGE MASTER TO MASTER_HOST='master-server-ip', MASTER_USER='repl', MASTER_PASSWORD='repl_pass', MASTER_LOG_FILE='value', MASTER_LOG_POS=value;
mysql> START SLAVE;

Проверяем статус на slave

mysql> SHOW SLAVE STATUS \G

Если всё хорошо, Last_Error должен быть пустой, Slave_IO_State - “Waiting for master to send event”. Seconds_Behind_Master - время отставания реплики от мастера

Статус на master

mysql> SHOW MASTER STATUS;


Распространенные ошибки

Ошибка: ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository Решение:

mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)
mysql> CHANGE MASTER TO MASTER_HOST='master-server-ip', MASTER_USER='repl_user', MASTER_PASSWORD='repl_user', MASTER_LOG_FILE='value', MASTER_LOG_POS=value, MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected, 2 warnings (0.05 sec)
mysql> start slave;


Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

Server UUIDs is automatically generated but it was copied when I cloned mysql instance using AWS AMI

/var/lib/mysql# cat /var/lib/mysql/auto.cnf
[auto]
server-uuid=fea4e713-9552-11e6-a093-06a1a5e379d3

Удаляем auto.conf и рестартим mysql.


Sometimes errors occur in replication. For example, if you accidentally change a row of data on your slave. If this happens, fix the data, then run:

mysql> STOP SLAVE;SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE;