mnesia 테이블이 노드 A와 B에서 복제되었다고 가정 해 봅시다. 노드 C에서 테이블 복사본이 포함되어 있지 않은 경우 mnesia:change_config(extra_db_nodes, [NodeA, NodeB])
을 수행 한 다음 노드 C에서 mnesia:dirty_read(user, bob)
노드 C가 노드 복사본을 선택하는 방법 에 대한 쿼리를 실행하는 테이블의?mnesia 클러스터에서 쿼리되는 노드는 무엇입니까?
답변
질문에 대한 내 자신의 연구 답변에 따르면 - 그것은 가장 최근에 연결된 노드을 선택할 것입니다. 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.
이며, 선택적으로 테이블 노드를 마스터 (어떤 이유로) 무시하는 테이블을 제거 할 수있는 목록을 축소, 목록을 축소 현재 노드에 연결된 다음의 순서로 선택한다 :
- 먼저 비
disc_only_copies
- 가능한 모든 노드
가장 중요한 부분은 실제로 후보 목록에서 노드의 순서를 결정하기 때문에 active_replicas
의 목록입니다.
는 active_replicas
목록은 기존 노드에 새로 연결된 노드 목록의 머리로 항목을 추가하는 기능 add/1
아래로 비등 (전에 클러스터에 있었다 즉 하나)에서 mnesia_controller:add_active_replica/*
의 원격 호출에 의해 형성된다.
그러므로 질문에 대한 대답은입니다. 가장 최근에 연결된 노드이 으로 선택됩니다.
참고 :이 적용 얼마나 확실하지 않다,
[ {T,X} || {{T,active_replicas}, X} <- ets:tab2list(mnesia_gvar) ].
글쎄, 노드 C는 노드 A 나 노드 B 중 하나와 접촉하여 질의를해야합니다. 따라서 노드 C는 쿼리를 실행할 테이블 복사본을 스스로 결정해야합니다.
이보다 더 많은 것이 필요한 경우 쿼리 할 노드를 결정할 알고리즘을 필요로하거나 노드 C의 테이블을 복제 할 수도 있습니다 (일반적으로 원하는 유형/원하는 특성에 따라 달라질 수 있음).).
노드 A와 노드 B가 데이터베이스 클러스터의 일부분이거나 그 형태 인 경우, 좋은 시작은 아마도 라운드 로빈 알고리즘 (또는 임의로 제안한 것) 일 수 있습니다.
- 1. Mnesia 내가 mnesia 테이블이 필드
- 2. Mnesia 비동기 트랜잭션
- 3. Mnesia 트랜잭션
- 4. 실행중인 다른 Erlang 쉘에서 Mnesia 노드에 액세스
- 5. mnesia delete_object exception?
- 6. mnesia 클러스터에 노드를 추가하는 방법은 무엇입니까?
- 7. mnesia 스키마를 표준 방식으로 처리하는 방법은 무엇입니까?
- 8. Mnesia 테이블 복제/공유
- 9. mnesia 기본 키
- 10. force load mnesia
- 11. Mochiweb mnesia 요청
- 12. Mnesia 쓰기 실패
- 13. mnesia 이벤트 주문
- 14. MySQL에서 노드는 무엇을 의미합니까?
- 15. 해제 특정 노드는
- 16. 노드는 ... 쓰레기 값
- 17. 삽입 노드는 부모
- 18. 삽입 노드는 항상
- 19. 동적으로 삽입 DOM 노드는
- 20. Tomcat 클러스터에서 애플리케이션에서 빈을 공유하는 방법은 무엇입니까?
- 21. node.js 클러스터에서 데이터를 복제하는 방법은 무엇입니까?
- 22. dict 대 mnesia 테이블이있는 gen_server
- 23. 웹 클러스터에서 ASP.NET 캐싱
- 24. Appfabric 클러스터에서 호스트 제거
- 25. erlang 클러스터에서 스폰 프로세스
- 26. mnesia DBMS의 증분 카운터 관리?
- 27. ejabberd : Mnesia 테이블을 검사 하시겠습니까?
- 28. Hadoop 클러스터에서 mapreduce jar 실행
- 29. 컴퓨터 클러스터에서 .net 병렬 컴퓨팅
- 30. 클러스터에서 앱을 실행하는 서버 수
내 편집 한 게시물을 확인 : 은이 (더러운 해킹) 코드를 사용하여 주어진 노드에서 활성 복제본의 목록을 확인하려면 내가 뭘 물었는지. 위치 사양없이 노드 C에서 쿼리를 수행 할 수 있으므로 사용하려는 테이블 복사본을 어떻게 선택합니까? – ryeguy
노드가 스키마에 실제로 테이블을 가지고 있지 않다. 미안 내 실수! –