Ответ 1
Согласно моему собственному исследовательскому ответу на вопрос - он выберет последний подключенный node. Я буду благодарен за указание ошибок, если они найдены - mnesia - действительно сложная система!
Как Дэн Гудмундссон указал на в списке рассылки алгоритма выбора удаленного node для запроса определяется в mnesia_lib:set_remote_where_to_read/2
. Это следующее
set_remote_where_to_read(Tab, Ignore) ->
Active = val({Tab, active_replicas}),
Valid =
case mnesia_recover:get_master_nodes(Tab) of
[] -> Active;
Masters -> mnesia_lib:intersect(Masters, Active)
end,
Available = mnesia_lib:intersect(val({current, db_nodes}), Valid -- Ignore),
DiscOnlyC = val({Tab, disc_only_copies}),
Prefered = Available -- DiscOnlyC,
if
Prefered /= [] ->
set({Tab, where_to_read}, hd(Prefered));
Available /= [] ->
set({Tab, where_to_read}, hd(Available));
true ->
set({Tab, where_to_read}, nowhere)
end.
Таким образом, он получает список active_replicas (т.е. список кандидатов), необязательно сжимает список для мастер-узлов для таблицы, удаляет таблицы, которые будут игнорироваться (по какой-либо причине), сокращает список до подключенных в данный момент узлов и затем выбирает в следующем порядке:
- Первый не
disc_only_copies
- Любой доступный node
Самая важная часть - это фактически список active_replicas
, поскольку он определяет порядок узлов в списке кандидатов.
Список active_replicas
формируется удаленными вызовами mnesia_controller:add_active_replica/*
из недавно подключенных узлов к старым узлам (то есть к тем, которые были в кластере до), что сводится к функции add/1
, которая добавляет элемент в качестве глава списка.
Следовательно, ответ на вопрос - он выберет последний подключенный node.
Примечания: Чтобы проверить список активных реплик на данном node, вы можете использовать этот (грязный взломанный) код:
[ {T,X} || {{T,active_replicas}, X} <- ets:tab2list(mnesia_gvar) ].