Очень большие столы Mnesia в производстве - PullRequest
18 голосов
/ 17 августа 2011

Мы используем Mnesia в качестве основной базы данных для очень большой системы. Фрагментированные таблицы Mnesia вели себя так хорошо в течение периода тестирования. Система имеет около 15 таблиц, каждая из которых реплицирована на 2 сайта (узла), и каждая таблица сильно фрагментирована. Во время фазы тестирования (которая была сосредоточена на тестах доступности, эффективности и нагрузки), мы приняли Mnesia с ее многочисленными преимуществами сложных структур, которые будут полезны для нас, учитывая, что все наши приложения, работающие поверх службы, являются приложениями Erlang / OTP. Мы используем Yaws 1.91 в качестве основного WebServer.

Для эффективной настройки Fragmented Tables мы использовали ряд ссылок, которые использовали mnesia в больших системах:
Это: Блог Мнезии спустя год , Часть 2 блога , Следил за этим даже здесь , О хешировании . Эти посты в блоге помогли нам отрегулировать кое-что для лучшей производительности.

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

В некоторых наших таблицах у нас есть 64 фрагмента. с n_disc_only_copies, установленным на число узлов в кластере, чтобы каждый узел имел копию для каждого фрагмента. Это помогло нам решить проблемы с ошибкой записи mnesia, если данный узел недоступен в одно мгновение. Также в вышеприведенном блоге он предполагает, что the number of fragments should be a power of 2, это утверждение (он говорит) было исследовано на основе того, как mnesia хэширует записи. Нам, однако, нужно больше пояснений по этому вопросу, и о какой степени двух здесь идет речь: 2,4,16,32,64,128, ...?

Система предназначена для работы на HP Proliant G6, содержащей процессоры Intel (2 процессора, каждые 4 ядра, скорость 2,4 ГГц каждое ядро, размер кэша 8 МБ), объем ОЗУ 20 ГБ, дисковое пространство 1,5 ТБ. Теперь 2 из этих мощных машин находятся в нашем распоряжении. Системная база данных должна быть реплицирована через два. Каждый сервер работает под управлением Solaris 10, 64 бит.

При каком количестве фрагментов производительность mnesia может ухудшиться? Это нормально, если мы увеличим количество фрагментов с 64 до 128 для данной таблицы? как насчет 65536 фрагментов (2 ^ 16)? Как мы масштабируем нашу мнезию, чтобы использовать пространство в терабайтах с помощью фрагментации?

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

ПРИМЕЧАНИЕ. Все таблицы, в которых хранятся миллионы записей, создаются в формате disc_only_copies, поэтому проблем с ОЗУ нет. ОЗУ будет достаточно для нескольких таблиц ОЗУ, которые мы запускаем. Другие СУБД, такие как MySQL Cluster и CouchDB, также будут содержать данные и используют то же оборудование с нашей СУБД Mnesia. MySQL Cluster реплицируется на два сервера (каждый из которых содержит два узла NDB, сервер MySQL), а узел управления находится на другом хосте.

1 Ответ

14 голосов
/ 18 августа 2011

Намек на наличие степени числа двух фрагментов просто связан с тем фактом, что модуль фрагментации по умолчанию mnesia_frag использует линейное хеширование, поэтому использование 2 ^ n фрагментов гарантирует, что записи равномерно распределены (более или менее, очевидно) междуфрагменты.

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

Говоря о масштабировании чисел фрагментов Mnesia, помните, что при использовании disc_only_copies большую часть времени тратится на две операции:

  • решить, какой фрагмент будет содержать какую запись

  • извлечь запись из соответствующей таблицы dets (Mnesia backend)

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

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

...