Распределенное приложение.

154 views
Skip to first unread message

begemot_sun

unread,
Nov 13, 2015, 8:32:13 AM11/13/15
to Erlang по-русски
Добрый день/вечер/ночь.

На данный момент есть приложение, которое работает внутри одной ноды.
Там есть всякие таблички ETS, есть сервисные процессы которые хранят свой стейт в таких табличках, и в случае падения и восстановления супервизором, восстанавливают своё состояние из этих ETS-таблиц.

Из распределенных вещей используется только gproc. Т.е. я могу относительно адресовать pid сервисных процессов.

Заказчик захотел сделать распределенное приложение, которое работает одновременно на двух и более нодах.
Понятно что ETS мы заменяем распределенными таблицами Mnesia с транзакциями.

Непонятно одно, как в случае падения одной ноды (главной на которой есть часть сервисных процессов) можно сразу восстановить их на другой ноде (из ETS/mnesia таблиц) ?
или иметь каждый сервисный процесс на каждой ноде (что то типа gen_leader) ? 

Есть ли стандартные решения для такой задачи?
Посоветуйте, как лучше организовать распределенность (планирую что каждая нода будет равноправной в кластере).

Спасибо.

begemot_sun

unread,
Nov 16, 2015, 3:34:14 AM11/16/15
to Erlang по-русски
Подниму ка я тему. Спасибо.

пятница, 13 ноября 2015 г., 16:32:13 UTC+3 пользователь begemot_sun написал:

Aleksey Kluchnikov

unread,
Nov 16, 2015, 4:11:36 AM11/16/15
to erlang-russian
Я уже описывал исторически сложившийся подход у нас.
Идей в том что снабжаем каждый процесс уникальным идентификатором. И по этому идентификатору процессы шардятся по нодам. У нас хеш ринг используется для шарда. Все это выдлядит как get_proc_node(ProcId) -> Node. Работает хорошо, стабильно, но много минусов. Решардиг на ходу не тривиален и надо пилить, автоматически не резервируются ноды, тоже надо что то инфраструктурное припиливать.

16 ноября 2015 г., 11:34 пользователь begemot_sun <logu...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russia...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

begemot_sun

unread,
Nov 16, 2015, 4:19:49 AM11/16/15
to Erlang по-русски
понедельник, 16 ноября 2015 г., 12:11:36 UTC+3 пользователь Aleksey Kluchnikov написал:
Я уже описывал исторически сложившийся подход у нас.
Идей в том что снабжаем каждый процесс уникальным идентификатором. И по этому идентификатору процессы шардятся по нодам. У нас хеш ринг используется для шарда. Все это выдлядит как get_proc_node(ProcId) -> Node. Работает хорошо, стабильно, но много минусов. Решардиг на ходу не тривиален и надо пилить, автоматически не резервируются ноды, тоже надо что то инфраструктурное припиливать.


Спасибо. А зачем get_proc_node(ProcId) если по Pid можно адресовать любой процесс на любой ноде ?

Michael Uvarov

unread,
Nov 16, 2015, 4:22:04 AM11/16/15
to erlang-...@googlegroups.com
riak_core можно для шардинга использовать, чтобы невелосипедить.

Пример https://github.com/beerriot/BashoDidgeridoo

Aleksey Kluchnikov

unread,
Nov 16, 2015, 4:47:58 AM11/16/15
to erlang-russian
И откуда вы узнаете на какой ноде ваш процесс?

16 ноября 2015 г., 12:19 пользователь begemot_sun <logu...@gmail.com> написал:

--

Aleksey Kluchnikov

unread,
Nov 16, 2015, 4:51:22 AM11/16/15
to erlang-russian
А проблема решардинка не с реестром пидов, а с необходимостью миграции процессов с ноды на ноду, без перерыва в работе.

16 ноября 2015 г., 12:22 пользователь Michael Uvarov <fre...@gmail.com> написал:

Sergey Loguntsov

unread,
Nov 16, 2015, 5:17:26 AM11/16/15
to erlang-...@googlegroups.com
> И откуда вы узнаете на какой ноде ваш процесс?
node(Pid) ?

> А проблема решардинка не с реестром пидов, а с необходимостью миграции процессов с ноды на ноду, без перерыва в работе.
ну да, вот мне нужно решение которое бы за меня могло переносить
(запускать) процессы на другой ноде, когда текущая отвалилась.
Т.е. мне нужно нечто, что будет следить за моими процессами, и в
случае поломки ноды перезапустит нужные процессы на других нодах с тем
же состоянием (из ETS/Mnesia).



16 ноября 2015 г., 12:51 пользователь Aleksey Kluchnikov
<kluchn...@gmail.com> написал:
> Вы получили это сообщение, поскольку подписаны на одну из тем в группе
> "Erlang по-русски".
> Чтобы отменить подписку на эту тему, перейдите по ссылке
> https://groups.google.com/d/topic/erlang-russian/9Vy06ug9SI4/unsubscribe.
> Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на

Paul Peregud

unread,
Nov 16, 2015, 6:40:38 AM11/16/15
to erlang-...@googlegroups.com
Переносить процессы с ноды на ноду умеет exat. Можете посмотреть код.

https://github.com/michalwski/exat
https://github.com/gleber/exat
> Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу erlang-...@googlegroups.com.
> Настройки подписки и доставки писем: https://groups.google.com/d/optout.



--
Best regards,
Paul Peregud
+48602112091
Reply all
Reply to author
Forward
0 new messages