Ускоряем работу WordPress с помощью репликации MySQL
mySQL, Ubuntu | Комментировать запись
Данное руководство научит вас масштабировать сервер 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: MySQL, Ubuntu 14.04, WordPress