Репликация MYSQL-сервера — различия между версиями
Root (обсуждение | вклад) (Новая страница: «Будем настраивать репликацию Percona-MYSQL-5.7 сервера на Debian Stretch. Тип репликации будет master-slave.») |
Root (обсуждение | вклад) |
||
Строка 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;