Репликация и кластер

Репликация базы данных — это процесс, при котором создается копия базы данных и поддерживается ее актуальность. Это значит, что все изменения в основной базе данных автоматически передаются в копию.

Репликация позволяет:

  • разгрузить основную базу данных, распределяя запросы между копиями,

  • иметь резервную копию, которая всегда готова к использованию,

  • работать с несколькими базами данных, расположенными в разных географических точках. Это повышает скорость доступа к данным.

Master-Slave репликация

Подключение дополнительных серверов баз данных снижает нагрузку на основную базу. Чтение данных происходит из копий slave, а запись — в основную базу master.

С версии 24.0.0 Главного модуля вся нагрузка может быть перенаправлена на slave-серверы.

  1. До первого запроса на изменение данных система работает в обычном режиме.

  2. При запросе на изменение фиксируется список измененных таблиц.

  3. При последующих запросах выборки проверяется, изменялись ли таблицы. Если нет, запросы продолжают обрабатываться через slave-серверы.

При использовании нескольких веб-серверов в файле /bitrix/.settings.php на всех серверах должен быть указан адрес подключения к главной базе данных. Необходимо использовать прямой IP-адрес. Адрес localhost использовать запрещено.

Как подключить

  1. Перейдите на страницу Настройки > Веб-кластер > Группа #1 > Репликация.

    Модуль Веб-кластер доступен только в редакциях Энтерпрайз.

  2. Нажмите кнопку Добавить slave базу данных.

  3. Следуйте рекомендациям мастера и исправьте параметры master базы данных, критичные для настройки репликации.

  4. Укажите параметры подключения к slave базе данных.

  5. Следуйте рекомендациям мастера и исправьте параметры slave базы данных, критичные для настройки репликации.

  6. Введите Название подключения.

После завершения мастер добавит базу в список, но она будет неактивна. В меню действий выберите Начать использовать и следуйте инструкциям.

Запуск репликации начинается с копирования базы данных. Во время этого процесса публичная часть сайта будет закрыта. Административная часть останется доступной. Изменения данных, внесенные в этот период, могут привести к рассогласованию и повлиять на работу сайта.

После успешного подключения slave-сервера отображается его статус.

Для репликации нужны разные серверы с быстрым каналом связи, которые обеспечивают высокую пропускную способность и низкую задержку. В настройках модуля Веб-кластер можно указать время отставания slave-базы от master, после которого она будет отключена для предотвращения рассинхронизации.

Привилегии

Для работы репликации учетные записи серверов должны иметь привилегии: SUPER, REPLICATION CLIENT, REPLICATION SLAVE. Рекомендуется объединить их в одну учетную запись.

В MySQL 8 создайте учетную запись командой CREATE USER, затем назначьте права командой GRANT. Пароль задается в CREATE USER, конструкция GRANT ... IDENTIFIED BY не поддерживается. Подробнее — в документации MySQL.

  1. Учетная запись для работы с базой данных на всех узлах кластера.

    Создайте учетную запись и назначьте права на каждом узле:

    CREATE USER 'bitrixcluster'@'%' IDENTIFIED BY 'Rr6wNCPJH+WU';
    GRANT SELECT, LOCK TABLES, CREATE TEMPORARY TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX ON bitrixcluster.* TO 'bitrixcluster'@'%';
    GRANT REPLICATION CLIENT, RELOAD ON *.* TO 'bitrixcluster'@'%';
    

    Привилегии REPLICATION CLIENT и RELOAD назначаются на уровне сервера через ON *.*.

    • REPLICATION CLIENT — для отображения статистики master-базы,

    • RELOAD — используется в master-базе во время переноса таблиц в slave-базу для FLUSH TABLES WITH READ LOCK.

  2. Учетная запись для управления slave-нодами. Создается в каждой slave-базе и указывается при подключении.

    Создайте учетную запись и назначьте права на каждом slave-сервере:

    CREATE USER 'bitrixcluster_slave'@'%' IDENTIFIED BY 'Rr6wNCPJH+WU';
    GRANT REPLICATION CLIENT ON *.* TO 'bitrixcluster_slave'@'%';
    GRANT SUPER ON *.* TO 'bitrixcluster_slave'@'%';
    GRANT SELECT, LOCK TABLES, CREATE TEMPORARY TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX ON bitrixcluster.* TO 'bitrixcluster_slave'@'%';
    
    • REPLICATION CLIENT — для отображения статистики в интерфейсе,

    • SUPER — для запуска и остановки slave-базы и изменения параметров репликации из административного интерфейса,

    • права на bitrixcluster.* — для экспорта данных из master-базы в slave-базу.

  3. Учетная запись для загрузки бинарных логов создается на master-базе для каждого подключения slave.

    Создайте учетную запись и назначьте право на загрузку бинарных логов с master-сервера:

    CREATE USER 'bitrixcluster_replica'@'%' IDENTIFIED BY 'Rr6wNCPJH+WU';
    GRANT REPLICATION SLAVE ON *.* TO 'bitrixcluster_replica'@'%';
    

Пароль Rr6wNCPJH+WU приведен для примера, замените его на свой.

Настройка параметров базы данных

Чтобы изменить настройки подключения базы данных, на странице Настройки > Веб-кластер > Группа #1 > Репликация дважды кликните по базе в таблице или выберите пункт Изменить в меню действий. Откроется форма «Настройка параметров главной базы/slave базы данных»:

Укажите процент распределения нагрузки для каждой базы. Эта опция перераспределяет большую часть нагрузки на более быстрые и мощные серверы в составе кластера.

Для главной базы существует дополнительная опция, которая позволяет минимизировать нагрузку на нее.

Особенности работы с master-базой

После записи в master-базу система направляет последующие запросы чтения измененных таблиц в нее же. Чтение остальных таблиц может продолжаться через slave-базы. Это позволяет получать актуальные данные после записи, даже если репликация еще не завершилась.

Чтобы временно направить запросы только в master-базу, используйте метод Bitrix\Main\Data\ConnectionPool::useMasterOnly($mode). Получите пул соединений через Bitrix\Main\Application::getInstance()->getConnectionPool().

Параметр $mode управляет режимом.

  • true — включает режим, в котором и чтение, и запись идут в master-базу,

  • false — завершает режим.

Вызовы должны быть парными. Если режим включен несколько раз, завершите каждое включение отдельным вызовом с false. Чтобы завершить режим и при исключении, вызывайте useMasterOnly(false) в блоке finally.

В классическом API методы CDatabase::StartUsingMasterOnly() и CDatabase::StopUsingMasterOnly() вызывают этот же метод с true и false соответственно. Метод useMasterOnly() — их D7-аналог.

Если внутри этого режима выполняются запросы на запись, после его завершения чтение может снова идти из slave-базы. Данные могут еще не успеть синхронизироваться. Выполняйте чтение, которому нужны результаты этих записей, до вызова useMasterOnly(false).

Резервная копия

Slave-базу данных можно настроить для использования в качестве резервной копии. В этом случае чтение данных из нее не выполняется.

Чтобы перевести базу в режим копирования, выполните следующие действия:

  • откройте форму Настройка параметров slave базы данных,

  • отметьте опцию Для резервного копирования.

Резервное копирование данных выполняется постоянно.

Master-Master репликация

Master-Master репликация позволяет обеим базам данных быть активными для чтения и записи. Настройка выполняется на уровне базы данных. Для настройки можно использовать документацию MySQL: