Глава 3. Разработка

В кластере Shardman используются два основных способа хранения данных: в виде сегментированных таблиц — основной и предназначен для больших данных; в виде глобальных таблиц — дополнительный, предназначен для небольших словарей. Сегментированная таблица содержит разные части данных в каждом сегменте, тогда как глобальная таблица содержит одни и те же данные во всех сегментах. Эффективное выполнение запроса в кластере Shardman требует правильного распределения данных по сегментам кластера и, прежде всего, правильного выбора ключа сегментирования.

При переходе от обычной схемы базы данных к распределённой имеет смысл начать проектирование с того, как данные будут распределяться в кластере Shardman. Shardman распределяет строки таблиц по сегментам в соответствии с хеш-значением столбца, который будет использоваться для секционирования таблицы. Другими словами, желаемое распределение должно быть равномерным и направленным на равномерное распределение как частей данных по узлам кластера, так и рабочей нагрузки.

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

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

Кроме того, при выборе ключа сегментирования важно, чтобы он не менялся, поскольку операция повторного сегментирования, то есть смены ключа сегментирования, довольно трудоёмкая и ресурсоёмкая. В настоящее время в Shardman нет способов автоматизации этой процедуры. Если требуется повторное сегментирование, данные во всех сегментированных таблицах следует либо переместить в локальные таблицы, либо в сегментированные таблицы с другим ключом сегментирования. То есть придётся создавать новые сегментированные таблицы с новым ключом сегментирования и переместить данные обратно. Эта операция очень дорогая и ресурсоёмкая и часто её невозможно выполнить без отключения системы во время миграции.

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

И, наконец, Shardman — это распределённая система, имеющая как преимущества, так и недостатки, присущие таким системам. Shardman в первую очередь предназначена для OLTP-нагрузки. Простые OLAP-запросы к Shardman также возможны (подробнее см. limitations). Если нужно использовать OLAP-функциональность в OLTP-системе, имейте в виду, что список аналитических и агрегатных SQL-функций для отправки и исполнения в других сегментах, сильно ограничен.

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

Учитывая вышеизложенные особенности и ограничения РСУБД, приведём два простых примера перехода от обычной к распределённой схеме базы данных.