MySQL репликация

Иметь реплику БД даёт примерно такой профит:

  • При падении мастера можно шустренько перевести все на слейв и продолжить работу
  • Полные дампы БД без остановки мастера
  • Распределение нагрузки "на чтение" между серверами может значительно увеличить скорость работы

В данном мане производится реплика всех баз, т.е. не выборочно какой либо одной базы, а даже тех, которые будут созданы в будущем.

Поднимаем Master

Master это сервер с которого будут идти данные, он имеет IP:1.2.3.4

Заходим в /etc/mysql/my.cnf и в конфигурации [mysqld] указываем параметры:

# репликация - данный сервер мастер
server-id = 1

# место хранения бинарных логов
log_bin = /var/log/mysql/log_bin

# срок хранения, в днях, бинарных логов. Если установлено значение 0, бинарные логи не удаляются
expire_logs_days = 10

# максимальный размер бинарного лог файла. При достижении размером файла, данного значения, будет открыт новый файл лога
max_binlog_size = 300M

В консоле подключаемся к  MySQL:

mysql -u root -p

Добавляем юзера-репликатора для слейва, с помощью команд:

create user 'replicator'@'%' identified by 'Pa$$w0rd';
grant replication slave on *.* to 'replicator'@'%';

После чего рестартанём MySQL:

service mysql restart

Снова заходим в MySQL (подключаемся консольным клиентом) и выполняем запрос:

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |    11716 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

как видите MySQL показывает статистику, в которой значение Position должно увеличиваться по мере того, как вносятся изменения в БД на мастере.

Доступ к MySQL из сети

По умолчанию сервер MySQL принимает соединения только с локальной машины. Для того, чтобы разрешить подключаться к MySQL с других машин, замените строку

bind-address = 127.0.0.1

на

#разрешить подключатся с любого хоста
bind-address = 0.0.0.0
#разрешить подключатся только с указанного IP
bind-address = 192.168.1.23

Поднимаем Slave

Slave это сервер на который будут идти данные, он имеет IP:5.6.7.8

Заходим в /etc/mysql/my.cnf слэйва и в конфигурации [mysqld] указываем параметры:

server-id = 2
relay-log = /var/lib/mysql/relay-log
relay-log-index = /var/lib/mysql/relay-log-index

После чего рестартанём MySQL:

service mysql restart

Дамп

На Master-сервере делаем дамп и разворачиваем его на Slave-сервере

Реплицируем данные

В консоле подключаемся к  MySQL:

mysql -u root -p

и запускаем репликацию с помощью следующих команд:

change master to master_host = "1.2.3.4", master_user = "replicator", master_password="Pa$$w0rd", master_log_file = "mysql-bin.000001", master_log_pos = 11716;
start slave;

Проверим состояние Slave:

show slave status;

Увидим большую портянку, публиковать ее не буду, главное обратить внимание на отсутствие ошибок и если репликация идет нормально, на реплике номер лога в Master_Log_File и позиция Exec_Master_Log_Pos будут расти. Seconds_Behind_Master - время отставания реплики от мастера, если оно нулевое - значит все в порядке. Ну а если нет, то Slave не успевает воспроизводить действия с Master.


12.03.2014 18:13