Мы используем Mnesia в качестве основной базы данных для очень большой системы. Фрагментированные таблицы Mnesia показали себя очень хорошо за период тестирования. В системе около 15 таблиц, каждая из которых реплицируется на 2 сайта (узлы), и каждая таблица сильно фрагментирована. На этапе тестирования (которое сосредоточено на тестах доступности, эффективности и нагрузки) мы приняли Mnesia с ее многочисленными преимуществами сложных структур, которые нам подойдут, учитывая, что все наши приложения, работающие поверх службы, являются приложениями Erlang / OTP. Мы используем Yaws 1.91 в качестве основного веб-сервера.
Для эффективной настройки фрагментированных таблиц мы использовали ряд ссылок, которые использовали мнезию в больших системах:
Это: Блог Mnesia One Year Later , Часть 2 блога , Читали даже здесь , О хешировании . Эти сообщения в блоге помогли нам настроить здесь и там лучшую производительность.
Теперь проблема. У Mnesia есть ограничения на размер стола, да, мы согласны. Однако об ограничениях на количество фрагментов нигде не упоминалось. По соображениям производительности и для обслуживания больших объемов данных о том, сколько фрагментов сохранит мнезию «в порядке»?
В некоторых из наших таблиц у нас есть 64 фрагмента. с n_disc_only_copies
, установленным на количество узлов в кластере, так что каждый узел имеет копию на фрагмент. Это помогло нам решить проблемы, связанные с ошибкой записи mnesia, если данный узел в данный момент недоступен. Также в блоге выше он предлагает, чтобы количество фрагментов было степенью двойки
, это утверждение (он говорит) было исследовано на основе того, как mnesia выполняет хеширование записей. Однако нам нужно больше пояснений по этому поводу, и о какой степени двойки здесь идет речь: 2,4,16,32,64,128, ...?
Система предназначена для работы на HP Proliant G6, содержащем процессоры Intel (2 процессора по 4 ядра, частота 2,4 ГГц на каждое ядро, размер кэша 8 МБ), размер ОЗУ 20 ГБ, дисковое пространство 1,5 терабайта. Сейчас в нашем распоряжении 2 таких мощных машины. Системная база данных должна быть реплицирована между ними двумя. На каждом сервере работает 64-разрядный Solaris 10.
При каком количестве фрагментов производительность mnesia может начать снижаться? Можно ли увеличить количество фрагментов с 64 до 128 для данной таблицы? как насчет 65536 фрагментов (2 ^ 16)? Как мы масштабируем нашу мнезию, чтобы использовать терабайтное пространство с помощью фрагментации?
Пожалуйста, дайте ответы на вопросы, и вы можете дать совет по любым другим параметрам, которые могут улучшить Систему.
ПРИМЕЧАНИЕ: Все таблицы, которые должны содержать миллионы записей, созданы в disc_only_copies
типа, так что проблем с оперативной памятью нет. ОЗУ будет достаточно для нескольких запускаемых нами таблиц ОЗУ. Другие СУБД, такие как MySQL Cluster и CouchDB, также будут содержать данные и используют то же оборудование, что и наша СУБД Mnesia. Кластер MySQL реплицируется на два сервера (каждый из которых содержит два узла NDB, сервер MySQL), причем узел управления находится на другом ХОСТЕ.