Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Межнодовое взаимодействие. Тонкости работы с Mnesia в кластере.

1,161 views

Published on

  • Hello there! Get Your Professional Job-Winning Resume Here! http://bit.ly/topresum
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Межнодовое взаимодействие. Тонкости работы с Mnesia в кластере.

  1. 1. МЕЖНОДОВОЕ ВЗАИМОДЕЙСТВИЕ. ХРАНЕНИЕ ДАННЫХ В Erlang. ТОНКОСТИ РАБОТЫ С MNESIA В КЛАСТЕРЕ. Рябков Антон инженер-программист anton.ryabkov@gmail.comФевраль 2013 www.eltex.nsk.ru
  2. 2. Знакомство с Erlang• Функциональный язык• Отсутствие переменных :=
  3. 3. Знакомство с Erlang• Легковесные процессы• Легкий параллелизм• Кроссплатформенность
  4. 4. Erlang – нода, кластер name1@host1 connect (cookie) name2@host2 <ProcessID_1> <PID_3> Msgs Msgs queue <PID_1> ! Msg <PID_2> ! Msg<PID_2> Msgs <PID_4> Msgs
  5. 5. Межнодовое взаимодействие• Необходимые условия для межнодового взаимодействия: – каждая из нод может доступиться до соседней ноды по имени хоста; – cookie должны совпадать, или одна из нод должна знать cookie другой ноды; – ноды должны быть связаны (connected) между собой• Межнодовое взаимодействие осуществляется через посылку сообщений между процессами разных нод• В качестве транспорта выступает протокол TCP по одному из сетевых интерфейсов
  6. 6. Способы хранение данных в Erlang
  7. 7. Состояние Erlang – процесса Мое мысли,• Наибольшая только я имею к скорость доступа ним доступ• Эксклюзивный доступ• Ограниченный размер
  8. 8. ETS – Erlang Term Storage– key – value хранилище в памяти; Именованные– типы хранилища: ETS set, order_set, bag, duplicate_bag; private private– отсутствует транзакционность;– отсутствует репликация;– не переживает падение owner- процесса
  9. 9. DETS – Disk ETS Книга поможет– key – value хранилище освежить на диске; воспоминания…– могут быть доступны и не мне одному для нескольких процессов;– отсутствует транзакционность;– репликация на диск;– требует явной операции открытия/закрытия;
  10. 10. Mnesia• поддерживаемые типы хранилища: RAM- only, disc-only, disc and RAM;• транзакционность;• реплицирование данных на ноды кластера;• индексированные поля;• изменение структуры данных «на лету»;• гибкий механизм запросов;• нативная поддержка в Erlang, не требует сериализации данных
  11. 11. Mnesia schema• состоит из описаний таблиц (имена, типы таблиц, тип хранилища, вид репликаций и т.п.);• позволяет добавлять/изменять/удалять таблицы «на лету»;• позволяет изменять состав mnesia-кластера на лету
  12. 12. Пример запуска первой ноды1. -record(paint, {sid, artist, title, year}).2. mnesia:create_schema([test@host1, test@host2]),3. mnesia:start().4. mnesia:create_table(painting, [5. {record_name, paint},6. {type, set},7. {disc_copies, [test@host1, test@host2]},8. {attributes, record_info(fields, paint)},9. {index, [#paint.artist, #paint.year]}]).
  13. 13. Транзакции в mnesia1. -record(paint, {sid, artist}).2. DoFun1 = fun() ->3. io:format(“Start fun1~n”),4. mnesia:write(paining,5. {paint, sid=1, artist=“Tolstoy”}, write),6. io:format(“Wrote Tolstoy~n”),7. mnesia:write(paining,8. {paint, sid=3, artist=“Gogol”}, write),9. io:format(“Wrote Gogol~n”)10.end.11.DoFun2 = fun() ->12. io:format(“Start fun2~n”),13. mnesia:write(paining,14. {paint, sid=2, artist=“Pushkin”}, write),15. io:format(“Wrote Pushkin~n”),16. mnesia:write(paining,17. {paint, sid=3, artist=“Gogol”}, write),18. io:format(“Wrote Gogol~n”)19.end.
  14. 14. Пример запуска второй ноды1. mnesia:start().2. case mnesia:wait_for_tables([painting], 20000) of3. {timeout, RemainingTabs} ->4. % Насильно загружаем данные с диска5. mnesia:force_load_table([painting]);6. ok ->7. synced8. end.
  15. 15. Запросы в mnesia1. -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. 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).
  17. 17. mnesia:start(). mnesia:start(). Итог • Для хранение небольшого количества оперативных данных, эксклюзивных для процесса – используйте state процесса
  18. 18. mnesia:start(). mnesia:start(). Итог • Если вам необходимо быстрое key-value хранилище… • иметь разделяемый доступ из разных процессов в рамках одной ноды… • объемом данных не превышающих 2GB… • без необходимости сохранять данные между перезапусками системы… • выбирайте ETS! • Если вам необходимо сохранять данные между перезапусками системы – DETS ваш выбор.
  19. 19. mnesia:start(). mnesia:start(). Итог Если вам нужно быстрое хранилище данных, реплицируемое, распределенное, отказоустойчивое, гибкое в своих настройках – mnesia ваш выбор.
  20. 20. Спасибо за внимание!Февраль 2013 www.eltex.nsk.ru

×