Репликация MYSQL-сервера
Будем настраивать репликацию Percona-MYSQL-5.7 сервера с помощью Percona XtraBackup на Debian Stretch. Тип репликации будет master-slave. Сервер реплицируется один в один со всеми базами/пользователями. При создании новых баз/пользователей на 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 FOR repl;
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/
После копирования переносим куда-нибудь оригинальную папку с данными 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;
Сервер UUIDs генерируется автоматически, но если виртуалка клонирована, выскочит такая ошибка
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.
/var/lib/mysql# cat /var/lib/mysql/auto.cnf [auto] server-uuid=fea4e713-9552-11e6-a093-06a1a5e379d3
Удаляем auto.conf и рестартим mysql.
Ошибка при репликации. Например, если случайно изменить данные на slave
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;