Репликация базы данных master с помощью MariaDB 10 в Debian 8
На этой странице
- 1. Проверить подключение
- 2. Включить двоичный журнал mysqld на мастере
- 3. Предоставление прав пользователю репликации
- 4. Очистите кеши базы данных и установите для таблиц доступ только для чтения
- 5. Базы данных моментальных снимков для подчиненного хоста
- 6. Настройте идентификаторы серверов для главного и подчиненного
- 8. Настроить личность мастера на ведомом
- 9. Активировать подчиненный
- 10. Внесите изменения на ведущем и проверьте репликацию на ведомом.
- 11. Повторите процесс для дополнительных ведомых устройств.
- 12. Устранение неполадок: ведомое устройство не может подключиться к ведущему
Репликация баз данных создает избыточность, которая защищает от потери данных и обеспечивает оптимальную производительность приложений. В этом руководстве рассматриваются основы репликации существующей основной базы данных MariaDB 10.0 на одно или несколько подчиненных устройств. В следующих примерах основной операционной системой является Debian 8.
Эти инструкции могут применяться к другим операционным системам, но имейте в виду, что некоторые команды и расположение файлов по умолчанию будут другими. В частности, вы должны заменить имена путей /etc/mysql/my.cnf, /var/lib/mysql, имя по умолчанию и путь к вашему двоичному файлу журнала, а также команды для запуска, остановки и перезапуска mysqld в соответствии со спецификой вашей системы. .
1. Проверьте подключение
Прежде чем продолжить, убедитесь, что главный и подчиненный устройства могут связаться друг с другом по сети и что у каждого есть запись для другого в соответствующих файлах /etc/hosts. Каждый хост должен иметь возможность пинговать другой, и вы должны иметь возможность ssh от каждого к другому как обычный пользователь.
2. Включите двоичный журнал mysqld на мастере
На главном хосте убедитесь, что ведение двоичного журнала включено. Вызов mysqld с параметрами --verbose --help отобразит рабочие значения для демона MariaDB. Как корень:
mysqld --verbose --help | grep log-bin
...
log-bin (No default value)
...
Значение записи log-bin определяет соглашение об именах двоичных файлов журнала. В Debian эти файлы находятся в /var/lib. Если значение log-bin равно (нет значения по умолчанию), вам необходимо включить ведение журнала, изменив файл конфигурации my.cnf. В Debian файл my.cnf находится в каталоге /etc/mysql.
Откройте /etc/mysql/my.cnf в текстовом редакторе и найдите группу [mysqld]. Если он не существует, создайте его и введите строку, которая просто читается как log-bin.
[mysqld]
log-bin
Включение этой записи позволит вести двоичный журнал при перезапуске mysqld.
Вы можете установить значение для log-bin, например. log-bin=имя_файла, чтобы определить пользовательское имя для двоичного файла журнала. В этом руководстве мы не будем устанавливать значение, и будут использоваться имена файлов журнала по умолчанию.
Перезапустите mysqld:
service mysql restart
Убедитесь, что изменение вступило в силу:
mysqld --verbose --help | grep log-bin
...
log-bin mysqld-bin
...
Как показано здесь, имя файла двоичного журнала по умолчанию в Debian начинается с mysqld-bin, например. mysqld-bin.nnnnnn.
3. Предоставить права пользователю репликации
Рекомендуется, чтобы все задачи репликации выполнялись выделенным пользователем репликации. В этих примерах мы назовем пользователя repluser и установим для этого пользователя пароль в виде строки replpass.
Предоставьте этому пользователю глобальные привилегии SUPER, RELOAD и REPLICATION SLAVE. Это позволит пользователю репликации выполнять команды суперпользователя, очищать кэши базы данных и получать обновления с главного сервера.
Введите клиент MariaDB в качестве корня базы данных:
mysql -u root -p
В командной строке MariaDB введите команду:
GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';
Здесь подстановочный знак имени хоста % позволяет пользователю репликации подключаться с любого хоста.
Убедитесь, что права предоставлены:
SHOW GRANTS FOR 'repluser'\G;
4. Очистите кеши базы данных и установите для таблиц доступ только для чтения.
При подготовке к созданию моментального снимка баз данных очистите все таблицы и установите для них READ LOCK. Это следует делать быстро, в непиковые часы или в период технического обслуживания системы.
На мастере:
FLUSH TABLES WITH READ LOCK;
Теперь, когда столы заблокированы, проверьте статус мастера:
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000005 | 995 | | |
+-------------------+----------+--------------+------------------+
Ваша информация будет другой, но запишите значения File и Position. Вы будете использовать эту информацию на шаге 7.
Выйдите из клиента MariaDB:
\q
5. Снэпшоты баз данных для ведомого хоста
Создайте архив базы данных или баз данных, существующих на мастере, который вы хотите реплицировать. Каждая из этих баз данных имеет собственный каталог в /var/lib/mysql. В этом примере мы заархивируем одну базу данных, расположенную по пути /var/lib/mysql/dbname.
Эта команда архивирует одну базу данных. Если вы архивируете дополнительные базы данных, добавьте их полные пути к команде, например /var/lib/mysql/dbname1 /var/lib/mysql/dbname2 ...
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
Теперь, как обычный пользователь username, перенесите этот файл в учетную запись обычного пользователя на ведомом хосте:
rsync -avP mysql-master.tar.bz2 [username]@slavehost:~/.
или, используя scp:
scp mysql-master.tar.bz2 [username]@slavehost:~/.
Затем SSH к ведомому хосту:
ssh [username]@slavehost
Как root, остановите mysqld на подчиненном устройстве:
service mysql stop
...и распакуйте архив:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
6. Настройте идентификаторы серверов для главного и подчиненного
Измените /etc/mysql/my.cnf на мастере, добавив запись server-id=n в группу [mysqld], где n — уникальное целое число, идентифицирующее сервер. Обычно n=1 для главного сервера, но n может быть любым уникальным целым числом в диапазоне [1, 2^32-1]. Мы установим для нашего мастера server-id=1, а для нашего подчиненного сервера server-id=100.
(Если my.cnf не существует на подчиненном устройстве, создайте его. Если он существует, найдите существующую запись идентификатора сервера и раскомментируйте/отредактируйте эту строку).
В /etc/mysql/my.cnf на главном хосте:
[mysqld]
server-id=1
В /etc/mysql/my.cnf на подчиненном хосте:
[mysqld]
server-id=100
7. Разблокируйте таблицы и запустите/перезапустите mysqld на главном и подчиненном устройствах.
На главном сервере в клиенте MariaDB в качестве корня базы данных разблокируйте таблицы:
mysql -u root -p
UNLOCK TABLES;
\q
Перезапустите mysqld на мастере:
service mysql restart
И запускаем его на слейве:
service mysql start
Вы можете убедиться, что новое значение идентификатора сервера вступило в силу на каждом хосте. Как корень:
mysqld --verbose --help | grep server-id
8. Настройте личность мастера на ведомом
На подчиненном устройстве настройте идентификатор главного сервера. Войдите в клиент MariaDB:
mysql -u root -p
Выполните следующую команду, заменив значения MASTER_LOG_FILE и MASTER_LOG_POS на двоичный файл журнала и позицию, которые вы записали на шаге 4, а значения MASTER_HOST, MASTER_USER и MASTER_PASSWORD на ваши собственные значения.
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;
9. Активировать раб.
На подчиненном устройстве в клиенте MariaDB в качестве корня базы данных:
START SLAVE;
Теперь вы можете проверить статус ведомого устройства:
SHOW SLAVE STATUS \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: masterhost
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000009
Read_Master_Log_Pos: 1330
Relay_Log_File: mysqld-relay-bin.000008
Relay_Log_Pos: 1618
Relay_Master_Log_File: mysqld-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1330
Relay_Log_Space: 2204
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Если в процессах репликации есть какие-либо ошибки, вы увидите их здесь.
10. Внесите изменения на ведущем и проверьте репликацию на ведомом.
Вы можете убедиться, что репликация происходит, создав новую базу данных на ведущем сервере и просмотрев изменения на ведомом.
mysql -u root -p
Создайте новую базу данных:
CREATE DATABASE repltest;
USE repltest
Создайте таблицу и вставьте значение:
CREATE TABLE test (hello VARCHAR(10));
INSERT INTO test VALUES ('world');
\q
Теперь войдите в клиент MariaDB на подчиненном устройстве:
mysql -u root -p
USE repltest
SELECT * FROM test;
+-------+
| hello |
+-------+
| world |
+-------+
1 row in set (0.00 sec)
11. Повторите процесс для дополнительных ведомых устройств.
Вы можете повторить этот процесс для каждого дополнительного ведомого устройства. В частности, выполните следующие действия:
11(а). На мастере в клиенте MariaDB в качестве корня базы данных сбросьте и заблокируйте таблицы:
FLUSH TABLES WITH READ LOCK;
После блокировки показать мастер-статус:
SHOW MASTER STATUS;
Запишите значения File и Position.
11(б). На мастере как root:
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
11(с). На мастере, как обычный пользователь:
rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.
11(г). На подчиненном устройстве как root:
service mysql stop
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
11(е). В файле /etc/mysql/my.cnf на подчиненном хосте добавьте или отредактируйте строку server-id= в группе [mysqld], где значение server-id является новым и уникальным:
[mysqld]
server-id=200
11(е). На мастере в клиенте MariaDB в качестве корня базы данных разблокируйте таблицы:
UNLOCK TABLES;
11(г). На мастере, как root, перезапустите mysqld:
service mysql restart
11(ч). На подчиненном устройстве, как root, запустите mysqld:
service mysql start
11(и). На ведомом устройстве в клиенте MariaDB в качестве корня базы данных настройте идентификатор мастера, а также имя файла двоичного журнала и положение из шага 10 (a):
CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;
11(к). На подчиненном устройстве в клиенте MariaDB в качестве корня базы данных активируйте репликацию:
START SLAVE;
12. Устранение неполадок: ведомое устройство не может подключиться к ведущему
Проверьте /var/mysql/my.cnf на мастере для записи адреса привязки. Если адрес привязки установлен на 127.0.0.1, сервер будет принимать соединения только с локального хоста. Закомментируйте эту строку или установите значение *, чтобы разрешить подключения со всех адресов IPv4 и IPv6. Если вы изменяете my.cnf, не забудьте перезапустить mysqld.
Если соединения по-прежнему не работают, убедитесь, что ваш сервер разрешает соединения через порт 3306. На главном устройстве перечислите таблицы брандмауэра ядра:
iptables -L
Вы можете создать разрешение для соединений на порту 3306 с помощью следующей команды, заменив имя вашего сетевого интерфейса на eth0 при необходимости:
iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT