2009-12-13 5 views
3

Erlang 노드의 마스터 - 슬레이브 설정을 원합니다. 여기서 읽기 및 쓰기 작업은 마스터 노드에서만 발생합니다. 슬레이브 노드는 핫 스탠바이 상태로 유지됩니다.Mnesia 비동기 트랜잭션

Mnesia의 기본 동작은 쓰기 작업을 실행하기 전에 모든 노드에서 동기식으로 잠금을 획득하는 것입니다. 이는 특히 지리적으로 분산 된 노드에서 높은 대기 시간을 초래합니다.

내 질문은 : Mnesia가 마스터 노드에서만 잠금을 획득하고 비동기 트랜잭션을 지원하며 나중에 쓰기 작업이 종속 노드쪽으로 전파 되는가?

답변

2

메시지 큐 시스템 (rabbitmq 아마도)을 사용하여 오프 사이트 복제를 작성하면 메시지 큐 피드에서 직접 복제 된 db를 업데이트하면 더 행복해집니다. WAN 링크는 정체되거나 중단 될 가능성이 높으며 메시지 대기열 프로토콜에는이를 처리 할 수있는 방법이 있습니다. Erlang 배포본은 포기하고 복제본이 올라와서 그것을 소비 할 때까지 파일에 업데이트를 유출해야합니다.

최상의 대칭성을 위해 db 업데이트를위한 기본 방법은 메시지 게시 큐입니다. 따라서 메시지 큐에서 소비함으로써 마스터도 업데이트됩니다. 응답이 필요한 경우 현재 마스터는 메시지 발급자에게 메시지를 다시 보낼 수 있습니다.

Mnesia에는 mnesia transaction contexts의 몇 가지 종류가 있지만 원하는 것과 정확히 일치하는 것은 없습니다.

+0

나는이 질문을 보았을 때 조금 후에 조사했습니다 : 크리스챤의 제안은 합리적으로 들립니다. – jldupont

0

재미있는 Q와 똑같이 흥미로운 A!

기본적으로 당신은 기독교인입니다. gen_server - DB에 대한 액세스를 직렬화하는 것. 처음으로 나는 그것을 한 다음 깨달았습니다. Mnesia는 트랜잭션 방식이므로 처음에는 액세스를 직렬화 한 다음 트랜잭션을 통해 DB를 업데이트하여 다시 수행하는 것이 조금 이상하게 들립니다.

아직도 기억 장치의 구현 자들이 아마 시스템보다 나을 잘 알고 있기 때문에 기억 상실이 트랜잭션 의미론을 강요한다는 점을 감안할 때, 나는 당신이 스스로 접근을 직렬화 할 필요가 없다는 힌트로 생각합니다. do);

나는 이것이 당신의 질문에 대한 직접적인 대답은 아니지만 mnesia + memorynodes + disknodes를 사용한다고 생각합니다. 빠른 인계를위한 메모리 노드와 크래시/백업 후 복구를위한 디스크 노드.

HTH는 haavee