2017-05-04 7 views
0

나는 분산 postgres 데이터베이스 시스템을 설정하고 hot_standby wal_level을 사용하여 복제를 구성했습니다.분배 된 postgres depolyment가 동기화되지 않음

읽기 전용 인스턴스로 사용되는 여러 복제본 (현재 전 세계 15 개)이있는 중앙 마스터 데이터베이스가 하나 있습니다. 따라서 장애 조치가 필요하지 않습니다. 우리는 데이터를 우리가 할 수있는 원격 위치에 동기화하기를 원합니다. 그들을 읽으십시오.

마스터 :

wal_level = hot_standby 
max_wal_senders = 20 
checkpoint_segments = 8  
wal_keep_segments = 8 

클라이언트 : 클라이언트 측

wal_level = hot_standby 
max_wal_senders = 3 
checkpoint_segments = 8  
wal_keep_segments = 8 
hot_standby = on 

/var/lib/postgresql/9.4/recovery.conf :

standby_mode = 'on' 
primary_conninfo = 'host=<IP of master> port=5432 user=replicator password=xxxx sslmode=require' 
trigger_file = '/tmp/postgresql.trigger' 

복제가 시작 - 모든 며칠 동안 괜찮아 보인다. 이 복제에 대한 마스터에서 접수 더 이상 연결이 보인다 며칠 후 ...

클라이언트 :

2017-05-04 01:16:51 UTC [9608-1] FATAL: could not connect to the primary server: FATAL: sorry, too many clients already 
2017-05-04 01:16:57 UTC [10807-1] FATAL: could not connect to the primary server: FATAL: sorry, too many clients already 
2017-05-04 01:17:02 UTC [12022-1] FATAL: could not connect to the primary server: FATAL: sorry, too many clients already 
2017-05-04 01:17:06 UTC [13217-1] FATAL: could not connect to the primary server: FATAL: remaining connection slots are reserved for non-replication superuser connections 
... 

마스터 :

다음 loag는 다음과 같은 메시지로 가득하다 - 그것은 결코 ... 복구하지

2017-05-04 08:44:14 UTC [24850-1] [email protected][unknown] ERROR: requested WAL segment 000000010000003500000014 has already been removed 
2017-05-04 08:44:19 UTC [25958-1] [email protected][unknown] ERROR: requested WAL segment 000000010000003500000014 has already been removed 
2017-05-04 08:44:24 UTC [27063-1] [email protected][unknown] ERROR: requested WAL segment 000000010000003500000014 has already been removed 
2017-05-04 08:44:29 UTC [28144-1] [email protected][unknown] ERROR: requested WAL segment 000000010000003500000014 has already been removed 
2017-05-04 08:44:34 UTC [29227-1] [email protected][unknown] ERROR: requested WAL segment 000000010000003500000014 has already been removed 
2017-05-04 08:44:39 UTC [30316-1] [email protected][unknown] ERROR: requested WAL segment 000000010000003500000014 has already been removed 
... 

클라이언트 :

,
2017-04-30 11:26:22 UTC [28474-1] LOG: started streaming WAL from primary at 35/14000000 on timeline 1 
2017-04-30 11:26:22 UTC [28474-2] FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000003500000014 has already been removed 
2017-04-30 11:26:26 UTC [29328-1] LOG: started streaming WAL from primary at 35/14000000 on timeline 1 
2017-04-30 11:26:26 UTC [29328-2] FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000003500000014 has already been removed 
2017-04-30 11:26:31 UTC [30394-1] LOG: started streaming WAL from primary at 35/14000000 on timeline 1 
2017-04-30 11:26:31 UTC [30394-2] FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000003500000014 has already been removed 
... 

그래서 내 질문 :

  • 는 원격 읽기 전용하는 경우 변경 내용을 동기화하거나 난 그냥 몇 시간 후 내 복제 휴식을 만드는 CONFIGS에 오류가 말고, 더 좋은 방법은 무엇입니까?

너의 도움을 많이!

+0

WAL을 저장하기 위해 archive_command (recovery.conf에서)를 사용하지 않고 실제로 '000000010000003500000014'가 없으면 복제를 다시 작성해야합니다. –

+0

로그 샘플 또는 config ... –

+0

아래 내용은 무엇을 의미합니까? WAL을 저장하기 위해 archive_command (recovery.conf에서)를 사용하지 않고 000000010000003500000014가 아닌 경우 – roegi

답변

1

https://www.postgresql.org/docs/current/static/runtime-config-replication.html :

max_wal_senders (정수)

대기 서버 또는 스트리밍 기본 백업 클라이언트에서 동시 접속의 최대 수를 지정 (예 동시에 실행 WAL 송신기 프로세스의 최대 수) . 기본값은 0으로, 은 복제가 사용 불가능 함을 의미합니다. WAL 송신자 프로세스는 총 연결 수를 으로 계산하므로 매개 변수를 max_connections보다 높게 설정할 수 없습니다. 시간 제한에 도달 할 때, 그래서이 매개 변수가 때문에 연결이 끊긴 클라이언트가 즉시 다시 연결할 수 예상 클라이언트의 최대 수보다 약간 높게 설정해야합니다 때까지 갑작스러운 스트리밍 클라이언트 단선 고아 연결 슬롯이 발생할 수 있습니다.

(강조 광산). 응용 프로그램 connecitons 또는 고아 연결을 하나의 정보는 다음의 제품에 납을 첨가하여

FATAL: sorry, too many clients already

당신은 실제로 발생하기 전에 너무 많은 연결을 제한, pgbouncer 같은 애플리케이션을 위해 일부 연결 풀러를 사용 할 수 있습니다.

havearchive_command이 실제로 WAL을 어딘가에 복사하도록 설정 한 경우 슬레이브의 recovery.conf에서 restore_command를 수정하여 복구하십시오. 슬레이브는 스트림을 잃은 순간부터 따라 잡을 수 있습니다. 그렇지 않으면 다시 빌드해야합니다.

+0

많이 들으세요! max_wal_senders를 더 높은 숫자로 늘리려고합니다. 또한, 나는 archive_command와 restore_command가 작동하도록하고 싶습니다 - 할 일이 무엇인지에 대한 예제가 있습니까? – roegi

+0

아니요 - 사용하지 않습니다. 하지만 문서에는 예제가 있습니다. –