2013-10-18 8 views
4

마스터 DB에서 슬레이브 DB로 스트리밍 복제를 설정했습니다. 마스터가 종료되면 슬레이브가 인계합니다. 복제 및 장애 조치가 정상적으로 작동합니다.PostgreSQL 9.2 failover

데이터 저장을 위해 마스터 데이터베이스를 사용하는 웹 앱이 있습니다.

일부 세부 정보 :를 CentOS 6.4 포스트 그레스 9.2을 실행

  • 두 서버.
  • 스트리밍 복제는 Postgres 내장 복제를 사용하여 마스터에서 슬레이브로 설정됩니다.
  • 페일 오버는 연결 문자열에 master/slave를 지정하여 Postgresql JDBC 드라이버 (v9.2-1003)에서 처리합니다.

이 복제 방법을 계속 사용하고자합니다.

질문은 :

  • 슬레이브 서버는 읽기 전용입니다. 자동으로 장애 조치 (failover) 후 어떻게 이것을 마스터 (쓰기 가능)로 만들 수 있습니까?
  • 원래 마스터가 갑자기 다시 작동하기 시작하면 이제 두 명의 마스터가 있습니까? 어떻게하면 원래의 마스터를 머리에서 쏠 수 있습니까? 자동으로.
+0

마스터가 실패하고 시스템이 슬레이브 서버로 전환 한 후에는 어떻게해야합니까? 어떻게 주인을 되찾아 주인이 다시 주인이되게 할 것인가 아니면 그냥 노예가 되는가? –

답변

3

나는 failover_command 옵션으로 pgpool을 살펴볼 것을 제안합니다. 여기서 작은 쉘 스크립트를 사용하여 슬레이브를 읽기/쓰기 모드로 다시 시작할 수 있습니다. 나는이 문제를 해결하기 위해 다음이 과정이 도움이 될 당신이 pgpool 몇 가지 문제로 실행 경우 pgpool

- pgpool - stracing

1

PGPool-II 트릭을했다.

PGPool을 세 번째 서버에 설치했습니다. CentOS를 실행하는 모니터링 서버. 10 초마다 실행되도록 상태 확인을 구성했습니다. failover_command는 마스터 서버가 실패 할 경우 종속 서버에서 트리거 파일을 생성하는 작은 쉘 스크립트를 실행하도록 설정되었습니다. 그리고 그것은 완벽하게 작동했습니다.

갑자기 마스터가 다시 시작되는 것을 방지하기 위해 앱 서버에 대해 두 개의 구성 파일 (마스터 용과 슬레이브 용)을 사용하고 쉘 스크립트를 확장하여 슬레이브 구성을 사용하여 응용 프로그램 서버를 다시 시작합니다.

팁 주셔서 감사합니다!

0

Docker 기반 솔루션을 사용하려는 경우 PostDock을 시도하십시오.

pgmaster (primary node1) --| 
|- pgslave1 (node2)  --| 
| |- pgslave2 (node3) --|----pgpool (master_slave_mode stream)----client 
|- pgslave3 (node4)  --| 
    |- pgslave4 (node5) --| 
나는 다음과 같은 시나리오를 테스트 한

, 그들은 모두 아주 잘 작동 :

    다음과 같이

    현재 내가 스키마, 고정 표시기-작성 우리의 프로젝트에서 그것을 시도
  • 복제 : 주 (즉, 마스터) 노드에서 변경 한 내용이 모든 대기 노드 (예 : 슬레이브)에 복제됩니다.
  • 장애 조치 : 기본 노드와 대기 노드를 중지합니다, node4)가 자동으로 기본 역할을 대신합니다.
  • 두 개의 기본 노드 예방 : 이전 기본 노드 (node1)를 부활 시키십시오. node4는 기본 노드로 계속되며 node1은 동기화되지만 대기 노드로 유지됩니다.

클라이언트 응용 프로그램의 경우 이러한 변경 사항은 모두 투명합니다. 클라이언트는 pgpool 노드를 가리키고 위에서 언급 한 모든 시나리오에서 올바르게 작동합니다.

참고 : PostDock을 실행하는 데 문제가있는 경우 my forked version of PostDock을 시도 할 수 있습니다. 감시

상기 구조의 문제점과

Pgpool-II는 pgpool 실패의 단일 포인트이다. 따라서 위임 된 가상 IP를 사용하여 Watchdog for pgpool-II을 활성화하여 단일 실패 지점을 피할 수 있도록 노력했습니다.

master (primary node1) --\ 
|- slave1 (node2)  ---\ /pgpool1 (active) \ 
| |- slave2 (node3) ----|---|      |----client 
|- slave3 (node4)  ---/  \ pgpool2 (standby)/
    |- slave4 (node5) --/ 

나는 다음과 같은 시나리오를 테스트 한, 그들은 모두 아주 잘 작동 :

  • 일반 시나리오 : 모두 pgpools 자동으로 내 경우에는, 그 중 하나에 적용되는 가상 IP로, 시작, pgpool1
  • 장애 조치 : 종료 pgpool1. 가상 IP는 pgpool2에 자동으로 적용되어 활성화됩니다.
  • 시작 실패 pgpool : 다시 시작 pgpool1. 가상 IP는 pgpool2와 함께 유지되고 pgpool1은 이제 대기로 작동합니다.

클라이언트 응용 프로그램의 경우 이러한 변경 사항은 모두 투명합니다. 클라이언트는 가상 IP를 가리키고 위에서 언급 한 모든 시나리오에서 정상적으로 작동합니다.

이 프로젝트는 my GitHub repository on the watchdog branch에서 찾을 수 있습니다.