2009-04-06 4 views
13

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

ответ

14

Согласно моему собственному исследовательскому ответу на вопрос - он выберет последний подключенный узел. Я буду благодарен за указание ошибок, если они обнаружены - mnesia - действительно сложная система!

Как Dan Gudmundsson pointed out в алгоритме списка рассылки выбора удаленного узла для запроса определяется в 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 (т.е. списка кандидатов), при необходимости сокращает список освоить узлы для таблицы, удалять таблицы, которые должны быть проигнорированы (по любой причине), сужает список в настоящее время подключены узлы, а затем выбирает в следующем порядке:

  1. первого не disc_only_copies
  2. Любой доступный узел

The Самая важная часть - это фактически список active_replicas, так как он определяет порядок узлов в списке кандидатов.

Список active_replicas формируются с помощью удаленных вызовов mnesia_controller:add_active_replica/* от вновь подключенных узлов к старым узлам (то есть тот, который был в кластере раньше), которая сводится к функции add/1 которая добавляет элемент в качестве главы списка.

Поэтому ответ на вопрос - это выбрать самый последний подключен узел.

Примечание: Чтобы проверить список активных реплик на данном узле вы можете использовать это (грязный хак) код:

[ {T,X} || {{T,active_replicas}, X} <- ets:tab2list(mnesia_gvar) ]. 
-1

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

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

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

+0

Проверьте мой отредактированный пост, я не знаю, как это будет применяться к что я спросил. Я могу выполнить запрос на узле C без спецификации местоположения, поэтому как он выбирает, какую копию таблицы использовать? – ryeguy

+0

Не понял, что на самом деле узел имеет таблицу в своей схеме. Извини, я виноват! –

Смежные вопросы