19.6. 복제

19.6.1. 전송 서버들
19.6.2. 마스터 서버
19.6.3. 대기 서버
19.6.4. Subscribers

이 설정은 내장 streaming replication 기능의 동작을 제어한다(26.2.5절 참조). 서버는 마스터 서버거나 대기 서버다. 마스터 서버는 데이터를 전송할 수 있고, 대기 서버는 언제나 복제된 데이터의 수신자이다. cascading replication(26.2.7절 참조)을 사용하는 경우 대기 서버는 수신자 겸 전송자일 수 있다. 매개 변수는 주로 전송 및 대기 서버에 대한 것이며, 일부 매개 변수는 마스터 서버에서만 의미가 있다. 클러스터 간에 설정은 필요 시 별 문제 없이 다르게 할 수 있다.

19.6.1. 전송 서버들

이 매개 변수는 복제 데이터를 하나 이상의 대기 서버로 전송하는 서버에 설정할 수 있다. 마스터는 항상 전송 서버 이므로 이 매개 변수를 언제나 마스터에 설정해야 한다. 이 매개 변수의 역할 및 의미는 대기 서버가 마스터로 된 이후에 변경되지 않는다.

max_wal_senders (integer)

대기 서버 또는 스트리밍 베이스 백업 클라이언트로부터의 동시 연결 최대 수를 지정한다(예: 동시에 실행 중인 WAL 전송자 프로세스의 최대 수). 기본값은 10이다. 복제를 비활성화 하려면 0이다. 스트리밍 클라이언트의 연결이 갑작스럽게 끊어지면 타임아웃이 될 때까지 고아 연결 슬롯이 생기므로, 예상되는 클라이언트의 최대 수보다 이 매개 변수를 약간 더 크게 설정하여 연결이 끊어진 클라이언트가 즉시 재연결될 수 있도록 해야 한다. 이 매개 변수는 서버 시작 시에만 설정 가능하다. 또한 대기 서버로부터의 연결이 가능하도록 wal_levelreplica와 같거나 크게 설정해야 한다.

대기 서버를 사용한다면, 대기 서버에서의 이 설정값은 주 서버의 설정값과 같거나 보다 커야한다. 그렇지 않으면, 대기 서버에서 쿼리 사용을 할 수 없게 된다.

max_replication_slots (integer)

서버가 지원할 수 있는 복제 슬롯의 최대 수를 지정한다(26.2.6절 참조). 기본값은 10이다. 이 매개 변수는 서버 시작 시에만 설정 가능하다. 복제 슬롯의 사용이 가능하도록 wal_levelreplica와 같거나 크게 설정해야 한다. 현재 존재하는 복제 슬롯 수보다 작은 값으로 설정하면 서버가 시작되지 않는다.

On the subscriber side, specifies how many replication origins (see 49장) can be tracked simultaneously, effectively limiting how many logical replication subscriptions can be created on the server. Setting it a lower value than the current number of tracked replication origins (reflected in pg_replication_origin_status, not pg_replication_origin) will prevent the server from starting.

wal_keep_size (integer)

대기 서버가 streaming replication을 위해 과거 로그 파일을 가져와야 하는 경우 pg_wal 디렉터리에 저장되는 과거 로그 조각 파일의 최소 크기 지정한다. 전송 서버에 연결된 대기 서버가 wal_keep_size 메가바이트에 휠씬 못 미치면 전송 서버는 대기 서버에 의해 필요한 만큼 WAL 세그먼트를 삭제하고, 이때 복제 연결이 중단된다. 다운스트림 연결도 결과적으로 실패한다. (단, 대기 서버는 WAL 아카이빙이 사용 중인 경우 아카이브에서 세그먼트를 가져와서 복구할 수 있다.)

이것은, pg_wal에 저장되는 최소 세그먼트 크기를 지정한다. 시스템은 WAL 아카이브용으로 또는 checkpoint에서 복구용으로 세그먼트를 좀 더 보유해야 할 수 있다. wal_keep_size가 0(기본값)인 경우 시스템은 대기 서버를 위한 추가 세그먼트를 유지하지 않으므로, 대기 서버에서 사용 가능한 예전 WAL 세그먼트의 수는 이전 checkpoint의 위치 및 WAL 아카이빙의 상태 함수이다. 설정값에 단위를 지정하지 않으면, 메가바이트다. 이 매개 변수는 postgresql.conf 파일 또는 서버 커맨드 라인에서만 설정 가능하다.

max_slot_wal_keep_size (integer)

Specify the maximum size of WAL files that replication slots are allowed to retain in the pg_wal directory at checkpoint time. If max_slot_wal_keep_size is -1 (the default), replication slots may retain an unlimited amount of WAL files. Otherwise, if restart_lsn of a replication slot falls behind the current LSN by more than the given size, the standby using the slot may no longer be able to continue replication due to removal of required WAL files. You can see the WAL availability of replication slots in pg_replication_slots.

wal_sender_timeout (integer)

지정한 시간 이상 작동되지 않은 복제 연결이 중단된다. 이것은 전송 서버가 대기 서버 충돌 또는 네트워크 중단을 검출할 때 유용하다. 단위를 지정하지 않으면 밀리세컨드로 간주한다. 초기값은 60초다. 0 으로 지정하면, 이 기능이 비활성화 된다.

With a cluster distributed across multiple geographic locations, using different values per location brings more flexibility in the cluster management. A smaller value is useful for faster failure detection with a standby having a low-latency network connection, and a larger value helps in judging better the health of a standby if located on a remote location, with a high-latency network connection.

track_commit_timestamp (boolean)

트랜잭션 커밋 시간을 기록한다. 이 설정은 postgresql.conf에서 지정하거나, 서버 실행 명령행 옵션으로만 지정할 수 있다. 기본값은 off.

19.6.2. 마스터 서버

이 매개 변수는 복제 데이터를 하나 이상의 대기 서버로 전송하는 마스터/운영 서버에 설정할 수 있다. 이 매개 변수 외에, wal_level은 마스터 서버에 적절하게 설정되어야 하고 옵션으로 wal 아카이빙도 활성화될 수 있다(19.5.3절 참조). 사용자가 대기 서버가 마스터가 될 가능성에 대비하여 이 매개 변수를 설정하고 싶어 하더라도 대기 서버의 이 매개 변수 값은 아무 상관이 없다.

synchronous_standby_names (string)

26.2.8절에 설명된 대로 동기 복제를 지원할 수 있는 대기 서버 이름 목록을 지정한다. 활성 대기 서버는 하나 이상을 지정할 수 있다; 커밋 대기 중인 트랜잭션은 이 대기 서버들이 데이터 수신을 확인한 후에 진행이 허용된다. 동기 대기 서버는 이 목록에서 지정한 순서 대로 연결되어 있고 실시간으로 데이터를 스트리밍 전달하여 복제한다. ( pg_stat_replication 뷰에서 streaming 상태로 표시됨). 동기 대기 서버가 어떤 이유로든 연결이 끊어진 경우 지정한 우선 순위에 따라 그 다음으로 높은 대기 서버로 즉시 대체된다. 대기 서버 이름을 2개 이상 지정하면 매우 높은 고가용성을 달성할 수 있다.

The name of a standby server for this purpose is the application_name setting of the standby, as set in the standby's connection information. In case of a physical replication standby, this should be set in the primary_conninfo setting; the default is the setting of cluster_name if set, else walreceiver. For logical replication, this can be set in the connection information of the subscription, and it defaults to the subscription name. For other replication stream consumers, consult their documentation.

대기 서버 목록은 다음 형태로 지정한다:

[FIRST] num_sync ( standby_name [, ...] )
ANY num_sync ( standby_name [, ...] )
standby_name [, ...]

where num_sync is the number of synchronous standbys that transactions need to wait for replies from, and standby_name is the name of a standby server. FIRST and ANY specify the method to choose synchronous standbys from the listed servers.

The keyword FIRST, coupled with num_sync, specifies a priority-based synchronous replication and makes transaction commits wait until their WAL records are replicated to num_sync synchronous standbys chosen based on their priorities. For example, a setting of FIRST 3 (s1, s2, s3, s4) will cause each commit to wait for replies from three higher-priority standbys chosen from standby servers s1, s2, s3 and s4. The standbys whose names appear earlier in the list are given higher priority and will be considered as synchronous. Other standby servers appearing later in this list represent potential synchronous standbys. If any of the current synchronous standbys disconnects for whatever reason, it will be replaced immediately with the next-highest-priority standby. The keyword FIRST is optional.

The keyword ANY, coupled with num_sync, specifies a quorum-based synchronous replication and makes transaction commits wait until their WAL records are replicated to at least num_sync listed standbys. For example, a setting of ANY 3 (s1, s2, s3, s4) will cause each commit to proceed as soon as at least any three standbys of s1, s2, s3 and s4 reply.

FIRST and ANY are case-insensitive. If these keywords are used as the name of a standby server, its standby_name must be double-quoted.

The third syntax was used before PostgreSQL version 9.6 and is still supported. It's the same as the first syntax with FIRST and num_sync equal to 1. For example, FIRST 1 (s1, s2) and s1, s2 have the same meaning: either s1 or s2 is chosen as a synchronous standby.

The special entry * matches any standby name.

There is no mechanism to enforce uniqueness of standby names. In case of duplicates one of the matching standbys will be considered as higher priority, though exactly which one is indeterminate.

참고

Each standby_name should have the form of a valid SQL identifier, unless it is *. You can use double-quoting if necessary. But note that standby_names are compared to standby application names case-insensitively, whether double-quoted or not.

동기 대기 서버 이름이 여기서 지정되지 않으면 동기 복제는 활성화되지 않고 트랜잭션 커밋은 복제를 기다리지 않는다. 이것은 기본 환경 설정이다. 동기 복제가 활성화되더라도 개별 트랜잭션은 synchronous_commit 매개 변수를 local 또는 off로 설정함으로써 복제를 기다리지 않도록 환경 설정할 수 있다.

이 매개 변수는 postgresql.conf 파일 또는 서버 커맨드 라인에서만 설정 가능하다.

vacuum_defer_cleanup_age (integer)

지정한 수 만큼의 트랜잭션에 대해서만 남기고, 나머지 트랜잭션으로 발생한 폐기 처분 된 로우(dead row)를 VACUUMHOT 업데이트가 정리하도록 한다. 기본값은 0개 트랜잭션이다. 이 설정은 트랜잭션 처리가 끝나면, 즉시 폐기 처분 된 로우는 정리 대상이 됨을 의미한다. 사용자는 26.5절에 설명된 대로 핫 스탠바이가 지원하는 운영 서버에서 이 값을 0이 아닌 다른 값으로 설정하고 싶을 수도 있다. 이것은 행의 조기 클린업에 의한 충돌 없이 대기 서버에서 쿼리가 완료되는 시간적 여유를 허용한다. 그러나, 운영 서버에서 발생한 쓰기 트랜잭션 수에 관해서 값이 평가되므로, 대기 서버 쿼리에 대해 얼마만큼의 유예 시간이 가능한지를 예측하기는 어렵다. 이 매개 변수는 postgresql.conf 파일 또는 서버 커맨드 라인에서만 설정 가능하다.

이런 대기 서버의 충돌 문제를 피하는 다른 방법으로 hot_standby_feedback 설정을 활성화 하는 방법도 고려해 볼만 하다.

old_snapshot_threshold 설정이 활성화 되어 있다면, 이 설정이 0 이상이어도, 폐기 처분 된 로우에 대한 정리 작업은 진행됨으로 그 로우들을 보호하지는 못한다.

19.6.3. 대기 서버

이 설정은 복제 데이터를 수신하는 대기 서버 의 동작을 제어한다. 마스터 서버의 값은 무관하다.

primary_conninfo (string)

Specifies a connection string to be used for the standby server to connect with a sending server. This string is in the format described in 33.1.1절. If any option is unspecified in this string, then the corresponding environment variable (see 33.14절) is checked. If the environment variable is not set either, then defaults are used.

The connection string should specify the host name (or address) of the sending server, as well as the port number if it is not the same as the standby server's default. Also specify a user name corresponding to a suitably-privileged role on the sending server (see 26.2.5.1절). A password needs to be provided too, if the sender demands password authentication. It can be provided in the primary_conninfo string, or in a separate ~/.pgpass file on the standby server (use replication as the database name). Do not specify a database name in the primary_conninfo string.

This parameter can only be set in the postgresql.conf file or on the server command line. If this parameter is changed while the WAL receiver process is running, that process is signaled to shut down and expected to restart with the new setting (except if primary_conninfo is an empty string). This setting has no effect if the server is not in standby mode.

primary_slot_name (string)

Optionally specifies an existing replication slot to be used when connecting to the sending server via streaming replication to control resource removal on the upstream node (see 26.2.6절). This parameter can only be set in the postgresql.conf file or on the server command line. If this parameter is changed while the WAL receiver process is running, that process is signaled to shut down and expected to restart with the new setting. This setting has no effect if primary_conninfo is not set or the server is not in standby mode.

promote_trigger_file (string)

Specifies a trigger file whose presence ends recovery in the standby. Even if this value is not set, you can still promote the standby using pg_ctl promote or calling pg_promote(). This parameter can only be set in the postgresql.conf file or on the server command line.

hot_standby (boolean)

26.5절에 설명된 대로 복구 중에 사용자가 쿼리를 연결하고 실행할 수 있는지를 지정한다. 기본값은 on이다. 이 매개 변수는 서버 시작 시에만 설정 가능하다. 복구 중 또는 대기 서버 모드에서만 효과가 있다.

max_standby_archive_delay (integer)

핫 스탠바이가 작동 중이면 26.5.2절에서 설명된 대로 이 매개 변수는 적용 직전의 WAL 항목과 충돌하는 대기 서버 쿼리를 취소하기 전에 대기 서버가 기다려야 하는 시간을 결정한다. WAL 데이터를 WAL 아카이브에서 읽어오는 경우(따라서 현재가 아닌 경우) max_standby_archive_delay가 적용된다. 설정값에 단위를 지정하지 않으면 밀리세컨드로 간주한다. 기본값은 30초이다. -1 값은 쿼리 충돌이 완료될 때까지 대기 서버가 무한정 대기하도록 허용한다. 이 매개 변수는 postgresql.conf 파일 또는 서버 커맨드 라인에서만 설정 가능하다.

취소 전 쿼리를 실행할 수 있는 시간 길이와 max_standby_archive_delay는 동일하지 않는 점에 유의해야 한다. 오히려 이것은 WAL 세그먼트의 데이터를 적용하는 것이 허용된 최대 총 시간이다. 따라서 WAL 세그먼트 초반에 어떤 쿼리 때문에 상당한 지연이 발생한 경우 후속 충돌 쿼리는 유예 시간이 훨씬 짧아진다.

max_standby_streaming_delay (integer)

핫 스탠바이가 작동 중이면 26.5.2절에서 설명된 대로 이 매개 변수는 적용 직전의 WAL 항목과 충돌하는 대기 서버 쿼리를 취소하기 전에 대기 서버가 기다려야 하는 시간을 결정한다. WAL 데이터를 스트리밍 복제를 통해 수신하는 경우 max_standby_streaming_delay가 적용된다. 설정값에 단위를 지정하지 않으면 밀리세컨드로 간주한다. 기본값은 30초이다. -1 값은 쿼리 충돌이 완료될 때까지 대기 서버가 무한정 대기하도록 허용한다. 이 매개 변수는 postgresql.conf 파일 또는 서버 커맨드 라인에서만 설정 가능하다.

취소 전 쿼리를 실행할 수 있는 시간 길이와 max_standby_streaming_delay는 동일하지 않은 점에 유의해야 한다. 오히려 이것은 운영 서버로부터 수신했던 WAL데이터를 적용하는 것이 허용된 최대 총 시간이다. 따라서 어떤 쿼리 때문에 상당한 지연이 발생한 경우 후속 충돌 쿼리는 대기 서버가 다시 따라잡을 때까지 유예 시간이 훨씬 짧아진다.

wal_receiver_create_temp_slot (boolean)

Specifies whether the WAL receiver process should create a temporary replication slot on the remote instance when no permanent replication slot to use has been configured (using primary_slot_name). The default is off. This parameter can only be set in the postgresql.conf file or on the server command line. If this parameter is changed while the WAL receiver process is running, that process is signaled to shut down and expected to restart with the new setting.

wal_receiver_status_interval (integer)

대기 서버의 WAL 수신자 프로세스가 복제 프로세스에 대한 정보를 운영 서버 또는 업스트림 스탠바이로 전송하는 최소 빈도를 지정한다. 이것은 pg_stat_replication 뷰를 사용하여 볼 수 있다. 대기 서버는 작성된 마지막 트랜잭션 로그 위치, 디스크에 기록한 마지막 위치 및 적용된 마지막 위치를 알려 준다. 이 매개 변수의 값은 리포트 지점간 최대 시간 간격이다. 업데이트는 쓰기 또는 플러시(flush) 위치가 변경될 때마다 전송되거나 최소한 이 매개 변수가 지정한 빈도로 전송된다. 따라서 적용 위치는 실제 위치보다 약간 뒤처질 수 있다. 설정값에 단위를 지정하지 않으면, 초로 간주한다. 기본값은 10초다. 이 매개 변수를 0으로 설정하면 상태 업데이트가 완전히 비활성화된다. 이 매개 변수는 postgresql.conf 파일 또는 서버 커맨드 라인에서만 설정 가능하다.

hot_standby_feedback (boolean)

핫 스탠바이가 대기 서버에서 현재 실행 중인 쿼리에 대해 운영 서버 또는 업스트림 스탠바이로 피드백을 전송할 것인지를 지정한다. 이 매개 변수는 클린업 레코드에 의해 야기된 쿼리 취소를 없애는 데 사용할 수 있지만 일부 작업 부하의 경우 운영 서버에서 데이터베이스 팽창을 초래할 수 있다. 피드백 메시지는 wal_receiver_status_interval당 한 번 이상 전송되지 않는다. 기본값은 off이다. 이 매개 변수는 postgresql.conf 파일 또는 서버 커맨드 라인에서만 설정 가능하다.

케스케이드형 복제를 사용 중인 경우 운영 서버에 도달할 때까지 피드백이 상류로 전달된다. 상류 전달 외에, 대기 서버는 수신하는 피드백을 다른 용도로 사용하지 않는다.

This setting does not override the behavior of old_snapshot_threshold on the primary; a snapshot on the standby which exceeds the primary's age threshold can become invalid, resulting in cancellation of transactions on the standby. This is because old_snapshot_threshold is intended to provide an absolute limit on the time which dead rows can contribute to bloat, which would otherwise be violated because of the configuration of a standby.

wal_receiver_timeout (integer)

지정된 시간 이상 작동되지 않은 복제 연결이 중단된다. 이것은 대기 서버가 프라이머리 노드 충돌 또는 네트워크 중단을 검출할 때 유용하다. 설정값에 단위를 지정하지 않으면 밀리세컨드로 간주한다. 기본값은 60초다. 0 값은 시스템 타임아웃 메커니즘을 비활성화한다. 이 매개 변수는 postgresql.conf 파일 또는 서버 커맨드 라인에서만 설정 가능하다.

wal_retrieve_retry_interval (integer)

스트리밍 복제 로그나, 로컬 pg_wal 디렉터리나, WAL 아카이브로 쌓이는 트랜잭션 로그가 없을 때, 복제 작업을 다시 진행하기 위해서 기다리는 최대 시간을 지정한다. 설정값에 단위를 지정하지 않으면, 밀리세컨드로 간주한다. 기본값은 5초다. 이 매개 변수는 postgresql.conf 파일 또는 서버 커맨드 라인에서만 설정 가능하다.

이 설정은 대기 서버가 복구 작업을 진행할 때 새 WAL 자료를 기다리는 시간을 제어하는데 유용하다. 예를 들어, 아카이브 기반 복구 작업에서 이 시간을 줄여서 보다 민첩하게 새로운 WAL 로그 자료를 반영할 수 있다. 또는 트랜잭션 량이 그리 많지 않은 시스템에서는 이 값을 늘려 필요한 WAL 아카이브 조각들을 요청하는 작업을 좀 더 줄일 수 있다. 예를 들어 이런 요청 작업 자체가 과금 대상이 되는 클라우드 환경에서는 이 값을 적절히 조절해서 이용 요금을 최적화 할 수 있을 것이다.

recovery_min_apply_delay (integer)

By default, a standby server restores WAL records from the sending server as soon as possible. It may be useful to have a time-delayed copy of the data, offering opportunities to correct data loss errors. This parameter allows you to delay recovery by a specified amount of time. For example, if you set this parameter to 5min, the standby will replay each transaction commit only when the system time on the standby is at least five minutes past the commit time reported by the master. If this value is specified without units, it is taken as milliseconds. The default is zero, adding no delay.

It is possible that the replication delay between servers exceeds the value of this parameter, in which case no delay is added. Note that the delay is calculated between the WAL time stamp as written on master and the current time on the standby. Delays in transfer because of network lag or cascading replication configurations may reduce the actual wait time significantly. If the system clocks on master and standby are not synchronized, this may lead to recovery applying records earlier than expected; but that is not a major issue because useful settings of this parameter are much larger than typical time deviations between servers.

The delay occurs only on WAL records for transaction commits. Other records are replayed as quickly as possible, which is not a problem because MVCC visibility rules ensure their effects are not visible until the corresponding commit record is applied.

The delay occurs once the database in recovery has reached a consistent state, until the standby is promoted or triggered. After that the standby will end recovery without further waiting.

This parameter is intended for use with streaming replication deployments; however, if the parameter is specified it will be honored in all cases except crash recovery. hot_standby_feedback will be delayed by use of this feature which could lead to bloat on the master; use both together with care.

주의

Synchronous replication is affected by this setting when synchronous_commit is set to remote_apply; every COMMIT will need to wait to be applied.

This parameter can only be set in the postgresql.conf file or on the server command line.

19.6.4. Subscribers

These settings control the behavior of a logical replication subscriber. Their values on the publisher are irrelevant.

Note that wal_receiver_timeout, wal_receiver_status_interval and wal_retrieve_retry_interval configuration parameters affect the logical replication workers as well.

max_logical_replication_workers (int)

Specifies maximum number of logical replication workers. This includes both apply workers and table synchronization workers.

Logical replication workers are taken from the pool defined by max_worker_processes.

The default value is 4.

max_sync_workers_per_subscription (integer)

Maximum number of synchronization workers per subscription. This parameter controls the amount of parallelism of the initial data copy during the subscription initialization or when new tables are added.

Currently, there can be only one synchronization worker per table.

The synchronization workers are taken from the pool defined by max_logical_replication_workers.

The default value is 2.