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

Как оптимизировать производительность WordPress с помощью репликации MySQL в Ubuntu 14.04


Введение

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

Репликация MySQL дает наибольшие преимущества в производительности для системы, которая обрабатывает частое чтение и нечастую запись, как и большинство установок WordPress. Используя настройку с одним мастером и несколькими подчиненными, вы можете добавлять больше подчиненных устройств для масштабирования вашей системы, пока у вас не закончится пропускная способность сети или ваш главный сервер не сможет справиться с нагрузкой обновлений. Если вы хотите, вы можете добавить более одного ведомого устройства, повторив «ведомые» части разделов репликации этого руководства.

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

Предпосылки

Прежде чем продолжить работу с этим учебным пособием, вы должны пройти два учебных курса или иметь аналогичную среду:

  • Как настроить удаленную базу данных для оптимизации производительности сайта с помощью MySQL
  • При необходимости, как использовать HAProxy в качестве балансировщика нагрузки уровня 4 для серверов приложений WordPress в Ubuntu 14.04

После выполнения этих руководств, чтобы настроить WordPress с двумя серверами веб-приложений с балансировкой нагрузки и отдельным сервером базы данных, у вас должно быть четыре VPS. Поскольку мы будем иметь дело с несколькими VPS, для справки мы будем называть ваши четыре существующих VPS следующим образом:

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

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

В дополнение к вашей текущей среде нам потребуется один дополнительный VPS во время этого руководства. Мы назовем это:

  • mysql-2: подчиненный сервер базы данных MySQL

Наша цель

Когда мы закончим работу с этим учебным пособием, у вас будет два сервера баз данных, которые будут реплицироваться в конфигурации ведущий-подчиненный. Ваши серверы WordPress будут выборочно записывать в ваш главный и читать из ваших основных и подчиненных баз данных с помощью плагина HyperDB WordPress. Ваша конечная среда должна выглядеть примерно так:

Имейте в виду, что вам не нужно иметь серверы приложений с балансировкой нагрузки (wordpress-1/wordpress-2), чтобы следовать этому руководству, и что вы можете добавить больше подчиненных баз данных, если хотите.

Настройте репликацию MySQL Master-Slave

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

Создание MySQL Slave VPS, mysql-2

Вы захотите создать новый VPS, который будет действовать как подчиненный сервер MySQL — для справочных целей мы назовем этот сервер mysql-2. Подчиненный сервер будет настроен на репликацию всех баз данных вашего главного сервера MySQL, включая вашу базу данных WordPress.

На mysql-2 установите программное обеспечение MySQL:

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

Введите пароль root для вашей установки MySQL. Далее мы настроим наш главный сервер MySQL.

Настройте существующий сервер MySQL в качестве главного

Первый шаг — настроить существующий сервер базы данных MySQL, mysql-1, с конфигурацией мастера репликации.

В mysql-1 отредактируйте файл конфигурации MySQL:

sudo vi /etc/mysql/my.cnf

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

<пред>

  • bind-address: IP-адрес, который будет прослушиваться MySQL. Это уже должно быть установлено на частный IP-адрес mysql-1 из исходной настройки
  • идентификатор_сервера: уникальный идентификатор сервера. Поскольку это главный сервер, мы хотим оставить значение «1» и раскомментировать эту строку
  • log_bin: расположение двоичного файла журнала. Двоичный журнал используется для отправки изменений данных от ведущего к ведомому для репликации. Раскомментируйте эту строку

Три строки должны выглядеть так (не забудьте заменить выделенное на частный IP-адрес сервера базы данных):

<пред>

При желании, если вы хотите ограничить репликацию базой данных wordpress, в частности, добавьте следующую строку в свою конфигурацию (заменив выделенное на желаемое имя базы данных):

<пред>

Сохранить и выйти. Чтобы эти изменения вступили в силу, перезапустите mysql с помощью следующей команды:

sudo service mysql restart

Подключитесь к консоли MySQL с помощью следующей команды, затем введите пароль при появлении запроса:

mysql -u root -p

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

<пред>

Пока не выходите из консоли MySQL!

Экспорт резервной копии MySQL Master

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

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

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

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

Скопируйте файл masterdump.sql на подчиненный сервер mysql-2, используя scp:

<пред>

Войдите в консоль MySQL mysql-1 еще раз:

mysql -u root -p

В командной строке MySQL разблокируйте базу данных:

SET GLOBAL read_only = OFF;
UNLOCK TABLES;

Теперь запустите этот оператор, чтобы распечатать информацию, которая вам понадобится для настройки подчиненного устройства MySQL:

<пред>

Запишите значения Файл и Позиция, так как они понадобятся вам при настройке подчиненного сервера. Давайте теперь переключимся на mysql-2.

Настроить ведомое устройство MySQL

Теперь мы хотим импортировать основную базу данных в нашу подчиненную, чтобы синхронизировать их при подготовке к репликации.

В mysql-2 выполните эту команду, чтобы импортировать файл masterdump.sql:

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

Далее мы настроим mysql-2 в качестве подчиненного сервера репликации. В mysql-2 отредактируйте файл конфигурации MySQL:

sudo vi /etc/mysql/my.cnf

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

<пред>

  • bind-address: IP-адрес, который будет прослушиваться MySQL. Установите частный IP-адрес mysql-2
  • идентификатор_сервера: уникальный идентификатор сервера. Поскольку это главный сервер, измените это значение на 2 и раскомментируйте эту строку

Две строки должны выглядеть так (не забудьте заменить выделенное на частный IP-адрес сервера базы данных):

<пред>

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

sudo service mysql restart

Войдите в консоль MySQL:

mysql -u root -p

Далее мы подключим слейв к мастеру. Требуются пять следующих значений:

  • MASTER_HOST: установите частный IP-адрес mysql-1
  • MASTER_USER: укажите пользователя репликации, созданного нами на главном сервере, repl
  • MASTER_PASSWORD: установите пароль repl, который следует заменить вашим собственным паролем
  • MASTER_LOG_FILE: установите значение \Файл, указанное при запуске SHOW MASTER STATUS; на главном сервере MySQL
  • MASTER_LOG_POS: установите \Положение, указанное при запуске SHOW MASTER STATUS; на главном сервере MySQL

Следующий оператор соединяет подчиненное устройство с главным сервером и требует, чтобы вы заменили все выделенные поля соответствующими значениями:

<пред>

Если этот оператор выполнен правильно, запустите эту команду, чтобы инициировать ведомое соединение:

START SLAVE;

Теперь ваш сервер mysql-2 должен быть подключен как ведомый! Выполните следующую команду, чтобы проверить, работает ли репликация:

SHOW SLAVE STATUS\G

Отозвать права записи у подчиненных пользователей

Это необязательно, так как подключаемый модуль HyperDB можно настроить только для чтения с вашего подчиненного сервера базы данных, но вы можете захотеть отозвать привилегии записи у пользователей вашей базы данных wordpressuser в вашей подчиненной базе данных (поскольку обновления вашей подчиненной базы данных будут не реплицироваться на ваш мастер, если вы случайно каким-то образом обновите свой слейв).

В mysql-2 из консоли MySQL выполните следующую инструкцию, чтобы получить список пользователей вашей базы данных:

<пред>

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

<пред>

В этом примере у нас есть один wordpressuser для каждого сервера WordPress, поэтому мы отзовем команды insert, update и delete . привилегии каждого из них (\wordpress — это имя нашей базы данных в этом примере):

<пред>

Теперь ваша настройка репликации MySQL завершена. Давайте перейдем к настройке WordPress для правильного использования обоих серверов баз данных.

Установить и настроить ГиперБД

Мы будем использовать HyperDB, чтобы определить, куда отправлять обновления (ваша основная база данных) и запросы на чтение (ваш главный и подчиненный). Давайте загрузим его в ваш домашний каталог из каталога плагинов WordPress (также установите zip/unzip, чтобы разархивировать его):

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

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

<пред>

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

<пред>

Первое вхождение DB_HOST определяет главный сервер базы данных, а второе вхождение определяет подчиненный сервер базы данных (обозначается write => 0,). Замените второе вхождение DB_HOST на DB_SLAVE_1:

<пред>

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

<пред>

Найдите строку, определяющую DB_HOST, и добавьте под ней следующую строку, заменив частный IP-адрес подчиненного устройства (mysql-2):

<пред>

Затем сохраните и выйдите.

Завершите установку HyperDB, скопировав файл db.php в каталог wp-content в вашей установке WordPress, а затем отключив доступ для записи к нему:

<пред>

Затем обновите права собственности на ваши файлы WordPress до соответствующих значений (в этом руководстве мы использовали www-data для прав пользователя/группы):

<пред>

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

Заключение

Теперь, когда вы завершили репликацию MySQL и настройку HyperDB, ваша среда базы данных сможет обрабатывать увеличенный трафик чтения, то есть большее количество одновременных пользователей! Помните, что вы можете добавить больше подчиненных серверов MySQL, если хотите еще больше увеличить объем обслуживания базы данных.

Митчел Аникас