2009-04-06 7 views
13

mnesia 테이블이 노드 A와 B에서 복제되었다고 가정 해 봅시다. 노드 C에서 테이블 복사본이 포함되어 있지 않은 경우 mnesia:change_config(extra_db_nodes, [NodeA, NodeB])을 수행 한 다음 노드 C에서 mnesia:dirty_read(user, bob) 노드 C가 노드 복사본을 선택하는 방법 에 대한 쿼리를 실행하는 테이블의?mnesia 클러스터에서 쿼리되는 노드는 무엇입니까?

답변

14

질문에 대한 내 자신의 연구 답변에 따르면 - 그것은 가장 최근에 연결된 노드을 선택할 것입니다. mnesia가 정말 복잡한 시스템이라면 오류를 지적 해 주셔서 감사드립니다!

Dan Gudmundsson pointed out은 쿼리 할 원격 노드를 선택하는 메일 링리스트 알고리즘에 대해 mnesia_lib:set_remote_where_to_read/2에 정의되어 있습니다. 그것은 그래서 (즉 후보 목록) active_replicas의 목록을 가져옵니다 다음

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. 

이며, 선택적으로 테이블 노드를 마스터 (어떤 이유로) 무시하는 테이블을 제거 할 수있는 목록을 축소, 목록을 축소 현재 노드에 연결된 다음의 순서로 선택한다 :

  1. 먼저 비 disc_only_copies
  2. 가능한 모든 노드

가장 중요한 부분은 실제로 후보 목록에서 노드의 순서를 결정하기 때문에 active_replicas의 목록입니다.

active_replicas 목록은 기존 노드에 새로 연결된 노드 목록의 머리로 항목을 추가하는 기능 add/1 아래로 비등 (전에 클러스터에 있었다 즉 하나)에서 mnesia_controller:add_active_replica/*의 원격 호출에 의해 형성된다.

그러므로 질문에 대한 대답은입니다. 가장 최근에 연결된 노드이 으로 선택됩니다.

참고 :이 적용 얼마나 확실하지 않다,

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

글쎄, 노드 C는 노드 A 나 노드 B 중 하나와 접촉하여 질의를해야합니다. 따라서 노드 C는 쿼리를 실행할 테이블 복사본을 스스로 결정해야합니다.

이보다 더 많은 것이 필요한 경우 쿼리 할 노드를 결정할 알고리즘을 필요로하거나 노드 C의 테이블을 복제 할 수도 있습니다 (일반적으로 원하는 유형/원하는 특성에 따라 달라질 수 있음).).

노드 A와 노드 B가 데이터베이스 클러스터의 일부분이거나 그 형태 인 경우, 좋은 시작은 아마도 라운드 로빈 알고리즘 (또는 임의로 제안한 것) 일 수 있습니다.

+0

내 편집 한 게시물을 확인 : 은이 (더러운 해킹) 코드를 사용하여 주어진 노드에서 활성 복제본의 목록을 확인하려면 내가 뭘 물었는지. 위치 사양없이 노드 C에서 쿼리를 수행 할 수 있으므로 사용하려는 테이블 복사본을 어떻게 선택합니까? – ryeguy

+0

노드가 스키마에 실제로 테이블을 가지고 있지 않다. 미안 내 실수! –