SlideShare ist ein Scribd-Unternehmen logo
1 von 20
Downloaden Sie, um offline zu lesen
МЕЖНОДОВОЕ ВЗАИМОДЕЙСТВИЕ.
ХРАНЕНИЕ ДАННЫХ В Erlang.
ТОНКОСТИ РАБОТЫ С MNESIA В КЛАСТЕРЕ.
Февраль 2013 www.eltex.nsk.ru
Рябков Антон
инженер-программист
anton.ryabkov@gmail.com
Знакомство с Erlang
• Функциональный язык
• Отсутствие переменных
:=
Знакомство с Erlang
• Легковесные процессы
• Легкий параллелизм
• Кроссплатформенность
Erlang – нода, кластер
name1@host1
<ProcessID_1>
Msgs
queue
Msgs
<PID_2>
<PID_1> ! Msg
name2@host2
Msgs
<PID_3>
Msgs
<PID_4>
<PID_2> ! Msg
connect (cookie)
Межнодовое взаимодействие
• Необходимые условия для межнодового
взаимодействия:
– каждая из нод может доступиться до соседней ноды по
имени хоста;
– cookie должны совпадать, или одна из нод должна
знать cookie другой ноды;
– ноды должны быть связаны (connected) между собой
• Межнодовое взаимодействие осуществляется через
посылку сообщений между процессами разных нод
• В качестве транспорта выступает протокол TCP по
одному из сетевых интерфейсов
Способы хранение данных в Erlang
Состояние Erlang – процесса
Мое мысли,
только я имею к
ним доступ
• Наибольшая
скорость доступа
• Эксклюзивный
доступ
• Ограниченный
размер
ETS – Erlang Term Storage
– key – value
хранилище в памяти;
– типы хранилища:
set, order_set, bag,
duplicate_bag;
– отсутствует
транзакционность;
– отсутствует
репликация;
– не переживает
падение owner-
процесса
private
private
Именованные
ETS
DETS – Disk ETS
Книга поможет
освежить
воспоминания…
и не мне одному
– key – value хранилище
на диске;
– могут быть доступны
для нескольких
процессов;
– отсутствует
транзакционность;
– репликация на диск;
– требует явной операции
открытия/закрытия;
Mnesia
• поддерживаемые типы хранилища: RAM-
only, disc-only, disc and RAM;
• транзакционность;
• реплицирование данных на ноды кластера;
• индексированные поля;
• изменение структуры данных «на лету»;
• гибкий механизм запросов;
• нативная поддержка в Erlang, не требует
сериализации данных
Mnesia schema
• состоит из описаний таблиц (имена, типы
таблиц, тип хранилища, вид репликаций и
т.п.);
• позволяет добавлять/изменять/удалять
таблицы «на лету»;
• позволяет изменять состав mnesia-кластера
на лету
Пример запуска первой ноды
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]}]).
Транзакции в mnesia
1. -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.
Пример запуска второй ноды
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.
Запросы в 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]).
Пример переконфигурирования
таблицы
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).
Итог
mnesia:start().
mnesia:start().
• Для хранение небольшого количества
оперативных данных, эксклюзивных для
процесса – используйте state процесса
Итог
mnesia:start().
mnesia:start().
• Если вам необходимо быстрое key-value
хранилище…
• иметь разделяемый доступ из разных
процессов в рамках одной ноды…
• объемом данных не превышающих 2GB…
• без необходимости сохранять данные между
перезапусками системы…
• выбирайте ETS!
• Если вам необходимо сохранять данные
между перезапусками системы – DETS ваш
выбор.
Итог
mnesia:start().
mnesia:start().
Если вам нужно быстрое хранилище данных,
реплицируемое,
распределенное,
отказоустойчивое,
гибкое в своих настройках –
mnesia ваш выбор.
Спасибо за внимание!
Февраль 2013 www.eltex.nsk.ru

Weitere ähnliche Inhalte

Mehr von DevDay

«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений Тютюев«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений ТютюевDevDay
 
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий МузюкинDevDay
 
«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья Пастушков«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья ПастушковDevDay
 
Фреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр БирюковФреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр БирюковDevDay
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковDevDay
 
Devops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим ПашукDevops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим ПашукDevDay
 
Inversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий КожевниковInversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий КожевниковDevDay
 
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
«Используем неизменяемые данные и создаем качественный код», Игорь КудринDevDay
 
«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных«Велогосипед», Данил Ильиных
«Велогосипед», Данил ИльиныхDevDay
 
«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим БерёзкинDevDay
 
«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета АлексеенкоDevDay
 
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша РоманенкоМанипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша РоманенкоDevDay
 
Лабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим ИпполитовЛабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим ИпполитовDevDay
 
«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя Пономарёв«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя ПономарёвDevDay
 
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев «Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев DevDay
 
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...DevDay
 
«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел Сташевский«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел СташевскийDevDay
 
«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья ТаратухинDevDay
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис РечкуновDevDay
 
Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»DevDay
 

Mehr von DevDay (20)

«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений Тютюев«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений Тютюев
 
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
 
«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья Пастушков«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья Пастушков
 
Фреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр БирюковФреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр Бирюков
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей Солодовников
 
Devops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим ПашукDevops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим Пашук
 
Inversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий КожевниковInversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий Кожевников
 
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин
 
«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных
 
«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин
 
«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко
 
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша РоманенкоМанипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
 
Лабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим ИпполитовЛабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим Ипполитов
 
«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя Пономарёв«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя Пономарёв
 
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев «Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
 
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
 
«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел Сташевский«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел Сташевский
 
«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
 
Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»
 

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

  • 1. МЕЖНОДОВОЕ ВЗАИМОДЕЙСТВИЕ. ХРАНЕНИЕ ДАННЫХ В Erlang. ТОНКОСТИ РАБОТЫ С MNESIA В КЛАСТЕРЕ. Февраль 2013 www.eltex.nsk.ru Рябков Антон инженер-программист anton.ryabkov@gmail.com
  • 2. Знакомство с Erlang • Функциональный язык • Отсутствие переменных :=
  • 3. Знакомство с Erlang • Легковесные процессы • Легкий параллелизм • Кроссплатформенность
  • 4. Erlang – нода, кластер name1@host1 <ProcessID_1> Msgs queue Msgs <PID_2> <PID_1> ! Msg name2@host2 Msgs <PID_3> Msgs <PID_4> <PID_2> ! Msg connect (cookie)
  • 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-кластера на лету
  • 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. Транзакции в mnesia 1. -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. Пример запуска второй ноды 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).
  • 17. Итог mnesia:start(). mnesia:start(). • Для хранение небольшого количества оперативных данных, эксклюзивных для процесса – используйте state процесса
  • 18. Итог mnesia:start(). mnesia:start(). • Если вам необходимо быстрое key-value хранилище… • иметь разделяемый доступ из разных процессов в рамках одной ноды… • объемом данных не превышающих 2GB… • без необходимости сохранять данные между перезапусками системы… • выбирайте ETS! • Если вам необходимо сохранять данные между перезапусками системы – DETS ваш выбор.
  • 19. Итог mnesia:start(). mnesia:start(). Если вам нужно быстрое хранилище данных, реплицируемое, распределенное, отказоустойчивое, гибкое в своих настройках – mnesia ваш выбор.