Все ленты — последние статьи

Синхронизация файлов и содержимого БД MySQL на резервный сервер

Синхронизация файлов и содержимого БД MySQL на резервный сервер

Есть два сервера под Linux/FreeBSD: СУБД MySQL + некое приложение,
задача — синхронизировать БД и данные.

За синхронизацию данных MySQL отвечает mysql replication, данные
синхронизируются с мастера на слейв.

 

Делаем на мастере:

в my.cnf добавляем строки

log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db=databasename
server-id=1

перезагружаем MySQL, добавляем пользователя для репликации:

GRANT ALL PRIVILEGES ON databasename.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password';

далее выполняем команду:

USE databasename;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

и вывод этой команды для нас важен, надо его куда-нибудь записать:

File Position Binlog_do_db Binlog_ignore_db
mysql-bin.001 10 databasename

теперь делаем дамп базы:

mysqldump -u slave_user -pslave_password --opt databasename > databasename.dump

и наконец убираем лок с базы в MySQL:

UNLOCK TABLES;


Теперь на слейве:

Создаём базу:

mysqladmin create databasename -p

Востанавливаем базу из дампа:

mysql -u slave_user -pslave_password databasename < databasename.dump

в my.cnf добавляем строки:

server-id=2
master-host=XX.XX.XX.XX # IP адрес мастер-сервера
master-user=slave_user
master-password=slave_password
master-connect-retry=60
replicate-do-db=databasename

перегружаем MySQL и добавляем чудесные данные из волшебной комманды:

SLAVE STOP;
CHANGE MASTER TO MASTER_HOST='XX.XX.XX.XX',
MASTER_USER='slave_user', MASTER_PASSWORD='slave_password',
MASTER_LOG_FILE='mysql-bin.001', MASTER_LOG_POS=10;
START SLAVE;

готово, теперь проверяем, добавляем запись в мастер, на слейве она должны отреплицироваться.

Понятно, что изменять данные можно только на мастере, слейв работает только на чтение.


Для синхронизации данных имеет смысл использовать rsync, очень интересный протокол/приложение.
Может синхронизировать инкрементально и с сжатием.
На мастер сервере в rsyncd.conf добавляем:

read only = yes # во избежание ;-)
hosts allow = YY.YY.YY.YY # IP адрес слэйв-сервера
[somelabel]
path = /path/to/apllication/folder # где лежит приложение
auth users = replica_user # юзер только для репликации в rsync, не системный пользователь
secrets file = /path/to/rsync/rsync.secret # где лежит файл с паролем для replica_user,
# только пароль и ничего больше

на слейве — команда для синхронизации, можно добавить в cron с нужной периодичностью:

rsync:Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.">//Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.:873/somelabel /path/to/application

где:
rsync.exclude — файл в котором перечислены, какие файлы (конкретно или по
маске) не синхронизировать
rsync.secret — файл с секретным паролем для replica_user
ХХ.ХХ.ХХ.ХХ — IP мастер-сервера, 873 — дефолтный порт для демона
somelabel — метка из rsyncd.conf с мастера
/path/to/application — путь куда класть данные.