Hyperdb - это замена стандартоного класса wpdb
, позволяющая использовать несколько баз данных.
В данной статье я опишу настройку hyperdb для распределенной инфраструктуры, состоящей из двух frontend серверов и двух серверов баз данных на базе дистрибутивов Debian 6, в качестве основной задачи ставилось не только распределение запросов на чтение между серверами БД, но и отслеживания отставаний слэйв сервера и, в случае отставания, чтение актуальных данных с мастера.
Настройка самих фронтендов оставим за кадром, т.к. это выходит за рамки данной статьи. Что касается серверов БД, то мы будем использовать мастер-слэйв репликацию и mk-heartbeat для отслеживания lag-ов на слэйве. Сервера геораспределены и каждый сервер БД располагается в отдельном ДЦ в паре с фронтендом. На настройке баз я остановлючь подробнее:
Настройка репликации DB:
Здесь не описано ничего принципиально нового. Используется стандартная репликация Мастер-Слэйв средствами MySql.
Все, описанные ниже команды выполнялись под пользователем root
, что является не безопасным. Будьте осторожны, при работе под суперпользователем.
Устанавливаем сервер баз данных и пакет с mk-hertbeat
:
Далее, используя документацию создаём базу wordpress на db1.
Этот сервер будет мастером. В файл /etc/mysql/my.cnf
в секции [mysqld] необходимо добавить:
Далее надо перезапустить mysql:
Теперь блокируем базу на запись, чтобы избежать рассинхронизации до окончания настройки репликации:
После этого делаем дамп базы wordpress и копируем на слэйв сервер БД (db2).
На db1 создаём пользователя для репликации:
Из вывода последней команды нам понадобится Position
и File
для конфигурации репликации на втором сервере БД.
На втором сервере(db2) в /etc/mysql/my.cnf
в секции [mysqld] необходимо добавить:
На db2 выполняем следующие команды подставляя значения из вывода SHOW MASTER STATUS
c db1:
Проверяем, что репликация работает:
В выводе должно присутствовать:
Если видим эти строки, то можно включать мастер БД(db1) на чтение:
Переходим к настройке Hyperdb.
Установка и настройка Hyperdb:
Сама установка класса проста и не затейлива.
Скачиваем архивчик с классами с официального сайта Wordpress. Распаковываем на всех web-серверах. В архиве всего 3 файла: db-config.php
, db.php
, readme.txt
.
Правим конфигурационный файл для web1 (он находится в том же сегменте, что и db1, т.е. рядом с мастером):
Такая конфигурация позволит читать с ближайшего сервера или со слейва, если мастер будет не доступен. Конфиг для web2:
Теперь, если скопировать конфиги в корень wordpress, а db.php
в директорию /wp-content/
, то мы уже начнём работать с БД по распределенной схеме.
Но цель данной статьи не просто распределять запросы на чтение по разным БД, но и реагировать на отставание слэйв-сервера, чтобы отдавать посетителям максимально актуальные данные.
Настройка обнаружения отсутствия слейва для hyperdb:
Первое что хочу отметить, что настраивать обнаружение лагов мы будем только для web2, т.к. web1 ходит читать в мастер, а в слэйв только по крайней необходимости и в таком случае лучше читать хоть что-то, чем вообще не вернуть никаких данных, хоть бы и не актуальных.
В конфиге db-config.php
уже есть пример функций, позволяющих отслеживать лаги слэйва. Я лишь немного опишу процесс и как настроить сервера БД, чтобы эти функции работали и работали правильно. Для наглядности сразу приведу эти функции, которые нам надо будет добавить в конец файла db-config.php
на web2:
db-config.php
Итак, как работает отслеживание:
- Перед тем, как устанавливать соединение с базой, мы смотрим нет ли у нас данных в кэшэ о статусе её отставания.
Время жизни кэша задаётся через
$wpdb->lag_cache_ttl
. Использования кэша позволяет нам не генерировать дополнительных запросов в базу без необходимости. - Если данных нет или кэш протух, проверяем отставание с помощью запроса к табличке heartbeat. Получаем время отставания и записываем в кэш.
- Первая или вторая функция вернёт нам время отставания слэйва. Оно сравнивается с
lag_threshold
, которое определяется при добавлении сервера в конфиге. - Если время отставания не превышает
lag_threshold
, то читаем со слэйва, в противном случае закрываем все соединения с этой базой и читаем с мастера.
Конфиг поправили, как работает поняли. Осталось настроить mk-heartbeat
для мониторинга отставания.
Настройка mk-heartbeat
mk-heartbeat - утилита, входящая в пакет maatkit
, для мониторинга лагов репликации баз данных. В начале статьи мы уже установили нужный пакет на мастер(db1).
Два слова о том, как происходит мониторинг:
- Демон, запущенный на мастере, раз в дельту времени пишет timestamp в табличку heartbeat в реплицируемой базе данных.
- Средствами репликации эти данные попадают на слейв.
- Функция get_lag, в hyperdb, сравнивает текущий timestamp с записью в табличке, получая время расхождения репликации.
Запускаем демон. Он автоматически создаст нужную таблицу:
Эта команда запустит демон, который создаст таблицу heartbeat в базе wordpress и будет записывать timestamp раз в 27 секунд (этого достаточно для проверки отставания не более минуты).
При желании можно обернуть запуск демона в инит-скрипт и запускать при старте сервера.
Собственно теперь мы отслеживаем лаги репликации и отдаём пользователям наисвежайшие данные из баз.