Матвей Мальков «Ещё один поиск контактов на Android»
Межнодовое взаимодействие. Тонкости работы с Mnesia в кластере.
1. МЕЖНОДОВОЕ ВЗАИМОДЕЙСТВИЕ.
ХРАНЕНИЕ ДАННЫХ В Erlang.
ТОНКОСТИ РАБОТЫ С MNESIA В КЛАСТЕРЕ.
Февраль 2013 www.eltex.nsk.ru
Рябков Антон
инженер-программист
anton.ryabkov@gmail.com
5. Межнодовое взаимодействие
• Необходимые условия для межнодового
взаимодействия:
– каждая из нод может доступиться до соседней ноды по
имени хоста;
– cookie должны совпадать, или одна из нод должна
знать cookie другой ноды;
– ноды должны быть связаны (connected) между собой
• Межнодовое взаимодействие осуществляется через
посылку сообщений между процессами разных нод
• В качестве транспорта выступает протокол TCP по
одному из сетевых интерфейсов
7. Состояние Erlang – процесса
Мое мысли,
только я имею к
ним доступ
• Наибольшая
скорость доступа
• Эксклюзивный
доступ
• Ограниченный
размер
8. ETS – Erlang Term Storage
– key – value
хранилище в памяти;
– типы хранилища:
set, order_set, bag,
duplicate_bag;
– отсутствует
транзакционность;
– отсутствует
репликация;
– не переживает
падение owner-
процесса
private
private
Именованные
ETS
9. DETS – Disk ETS
Книга поможет
освежить
воспоминания…
и не мне одному
– key – value хранилище
на диске;
– могут быть доступны
для нескольких
процессов;
– отсутствует
транзакционность;
– репликация на диск;
– требует явной операции
открытия/закрытия;
10. Mnesia
• поддерживаемые типы хранилища: RAM-
only, disc-only, disc and RAM;
• транзакционность;
• реплицирование данных на ноды кластера;
• индексированные поля;
• изменение структуры данных «на лету»;
• гибкий механизм запросов;
• нативная поддержка в Erlang, не требует
сериализации данных
11. Mnesia schema
• состоит из описаний таблиц (имена, типы
таблиц, тип хранилища, вид репликаций и
т.п.);
• позволяет добавлять/изменять/удалять
таблицы «на лету»;
• позволяет изменять состав mnesia-кластера
на лету
14. Пример запуска второй ноды
1. mnesia:start().
2. case mnesia:wait_for_tables([painting], 20000) of
3. {timeout, RemainingTabs} ->
4. % Насильно загружаем данные с диска
5. mnesia:force_load_table([painting]);
6. ok ->
7. synced
8. end.
15. Запросы в mnesia
1. -record(paint, {sid, artist, title, year}).
2. MatchHead = #paint{artist = “Tolstoy”, title = ‘$1’,
3. year = ‘$2’ _ = ‘_’},
4. Guard = {‘>’, '$2', 1900},
5. Result = ‘$1’,
6. mnesia:select(paining,[{MatchHead, [Guard], [Result]}]).
7. qlc:q([T || #paint{artist = A, title = T, year = Y}
8. <- mnesia:table(paining), A = “Tolstoy”, Y > 1900]).
16. Пример переконфигурирования
таблицы
1. -record(paint2, {sid, artist_name, title, cost}).
2. Transformer =
3. fun(#paint{sid = S, artist = A, title = T}) ->
4. #paint2{sid = S, artist_name = A,
5. title = T, cost = 0}
6. end,
7. mnesia:del_table_index(painting, artist),
8. {atomic, ok} = mnesia:transform_table(painting,
9. Transformer,
10. record_info(fields, paint2),
11. paint2),
12.{atomic, ok} = mnesia:add_table_index(artist_name).
18. Итог
mnesia:start().
mnesia:start().
• Если вам необходимо быстрое key-value
хранилище…
• иметь разделяемый доступ из разных
процессов в рамках одной ноды…
• объемом данных не превышающих 2GB…
• без необходимости сохранять данные между
перезапусками системы…
• выбирайте ETS!
• Если вам необходимо сохранять данные
между перезапусками системы – DETS ваш
выбор.