понедельник, 19 ноября 2012 г.

Настройка MySQL master-slave репликации

Настраивать 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.

2 комментария:

  1. Актуальна ли данная инструкция на текущий момент?

    ОтветитьУдалить
    Ответы
    1. Скорее всего потребует адаптации. Писалось для mysql-server 5.1.x/5.5.x.

      Удалить