문제

노드 중 하나를 마스터로 지정 해야하는 클러스터 응용 프로그램이 있습니다. 클러스터 노드는 테이블에서 추적됩니다 nodeid, ISMASTOR, Lasttimestamp 열.

클러스터의 각 노드는 매번 마스터가됩니다. 엑스 초. 노드는 어느 쪽이든 마스터가 될 수 있습니다

  • 다른 마스터 노드는 없습니다
  • 그만큼 Lasttimestamp 현재 마스터 노드에서는 더 오래되었습니다 2*x

위 조건 중 하나가 만족되는 경우

  • 현재 마스터 노드 ISMASTOR 지워야합니다
  • 새로운 마스터 노드 ISMASTOR 설정해야합니다
  • 새로운 마스터 노드 Lasttimestamp '지금'타임 스탬프로 설정해야합니다.

이것은 하나의 (휴대용) SQL 문은 둘 이상의 노드가 마스터가 될 가능성없이 위의 것을 달성하기위한 것입니까?

도움이 되었습니까?

해결책

DBMS에서 실행되는 응용 프로그램보다는 이런 종류의 조정이 일반적으로 DBMS 자체에 의해 처리되지 않습니까? 나도 내가 익숙한 DBMS에서 수행 할 수있는 방법을 구상 할 수 있지만 시스템에 대해 더 알지 못하고 (아마도 공유 디스크를 사용하고있을 것입니다. 따라서 모든 노드는 동일한 데이터를 볼 수 있습니다. 데이터에; 마스터 노드의 사용자 프로세스는 마지막 TimeStamp를 주기적으로 업데이트하는 경우) 많은 도움이 어려울 것입니다. 그리고 Jamie Love가 지적했듯이 DBMS는 여러 프로세스가 관련 레코드에 대한 액세스를 조정하도록 허용해야합니다. 주요 관련 레코드는 현재 마스터 레코드입니다.

[편집: 어쩌면 나는 그것에 너무 많이 읽고 있었을 것입니다.

단일 업데이트 문은 두 행의 두 행에서 차별화 업데이트를 수행해야하며 두 업데이트 중 하나만 가능하면 실패해야합니다. 즉, 현재 마스터를 비 마스터로 변경하고 자체 기록을 변경하여 마스터이기도합니다. 한 가지 문제는 DBMS가 '하나의 행만 마스터 일 수있다'는 제약 조건을 어떻게 시행 하는가입니다. 문제가 있으면 효과가 있다고 가정 해 봅시다. 사람들이 열 이름을 제공 할 때에도 사람들이 종종 테이블 이름을 생략하는 이유는 무엇입니까? 오, 테이블 이름은 이하입니다 ClusterControl. 각 노드는 어떻게 든 자체 노드를 알아야합니다. {mynodeid}를 사용하여 SQL에 나타나는 위치를 나타냅니다.

별도의 하트 비트 업데이트가 필요합니다.

 UPDATE ClusterControl
     SET lastTimestamp = CURRENT_TIMESTAMP
     WHERE NodeID = {MyNodeID};

"마스터 상태 압류"업데이트는 다음과 같습니다.

UPDATE ClusterControl
    SET lastTimestamp = (CASE
                         WHEN NodeID = {MyNodeID} THEN CURRENT_TIMESTAMP
                         ELSE lastTimestamp END),
        isMaster      = (CASE
                         WHEN NodeID = {MyNodeId} THEN 'Y'
                         ELSE 'N' END)
    WHERE (NodeID  = {MyNodeID} AND isMaster = 'N') OR
          (NodeID != {MyNodeID} AND
           lastTimestamp < CURRENT_TIMESTAMP - INTERVAL '120' SECOND AND
           isMaster = 'Y'
          );

'마스터 상태 Seize'업데이트의 이론은 (세트 절)입니다.

  • 새 마스터의 마지막 TimeStamp 필드는 현재 타임 스탬프로 설정되지만 이전 마스터는 변경되지 않았습니다.
  • ISMaster 필드는 새로운 마스터의 경우 'Y'로 변경되고 구 주인의 경우 'N'로 변경됩니다.

Where 절후의 이론은 다음과 같습니다.

  • 이 노드가 현재 노드가 아니고 타임 스탬프가 120 초 이상 (질문에서 "2 * x")이 될 때 현재 마스터 또는 현재 마스터 노드의 레코드가 아닌 경우 현재 노드의 레코드 만 변경합니다. .

한 행만 'Y'플래그를 갖도록하기 위해 (아마도 신화적인) 제약이 있기 때문에 마스터가 최신 상태 일 때 필요한대로 실패해야합니다.

테스트되지 않은 SQL!

]

다른 팁

Oracle 데이터베이스에 대한 솔루션을 상상할 수 있지만 휴대용이 될 수는 없습니다. 이것이 단일 휴대용 SQL 문이어야하는 이유는 무엇입니까? 대부분의 데이터베이스는 테이블 잠금 및 트랜잭션을 허용하므로 여러 문장에서 이러한 종류의 작업을 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top