Мы используем 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), а узел управления находится на другом хосте.