На тесте выполню настройку репликации в MySQL.
Допустим имеется два сервера с установленной системой Ubuntu Server, на обеих установим MySQL сервер и клиент, если они не установлены:
sudo apt-get install mysql-server mysql-client
Установку MySQL сервера я также описывал в статье:
Установка и настройка MySQL сервера на Ubuntu.
Предположим что основной MySQL Master сервер имеет IP-адрес 192.168.1.8, второй — 192.168.1.9 мы настроим как Slave.
На мастер сервере откроем в текстовом редакторе файл конфигурации MySQL:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Укажем на каком IP работает сервер, назначим ему ID, укажем путь к bin логам, и с какой базы они будут записываться:
bind-address = 192.168.1.8
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = TESTDATABASE
max_binlog_size = 500M
Можно указать несколько баз:
binlog_do_db = TESTDATABASE
binlog_do_db = TESTDATABASE2
binlog_do_db = TESTDATABASE3
В bin логах сохраняются запросы которые выполняются к указанной базе дынных на Master сервере и в дальнейшем они будут выполняться на Slave серверах, таким образом приводя базу к актуальному состоянию, при желании их можно увидеть например через утилиту mysqlbinlog.
Перезапустим MySQL сервер чтобы применить изменения:
sudo service mysql restart
Создадим пользователя, который будет выполнять подключение со Slave сервера и получать данные:
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO "replication"@"192.168.1.9" IDENTIFIED BY "password";
FLUSH PRIVILEGES;
exit
Если Slave серверов много, то добавим аналогично пользователей указав нужные IP вместо 192.168.1.9, либо укажем символ * чтобы разрешить пользователю доступ с любого IP.
Для того чтобы сделать дамп, заблокируем все таблицы в базе данных:
mysql -u root -p
USE TESTDATABASE;
FLUSH TABLES WITH READ LOCK;
Смотрим статус Master сервера:
SHOW MASTER STATUS;
exit
Когда я смотрел статус мастер севера, то увидел следующее:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000040 | 154 | TESTDATABASE | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0,00 sec)
Так как мы заблокировали таблицы в базе и данные не изменяются, а mysql-bin.000040 и 154 нам пригодятся в дальнейшем чтобы указать с какого момента запустить перенос данных.
Теперь делаем дамп базы данных:
mysqldump -u root -p --opt TESTDATABASE > TESTDATABASE.sql
Теперь можно разблокировать таблицы:
mysql -u root -p
UNLOCK TABLES;
После разблокировании таблиц, если в базе на Master сервере будут выполняться изменения, то значение Position будет увеличиваться.
Приступим к настройке Slave сервера, создадим базу данных:
mysql -u root -p
CREATE DATABASE TESTDATABASE;
exit
Импортируем в нее ранее сделанный дамп:
mysql -u root -p TESTDATABASE < TESTDATABASE.sql
Откроем файл конфигурации MySQL сервера:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Укажем параметры:
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
relay-log = /var/log/mysql/mysql-relay-bin.log
binlog_do_db = TESTDATABASE
max_binlog_size = 500M
Перезапустим MySQL сервер чтобы применить изменения:
sudo service mysql restart
Выполним запрос который укажет параметры для репликации, в том числе File и Position которые мы видели на мастер сервере перед тем как сделать дамп базы с заблокированными таблицами, тем самым указав с какой позиции запустить репликацию:
CHANGE MASTER TO MASTER_HOST='192.168.1.8', MASTER_USER='replication', MASTER_PASSWORD='password', MASTER_LOG_FILE = 'mysql-bin.000040', MASTER_LOG_POS = 154;
Запускаем:
START SLAVE;
Смотрим статус:
SHOW SLAVE STATUS;
Похожим образом можно настроить и следующие Slave сервера, но дамп уже можно делать со Slave сервера остановим его командой:
STOP SLAVE;
После чего делаем дамп базы данных и смотрим значения File и Position чтобы указать их на следующем Slave сервере:
SHOW SLAVE STATUS;
START SLAVE;
Репликация отлично подойдет для того чтобы направить часть SELECT запросов вместо основного сервера на Slave, а также для создания резервных копий большой базы данных на Slave сервере, чтобы не останавливать основной и не нагружать его этим. Репликация не является резервным копированием.
Список процессов, подключенных клиентов и Slave можно посмотреть командами:
SHOW PROCESSLIST;
SHOW SLAVE HOSTS;
Смотрите также мою статью:
Решение ошибки ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES