Налаштування реплікації Master-Slave для MySQL на CentOS 6.4

Поширте інформацію:

Upd! Для сервера MariaDB інструкція тут

Нехай треба зробити реплікацію бази даних repltestdb (інструкція зі створення бази даних тут). Адреса master-сервера 10.8.0.1 Адреса slave-сервера 10.8.0.2

На стороні master-сервера Редагуємо файл

# vi /etc/my.cnf

В секцію

mysqld вставляємо параметри bind-address – IP-адреса, за якою буде доступний сервер, server-id – мусить бути унікальним в межах кластера задіяних серверів, log_bin – шлях, де будуть зберігатися логи, binlog_do_db – яка база підлягає реплікації (якщо потрібно реплікувати кілька баз, цей рядок повторюється для кожної

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
default-storage-engine = innodb

# Setting Up master server for replication
bind-address = 10.8.0.1
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = repltestdb
# binlog_do_db should be repeated for each database you want to replicate
#binlog_do_db = replbase2

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Застосовуємо зміни, попередньо створивши каталог /var/log/mysql (в CentOS він стандартно відсутній).

# mkdir /var/log/mysql
# chown mysql:mysql /var/log/mysql
# service mysqld restart

Відкриваємо у вогнемурі доступ на порт 3306 для іншого сервера

# iptables -A INPUT -p tcp -s 10.8.0.2 -d 10.8.0.1 --dport 3306 -j ACCEPT
# iptables-save > /etc/sysconfig/iptables

Надаємо доступ для slave

$ mysql -u root -p
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'10.8.0.2' IDENTIFIED BY 'thepassword';
mysql> FLUSH PRIVILEGES;

Робимо знімок бази даних

mysql> USE repltestdb;
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

Остання команда показує:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      487 | repltestdb   |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Записуємо ці дані, вони знадобляться в подальшому.

Увага! Тут потрібно відкрити інше вікно терміналу, тому що виконання наступної команди в тому самому вікні автоматично скасує lock

$ mysqldump -u root -p --opt repltestdb > repltestdb.sql

Повертаємось до початкового вікна терміналу і звільняємо базу даних.

mysql> UNLOCK TABLES;
mysql> QUIT;

Створений дамп

repltestdb.sql потрібно перенести на slave-сервер.

На стороні slave-сервера Створюємо базу даних.

$ mysql -u root -p
mysql> CREATE DATABASE repltestdb;
mysql> EXIT;

Відновлюємо її вміст з дампа:

$ mysql -u root -p repltestdb < ~/repltestdb.sql

Редагуємо файл

# vi /etc/my.cnf

В секцію

mysqld вставляємо параметри server-id – мусить бути унікальним в межах кластера задіяних серверів, relay-log – шлях, де будуть зберігатися логи, log_bin – шлях, де будуть зберігатися логи, binlog_do_db – яка база підлягає реплікації (якщо потрібно реплікувати кілька баз, цей рядок повторюється для кожної

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

# Setting Up replication (as slave)
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = repltestdb

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Застосовуємо зміни, попередньо створивши каталог /var/log/mysql (в CentOS він стандартно відсутній).

# mkdir /var/log/mysql
# chown mysql:mysql /var/log/mysql
# service mysqld restart

Відкриваємо знову оболонку mysql і вводимо команди для налаштування реплікації. Значення всіх параметрів ми визначили при налаштуванні master-сервера.

$ mysql -u root -p
mysql> CHANGE MASTER TO MASTER_HOST='10.8.0.1',MASTER_USER='repl_user',MASTER_PASSWORD='thepassword',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=487;
mysql> START SLAVE;

Перевірка стану slave-сервера

mysql> SHOW SLAVE STATUS\G

\G” виводить результат у зручнішому для читання вигляді. Якщо виникає проблема з підключенням, можна спробувати запустити slave-сервер з таким налаштуванням:

mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START SLAVE;

Написано на основі інструкції з

Digital Ocean

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.