Настраивать master-slave репликацию в MySQL приходится редко, но постоянно приходится подглядывать мануал. Чтобы свести эту операцию к "одному касанию" я добавил этот пост (подходит для Debian-based дистрибутивов, для остальных подойдет если копировать вдумчиво).
Установка MySQL сервера
Устанавливаем MySQL сервер и клиент
# aptitude install mysql-server mysql-client
Далее я убираю удаленный вход в базу под root, тестовую базу и тестового пользователя. Для автоматизации этих действий существует скрипт
mysql_secure_installation
, входящий в дистрибутив MySQL сервера.
# mysql_secure_installation
Чтобы каждый раз не вводить пароль при подключении к базе я создаю конфиг для консольного клиента
# touch /root/.my.cnf
# chown root:root /root/.my.cnf
# chmod 0600 /root/.my.cnf
# cat > /root/.my.cnf <<EOF
[client]
host=localhost
user=root
password=your-root-password
EOF
Настройка MySQL master ноды
В Debian-based дистрибутивах есть возможность создать локальный конфиг mysql не изменяя
/etc/mysql/my.cnf
(чтобы не было конфликта при обновлении пакета). Я пользуюсь этой возможностью
# cat > /etc/mysql/conf.d/master.cnf <<EOF
[mysqld]
server-id = 500
log-bin = mysql-bin
log-bin-index = mysql-bin.index
max_binlog_size = 512M
expire_logs_days = 30
bind-address = 0.0.0.0
EOF
# invoke-rc.d mysql restart
При настройке master ноды нужно уделить внимание выбору значения
server-id
(оно должно быть уникальным в пределах группы серверов, вовлеченных в репликацию). Опции
max_binlog_size
и
expire_logs_days
управляют ротацией бинарного лога.
Далее нужно создать пользователя который будет использоваться slave нодами для репликации.
mysql> CREATE USER 'slave-user'@'slave-host' IDENTIFIED BY 'slave-password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave-user'@'slave-host';
mysql> FLUSH PRIVILEGES;
Далее нужно подготовить слепок баз данных, которые мы будем реплицировать
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 3211 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
Сейчас нужно записать имя файла бинарного лога (mysql-bin.000004) и позицию в этом логе (3211). Далее в
этой же сессии выполнить
mysql> \!mysqldump --add-drop-database --all-databases > /tmp/all-db.sql
mysql> UNLOCK TABLES;
Файл /tmp/all-db.sql нужно передать на slave ноду.
Настройка MySQL slave ноды
Для работы MySQL сервера в качестве slave ноды нужно внести пару изменений в его дефолтный конфиг.
# cat > /etc/mysql/conf.d/slave.cnf <<EOF
[mysqld]
server-id = 510
relay-log = relay-bin
relay-log-index = relay-bin.index
EOF
# invoke-rc.d mysql restart
Далее нужно импортировать файл /tmp/all-db.sql, который был создан на master ноде
# mysql < /tmp/all-db.sql
# mysqladmin flush-privileges
Затем нужно подключить slave ноду к master серверу и запустить репликацию.
mysql> CHANGE MASTER TO master_host='master-host', master_user='slave-user', master_password='slave-password', master_log_file='mysql-bin.000004', master_log_pos=3211;
mysql> START SLAVE;
Посмотреть статус репликации можно командой SHOW SLAVE STATUS\G. Если все работает правильно, то в полях
Slave_IO_Running
и
Slave_IO_Running
должно быть значение
Yes
.