Поиск по сайту:

Репликация базы данных master с помощью MariaDB 10 в Debian 8


На этой странице

  1. 1. Проверить подключение
  2. 2. Включить двоичный журнал mysqld на мастере
  3. 3. Предоставление прав пользователю репликации
  4. 4. Очистите кеши базы данных и установите для таблиц доступ только для чтения
  5. 5. Базы данных моментальных снимков для подчиненного хоста
  6. 6. Настройте идентификаторы серверов для главного и подчиненного
  7. 8. Настроить личность мастера на ведомом
  8. 9. Активировать подчиненный
  9. 10. Внесите изменения на ведущем и проверьте репликацию на ведомом.
  10. 11. Повторите процесс для дополнительных ведомых устройств.
  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