0

저는 x 머신이 있으며 특정 작업 (기본 머신)을 수행하려면 1을 선택하고 싶습니다. 나는이 기계가 가지고있는 유일한 공유 자원 인 데이터베이스를 가지고 있으며 기계 간 통신 메커니즘이 없다.리더 선택

기계를 선택하려면 먼저 db에 값을 쓰고 처음 성공한 쪽을 선택하십시오 (예 : M1). M1은 데이터베이스를 주기적으로 업데이트하여 해당 데이터베이스가 살아 있는지 확인합니다. M1이 죽을 때 M1이 DB를 최근에 업데이트하지 않은 것으로 보이는 다른 시스템은 주 기계 역할을 맡기 위해 db에 쓰려고 시도합니다.

어떤 시점에서 머신이 db에 어떤 값을 쓸 수있어 모든 머신이 동일한 값을 쓰려고합니까? 시계가 모든 컴퓨터에서 동기화되면 YYMMDDHHMM을 사용할 수 있습니다. 그러나 그것은 사실이 아닐 수도 있습니다.

모든 포인터/아이디어?

+0

모든 기계가 같은 값을 쓰는 이유는 무엇입니까? 분명히 M1은 M2가 쓰는 것과 다른 것을 써야하기 때문에 M2는 M1이 먼저 도착한다는 것을 안다. –

+1

DBMS의 기능을 사용하여 서버 자체의 시간을 쿼리 할 수 ​​없습니까? –

+0

@ReinierTorenbeek, 고마워, 왜 내가 그런 생각을하지 않았는지 모르겠다. – Sam

답변

1

DBMS의 기능을 사용하여 여기에서 간략히 설명하는 방식에 따라 서버 자체의 시간을 쿼리 할 수 ​​있습니다.

이 방수하려면 몇 가지 문제가 당신이 생각 돌봐해야합니다 : 현재 작업자 노드의 활기를 테스트 할 때

  • 가, 쓰기 잠금이 테이블에 취득되어야 할 것이다 작업자의 활력 테스트와 작업 청구가 하나의 원자 적 조치로 수행되도록합니다. 이렇게하면 여러 명의 근로자가 동시에 청구 할 필요가 없습니다.
  • 현재 작업자가 활력을 주장하기 위해 테이블을 업데이트 할 때마다 다른 작업자가 작업을 넘겨받은 경우를 감지하기 위해 동일한 잠금 메커니즘을 따라야합니다.
  • 다른 작업자가 일을 맡았을 때 어떤 종류의 신분증을 포함시켜야 현재 누가 그 일을하고 있는지 알 수 있습니다.

이것은 설명이 명확하지 않으므로 모든 세부 사항에서 알고리즘을 구현하기.

1

데이터베이스에서 제공하는 잠금 의미론과 실패한 클라이언트를 탐지하는 데 얼마나 좋은지에 따라 각 시스템이 공통 독점 잠금을 획득하려고 시도하면 충분할 수 있습니다. 어느 기계가 독점적 인 자물쇠를 얻는지는 리더입니다.

+1

이것을 선택하면, 디버깅이 언제 그리고 어떤 기계가 자물쇠를 집어 올렸는지 기록하는 것이 유용하다. 추가 전용 테이블이 유용합니다. 또한 비정상적인 종료로 인해 연결이 끊어지면 의미를 테스트하십시오. 당신은 데이터베이스의 자비에 머물 것이며 당신은 지도자없이 얼마나 오래 있는지 알고 싶어합니다. –