В кластере mnesia, который запрашивается node?

Скажем, у вас есть таблица mnesia, реплицируемая на узлах A и B. Если на node C, который не содержит копии таблицы, я делаю mnesia:change_config(extra_db_nodes, [NodeA, NodeB]), а затем на node CI do mnesia:dirty_read(user, bob) как node C выбрать, какая node копия таблицы для выполнения запроса?

Ответы

Ответ 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) ]. 

Ответ 2

Ну, node C нужно будет связаться с node A или node B, чтобы выполнить запрос. Таким образом, node C должен сам решить, какую таблицу скопировать для выполнения запроса.

Если вам нужно что-то большее, чем это, вам нужно будет иметь какой-то алгоритм, который решит, какой node запрашивать или даже реплицировать таблицу на node C (обычно это зависит от того, какие характеристики вы используете want/need).

Если node A и node B образуют или являются частью кластера базы данных, хорошим началом является, вероятно, циклический алгоритм (или случайный, как вы полагаете).