Ускоряем работу WordPress с помощью репликации MySQL

Данное руководство научит вас масштабировать сервер MySQL для WordPress с помощью репликации master-slave и плагина HyperDB.

При наличии нескольких серверов баз данных WordPress может считывать данные из нескольких источников, что увеличивает производительность приложения.

Репликация MySQL обеспечивает высокую производительность систем, в которых часто выполняются операции чтения и редко – операции записи (так работает WordPress). С помощью репликации master-slave вы можете добавить больше устройств и масштабировать систему до тех пор, пока не исчерпаете пропускную способность сети (или пока ведущий сервер будет справляться с нагрузкой).

Примечание: Чтобы добавить больше ведомых серверов (slave), повторите соответствующие разделы этого руководства.

Предполагается, что установка включает в себя два сервера приложений WordPress с балансировкой нагрузки, которые подключаются к отдельному серверу базы данных MySQL (см. Требования). В целом, для работы не обязательно настраивать балансировку нагрузки серверов приложений, но сервер баз данных MySQL обязательно должен быть отделен от серверов приложений.

Требования

Для работы понадобится 4 виртуальных сервера:

  • haproxy-www: сервер HAProxy с балансировкой нагрузки 4 уровня серверов приложений WordPress. Это точка входа на сайт.
  • wordpress-1: первый сервер приложений WordPress.
  • wordpress-2: второй сервер приложений WordPress.
  • mysql-1: сервер БД MySQL.

То есть, окружение должно выглядеть так:

Пользователь

Балансировщик нагрузки haproxy-www
↓                               ↓
wordpress-1               wordpress-2
↓               ↓
mysql-1

В руководстве будет использоваться дополнительный сервер БД mysql-2, который будет работать в качестве slave.

В результате среда будет выглядеть так:

Пользователь

Балансировщик нагрузки haproxy-www
↓                               ↓
wordpress-1               wordpress-2
↓               ↓
mysql-1     mysql-2
↑_________↑
Репликация

Репликация MySQL по типу master-slave

Подготовка ведомого сервера

Настройте сервер, который будет работать как slave (для простоты назовём его mysql-2). Ведомый сервер (или slave) будет копировать все данные с ведущего сервера (master).

Перейдите на сервер mysql-2 и установите MySQL:

sudo apt-get update
sudo apt-get install mysql-server

Введите root-пароль MySQL.

Настройка ведущего сервера

Чтобы настроить ведущий сервер (master) mysql-1, отредактируйте конфигурационный файл:

sudo vi /etc/mysql/my.cnf

Найдите следующие строки:

bind-address            = mysql_1_private_IP
#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log

  • bind-address: IP-адрес, который будет прослушивать MySQL. Тут должен быть указан IP-адрес сервера mysql-1.
  • server-id: уникальный ID сервера. На сервере master нужно указать здесь 1 и раскомментировать строку.
  • log_bin: местоположение бинарного лог-файла. Бинарный лог используется для отправки изменений данных с ведущего сервера на ведомый. Раскомментируйте эту строку.

В результате они будут выглядеть так:

bind-address           = mysql_1_private_IP
server-id              = 1
log_bin                = /var/log/mysql/mysql-bin.log

Примечание: Вместо mysql_1_private_IP укажите внутренний IP-адрес сервера mysql-1.

Опционально можно также ограничить репликацию базой данных wordpress. Для этого добавьте в настройки такую строку:

binlog_do_db           = wordpress

Примечание: Вместо wordpress укажите имя вашей БД.

Сохраните и закройте файл. Перезапустите MySQL, чтобы обновить настройки:

sudo service mysql restart

Подключитесь к консоли MySQL:

mysql -u root -p

По запросу введите пароль.

Создайте пользователя, который будет использоваться slave-серверами MySQL для репликации (в руководстве он называется repl). Обязательно укажите вместо repl_password свой уникальный надёжный пароль. Символ % указывает, что этот пользователь может иметь любой исходный IP-адрес; вы можете заменить символ % внутренним IP-адресом ведомого сервера MySQL (mysql-2), чтобы доступ к пользователю имел только этот сервер.

CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

Пока что закрывать консоль MySQL не нужно.

Экспорт резервной копии master-сервера MySQL

После этого нужно экспортировать резервную копию данных master-сервера MySQL в БД slave-сервера. В результате на серверах будет храниться одинаковый набор данных. Нужно остановить БД, чтобы выполнить дамп данных. В консоли MySQL на сервере mysql-1 запустите следующую команду:

FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
EXIT

После этого запустите в обычной командной оболочке следующую команду, которая экспортирует резервную копию баз данных master-сервера в файл masterdump.sql:

mysqldump --lock-all-tables -u root -p --all-databases > masterdump.sql

Скопируйте файл masterdump.sql на slave-сервер mysql-2:

scp masterdump.sql user@mysql_2_private_IP:/tmp

Снова откройте консоль MySQL на сервере mysql-1.

mysql -u root -p

Снова запустите БД:

SET GLOBAL read_only = OFF;
UNLOCK TABLES;

Затем введите следующую команду, чтобы получить информацию, необходимую для настройки slave-сервера MySQL.

SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      408 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Запишите значения File и Position, они нужны для настройки сервера slave.

Перейдите на сервер mysql-2.

Настройка slave-сервера

Импортируйте данные master-сервера на slave-сервер, чтобы синхронизировать их.

На сервере mysql-2 запустите:

mysql -u root -p < /tmp/masterdump.sql

Теперь нужно настроить mysql-2 как slave-сервер MySQL. Отредактируйте конфигурационный файл:

sudo vi /etc/mysql/my.cnf

Найдите строки:

bind-address            = 127.0.0.1
#server-id              = 1

  • bind-address: IP-адрес, который прослушивает MySQL. Укажите здесь внутренний IP-адрес сервера mysql-2.
  • server-id: уникальный ID сервера. Укажите здесь 2 и раскомментируйте строку.

Должно получиться так:

bind-address           = mysql_2_private_IP
server-id              = 2

Сохраните и закройте файл. Перезапустите MySQL:

sudo service mysql restart

Откройте консоль MySQL:

mysql -u root -p

Теперь нужно подключить slave-сервер к master-серверу. Для этого нужны следующие 5 значений:

  • MASTER_HOST: внутренний IP-адрес сервера mysql-1.
  • MASTER_USER: пользователь для репликации (repl).
  • MASTER_PASSWORD: пароль пользователя repl.
  • MASTERLOGFILE: значение, которое вы выписали из поля File (в выводе команды SHOW MASTER STATUS;).
  • MASTERLOGPOS:значение, которое вы выписали из поля Position (в выводе команды SHOW MASTER STATUS;).

Следующий оператор настроит взаимодействие между slave-сервером и master-сервером (замените все условные данные соответствующими значениями):

CHANGE MASTER TO
MASTER_HOST='mysql_1_private_IP',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=408;

Чтобы инициировать соединение slave, введите:

START SLAVE;

Теперь сервер mysql-2 работает как slave-сервер и синхронизирует все данные с ведущим сервером. Чтобы убедиться, что репликация работает, введите:

SHOW SLAVE STATUS\G

Отнятие права на запись у пользователей slave (опционально)

Этот раздел опционален, поскольку плагин HyperDB можно настроить только для чтения данных с сервера slave.

Всё же, вы можете отнять права на запись у пользователей базы данных wordpressuser  на сервере slave (обновления вашего ведомого сервера все равно не будут реплицированы на мастер).

Перейдите на сервер mysql-2. С помощью консоли MySQL просмотрите пользователей БД:

SELECT user,host FROM mysql.user;
+------------------+----------------+
| user             | host           |
+------------------+----------------+
| repl             | %              |
| wordpressuser    | wordpress_1_IP |
| wordpressuser    | wordpress_2_IP |
...

Вы должны увидеть примерно такой результат. Вы можете просмотреть привилегии для каждого пользователя с помощью команды:

SHOW GRANTS FOR wordpressuser@wordpress_1_IP;

В данном примере на каждый сервер WordPress приходится по одному wordpressuser. Отнимите у них права insert, update и delete (в данном примере БД называется wordpress).

REVOKE INSERT, UPDATE, DELETE ON wordpress.* FROM 'wordpressuser'@'wordpress_1_private_IP';
REVOKE INSERT, UPDATE, DELETE ON wordpress.* FROM 'wordpressuser'@'wordpress_2_private_IP';
FLUSH PRIVILEGES;

Настройка репликации MySQL завершена. Теперь нужно настроить WordPress.

Установка и настройка HyperDB

HyperDB поможет определить, куда отправлять обновления и где читать запросы.

Загрузите плагин в домашний каталог из WordPress Plugin Directory. При необходимости установите утилиты zip и unzip.

cd ~; wget http://downloads.wordpress.org/plugin/hyperdb.zip
sudo apt-get install zip
unzip hyperdb.zip

Распакуйте полученный файл в каталог hyperdb в домашнем каталоге. Скопируйте образец конфигурационного файла в WordPress (проверьте путь в командах и при необходимости откорректируйте его).

cp ~/hyperdb/db-config.php /var/www/example.com/
vi /var/www/example.com/db-config.php

Найдите вторую строку DB_HOST, которая должна быть сразу после нескольких комментариев, описывающих настройку slave-сервера; настройки выглядят примерно так:

$wpdb->add_database(array(
'host'     => DB_HOST,     // If port is other than 3306, use host:port.
'user'     => DB_USER,
'password' => DB_PASSWORD,
'name'     => DB_NAME,
'write'    => 0,
'read'     => 1,
'dataset'  => 'global',
'timeout'  => 0.2,
));

Первая строка DB_HOST определяет master-сервер, а вторая – slave. Замените вторую строку DBHOST строкой DBSLAVE1:

'host'     => DB_SLAVE_1,     // If port is other than 3306, use host:port.

Сохраните и закройте файл. Определите DB_SLAVE_1 в wp-config.php, который плагин HyperDBбудет использовать в качестве хоста БД slave.

vi /var/www/example.com/wp-config.php

Найдите строку DB_HOST и добавьте после неё следующую строку (указав внутренний IP-адрес ведомого сервера).

define('DB_SLAVE_1', 'mysql_2_private_IP');

Сохраните и закройте файл.

Чтобы завершить установку HyperDB, скопируйте файл db.php в каталог wp-content установки WordPress и закройте его для записи.

cp ~/hyperdb/db.php /var/www/example.com/wp-content/
sudo chmod a-w /var/www/example.com/wp-content/db.php

Обновите права собственности на файлы wordpress (передайте их группе и пользователю www-data).

sudo chown -R www-data:www-data /var/www/example.com/

Теперь запросы на чтение WordPress будут обслуживаться двумя базами данных. Обновления данных будут отправляться на master-сервер, после чего они будут реплицированы на slave-сервер.

Кроме того, теперь среда подготовлена к обработке высокого трафика. Чтобы добавить новый slave-сервер, повторите соответствующие разделы данного руководства.

Tags: , ,

Добавить комментарий