Привет, %username%
! Тут я рассмотрю настройку репликации master-slave в БД MySQL. Процесс установки всех необходимых пакетов не вижу смысла описывать, т.к. подобное можно прочитать в документации. Упомяну лишь то, что в моем случае стоит Percona XtraDB 5.7 на Ubuntu 16.04.
В моей конфигурации изначально была Galera, которую мне необходимо было выпилить. Для выпиливания необходимо из файла /etc/mysql/my.cnf
удалить все упоминания переменных начинающихся на wsrep_
и корректно перезапустить демон mysql
. Для упрощения схемы представим, что у нас master
имеет IP 192.168.99.20
, а будущий slave
имеет IP 192.168.99.30
Настройка мастера
Правим /etc/mysql/my.cnf
на master-сервере и приводим его примерно к такому виду:
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
default-character-set = utf8
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqldump]
quote-names
max_allowed_packet = 128M
[isamchk]
key_buffer = 16M
[mysqld]
skip-character-set-client-handshake
skip-external-locking
skip-name-resolve
innodb-autoinc-lock-mode = 1
user = mysql
default-storage-engine = InnoDB
socket = /var/run/mysqld/mysqld.sock
server-id = 1
bind-address = 0.0.0.0
port = 3306
tmpdir = /mnt/ramdisk
explicit-defaults-for-timestamp = 1
basedir = /usr
lc-messages-dir = /usr/share/mysql
character-set-server = utf8
collation-server = utf8_unicode_ci
net-write-timeout = 600
wait-timeout = 300
interactive-timeout = 3600
default-time-zone = SYSTEM
thread-stack = 192K
sort-buffer-size = 8M
read-rnd-buffer-size = 4M
read-buffer-size = 4M
join-buffer-size = 32M
# MyISAM #
key-buffer-size = 128M
myisam-recover-options = FORCE,BACKUP
# SAFETY #
max-allowed-packet = 16M
max-connect-errors = 1000000
sql-mode = ""
sysdate-is-now = 1
innodb = FORCE
# DATA STORAGE #
datadir = /var/lib/mysql
# BINARY LOGGING #
log-bin = /var/lib/mysql/mysql-bin
expire-logs-days = 14
sync-binlog = 1
# REPLICATION #
binlog-format = mixed
binlog-checksum = crc32
log-slave-updates = true
# CACHES AND LIMITS #
tmp-table-size = 2G
max-heap-table-size = 2G
query-cache-type = 0
query-cache-size = 8M
max-connections = 500
thread-cache-size = 1025
open-files-limit = 2000000
table-definition-cache = 8192
table-open-cache = 8192
# INNODB #
innodb-file-per-table
innodb-flush-method = O_DIRECT
innodb-log-files-in-group = 2
innodb-log-file-size = 512M
innodb-log-buffer-size = 64M
innodb-flush-log-at-trx-commit = 2
innodb-flush-neighbors = 0
innodb-file-per-table = 1
innodb-buffer-pool-size = 2G
innodb-buffer-pool-instances = 32
# LOGGING #
log-error = /var/lib/mysql/mysql-error.log
slow-query-log = 1
slow-query-log-file = /var/lib/mysql/mysql-slow.log
long-query-time = 4
log-timestamps = SYSTEM
# CUSTOM #
event_scheduler = on
group_concat_max_len = 30000
log_timestamps = SYSTEM
log_bin_trust_function_creators = 1
optimizer-search-depth = 0
transaction-isolation = READ-COMMITTED
pid-file = /var/run/mysql/mysql.pid
symbolic-links = 0
[sst]
progress = 1
time = 1
rlimit = 200m
Важно! При копировании этого конфига учитывайте параметры своей системы - есть шанс сделать хуже, чем было! За подробностями в google и официальную документацию.
Рестартуем mysql
:
systemctl restart mysql
Даем права на репликацю для пользователя repl
:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.99.20' IDENTIFIED BY 'pAssw0rd';
На мастере делаем бэкап с помощью xtrabackup
:
#!/bin/bash
PASSWORD="rootpassword"
# Снимаем бэкап
xtrabackup --backup --user=root --password=${PASSWORD} --target-dir=/root/backupdb/ --slave-info
# Догоняем его до актуального состояния
xtrabackup --user=root --password=${PASSWORD} --prepare --target-dir=/root/backupdb/ --slave-info
Подготовка
Копируем на слейв бэкап БД и файл /etc/my.cnf
:
rsync -avpP -e ssh /root/backupdb/ [email protected]:/root/backupdb/
scp /etc/my.cnf [email protected]:/etc/mysql/my.cnf
Правим на слэйве в файле /etc/mysql/my.cnf
параметр server-id
- он должен быть отличным от мастера:
server-id = 2
Идем на слейв и останавливаем mysql
:
mysqladmin -u root -p shutdown all
Вычищаем старую базу:
rm -rf /var/lib/mysql/*
Копируем новую, скопированную с мастера и применяем права и стартуем слейв:
innobackupex --defaults-file=/etc/mysql/my.cnf --copy-back /root/backupdb/
chown -R mysql:mysql /var/lib/mysql
systemctl restart mysql
Важно: Тут используется флаг
--copy-back
- данные из директории с бэкапом не удаляются. Если вам необходимо перенести данные, то используйте флаг--move-back
- будет выполнен перенос данных.
Включение
Теперь подключим репликацию. Смотримпозицию на слейве в файле:
cat /root/backupdb/xtrabackup_binlog_info
Видим что-то типа такого:
mysql-bin.000007 456
Заходим в консоль mysql
и подключаем репликацию:
CHANGE MASTER TO MASTER_HOST='192.168.99.20', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=456;
START SLAVE;
В моём случае отключены GTID
, но если вы всё же их включите то команду можно ввести такую:
CHANGE MASTER TO MASTER_HOST='192.168.99.20', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_AUTO_POSITION=1;
Смотрим статус:
SHOW SLAVE STATUS;
Важно: В случае возникновения ошибки
1236
смотреть статью тут
STOP SLAVE;
change master to MASTER_LOG_POS=456;
CHANGE MASTER TO MASTER_LOG_FILE = 'mysql-bin.000007';
START SLAVE;
SHOW SLAVE STATUS;
На этом всё! Улыбаемся и пашем!
Если у тебя есть вопросы, комментарии и/или замечания – заходи в чат, а так же подписывайся на канал.