复制(REPLICATION)类别参数
本文档介绍了系统配置参数中 复制类别的相关参数。
注意!
为确保系统稳定与安全,请务必谨慎手动修改相关参数。
这些设置控制流复制特性的行为。服务器将可以是主控服务器或备用服务器。主控机能发送数据,而备用机总是被复制数据的接收者。这些参数主要用于发送服务器和备用服务器,尽管某些只在主服务器上有意义。
发送服务器(Sending Servers)
此部分参数需在 Master 及任何将要发送复制数据的 Standby 上设置。
max_replication_slots
指定服务器可以支持的复制槽最大数量。
- 此参数只能在服务器启动时设置。
- 将它设置为一个比当前已有复制槽要少的值会阻碍服务器启动。
- 要允许使用复制槽,wal_level 必须被设置为
replica
或更高。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 10 | 1 ~ 262143 | segments;system;restart |
max_slot_wal_keep_size
设置可以被复制槽保留的最大 WAL 尺寸(MB)。
- 如果磁盘上的 WAL 占用了此参数值大小的空间,复制槽将被标记为失败,并释放 Segments 以供删除或回收。
- 默认值为
-1
,即禁用此功能。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | -1 | -1 ~ INT_MAX/1024 | segments;system;reload |
max_wal_senders
指定来自备用服务器或流式基础备份客户端的并发连接的最大数量(即同时运行 WAL 发送进程的最大数)。
- 值 0 意味着禁用复制。
- 突然的流客户端断开连接可能留下一个孤立连接槽(知道达到超时),因此这个参数应该设置得略高于最大客户端连接数,这样断开连接的客户端可以立刻重新连接。
- 此参数只能在服务器启动时被设置。此外,wal_level 必须设置为
replica
或更高级别以允许来自备用服务器的连接。 - 当运行备用服务器时,你必须将此参数设置为与主服务器上相同的或更高的值。否则,备用服务器中将不允许查询。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 10 | 0 ~ 262143 | segments;system;restart |
track_commit_timestamp
记录事务的提交时间。
| 数据类型 | 默认值 | 设置分类 | | --- | --- | --- | --- | | boolean | off | segments;system;restart |
wal_init_zero
当此参数被设置为 on
,则会以 0 填充新的 WAL 文件。
- 在一些文件系统中,这确保了在我们需要写入 WAL 记录前文件空间是被分配好的。
- 不过,Copy-On-Write(COW)文件系统可能并不能从此参数设置中获益,因此此参数会跳过不必要的工作。
- 如果设置为
off
,当文件被创建时只有最后的字节会被写入,因此它会拥有一个预期的尺寸。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | segments;session;reload;superuser |
wal_keep_segments
指定在备用服务器需要为流复制获取日志段文件的情况下,pg_wal
目录下所能保留的过去日志文件段的最小数目。
- 每个段通常是 16 兆字节。如果一个连接到发送服务器的备用服务器落后了超过
wal_keep_segments
个段,发送服务器可以移除一个备用机仍然需要的 WAL 段,在这种情况下复制连接将被中断。最终结果是下行连接也将最终失败(不过,如果在使用 WAL 归档,备用服务器可以通过从归档获取段来恢复)。 - 只设置
pg_wal
中保留的文件段的最小数目;系统可能需要为 WAL 归档或从一个检查点恢复保留更多段。 - 当此参数是
0
(缺省),系统不会为备用目的保留任何多余的段,因此备用服务器可用的旧 WAL 段的数量是一个上个检查点位置和 WAL 归档状态的函数。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 64 | 0 ~ INT_MAX | segments;system;reload |
wal_recycle
循环利用 WAL 文件。
- 当此参数被设置为
on
,WAL 文件会以重命名的方式被循环利用,以避免创建新的文件。 - 在 COW 文件系统中,创建新文件可能会更快,所以此参数会自动禁用。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | on | segments;session;reload;superuser |
wal_sender_timeout
中断那些停止活动超过这个时间量(以毫秒为单位)的复制连接。
- 这对发送服务器检测一个备用服务器的崩溃或网络的中断有用。
- 值
0
将禁用超时机制。 - 对于跨越多个地理位置分布的集群,每个位置使用不同的值可以为集群管理带来更大的灵活性。对于具有低延迟网络连接的备用服务器,较小的值有助于更快的故障检测;对于位于远端位置的具有高延迟网络连接的备用服务器,较大的值有助于更好地判断备用服务器的健康状况。
- 默认值为
300000毫秒
,即 5分钟。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 300000 | 0 ~ INT_MAX | segments;session;reload;superuser |
主服务器(Master Server)
此部分设置在 Standby 服务器上会被略过。
注意!
除了这些参数之外,在 Master 服务器上必须设置合适的 wal_level,并且也启用可选的 WAL 归档。
synchronous_standby_names
这个参数指定一个支持同步复制的备用服务器的列表。
- 可能会有一个或者多个活动的同步备用服务器,在这些备用服务器确认收到它们的数据之后,等待提交的事务将被允许继续下去。
- 同步备用服务器指的是名字出现在此列表前面,并且当前已连接,正在实时流传输数据的服务器。指定多于一台同步备用可以得到非常高的可用性并且能防止数据丢失。
- 用于这一目的的备用服务器的名称即为其连接信息中设置的
application_name
,列表中使用逗号分隔他们。 - 在物理复制备用的情况下,这应该被设置在
primary_conninfo
设置中,如果设置了,默认是cluster_name
的设置,否则为walreceiver
。 - 对于逻辑复制,可以在订阅的连接信息中设置。对于其他复制流消费者,请参考其文档。
- 特殊项
'*'
匹配任意备用名称。
这个参数使用下面的语法之一来指定一个备用服务器列表:
[FIRST] num_sync ( standby_name [, ...] )
ANY num_sync ( standby_name [, ...] )
standby_name [, ...]
- 其中
num_sync
是事务需要等待其回复的同步备用服务器的数量,standby_name
是一个备用服务器的名称。FIRST
以及ANY
指定从所列服务器中选取同步备用的方法。 - 关键词
FIRST
加上num_sync
指定一种基于优先的同步复制,并且会让事务提交等待,直到它们的 WAL 记录被复制到基于优先级选择的num_sync
台同步备用机上为止。例如,设置FIRST 3 (s1, s2, s3, s4)
将导致每次提交都等待来自三台较高优先级的备用机的答复,这三台备用机将从备用服务器 s1、s2、s3 以及 s4 中选出。 - 在该列表中出现较早的备用服务器将被给予较高的优先级,并且将被考虑为同步备用。列表中出现的其他备用服务器表示潜在的同步备用。如果当前的任何同步备用因为某种原因断开连接,它将立刻被下一个最高优先级的备用服务器替代。关键词
FIRST
是可选的。 - 关键词
ANY
加上num_sync
指定一种基于规定数量的同步复制,并且会让事务提交等待,直到它们的 WAL 记录被复制到所列出备用服务器中的至少num_sync
台上为止。例如,设置ANY 3 (s1, s2, s3, s4)
将导致每次提交会在收到 s1、s2、s3 以及 s4 中任意三台备用服务器的回答后立刻继续下去。 FIRST
和ANY
是大小写不敏感的。如果这些关键词被用作备用服务器的名字,其standby_name
必须被放在双引号内。- 第三种语法和
FIRST
和num_sync
等于 1 的第一种语法相同。例如,FIRST 1 (s1, s2)
和 s1, s2 具有相同的含义:s1 或者 s2 会被选中作为同步备用服务器。 - 没有机制强制备用服务器名称的唯一性。在出现重复的情况下,匹配的备用之一将被认为是较高优先级,不过无法弄清到底是哪一个。
- 注意:每一个
standby_name
都应该具有合法 SQL 标识符的形式,除非它是*
。如果必要你可以使用双引号。但是注意在比较standby_name
和备用机应用程序名称时是大小写不敏感的(不管有没有双引号)。 如果这里没有指定同步备用机名称,那么同步复制不能被启用并且事务提交将不会等待复制。这是默认的配置。即便当同步复制被启用时,个体事务也可以被配置为不等待复制,做法是将 synchronous_commit 参数设置为local
或off
。
数据类型 | 默认值 | 设置分类 |
---|---|---|
string | segments;system;reload |
vacuum_defer_cleanup_age
指定 VACUUM
和 HOT
更新在清除死亡行版本之前,应该推迟多久(以事务数量计)。
- 默认值是 0 个事务,表示死亡行版本将被尽可能快地清除,即当它们不再对任何打开的事务可见时尽快清除。
- 在一个支持热备用服务器的主服务器上,你可能希望把这个参数设置为一个非零值,这允许备用机上的查询有更多时间来完成而不会由于先前的行清除产生冲突。但是,由于该值是用在主服务器上发生的写事务的数目衡量的,很难预测对备用机查询可用的附加时间到底是多少。
- 你也可以考虑设置备用服务器上的
hot_standby_feedback
作为使用这个参数的一种替代方案。 - 这无法阻止已经达到
old_snapshot_threshold
所指定年龄的死亡行被清除。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ 1000000 | segments;system;reload |
备用服务器(Standby Servers)
此部分设置在 Master 服务器上会被略过。
hot_standby
- 这个参数只能在服务器启动时设置。
- 它只在归档恢复期间或备用机模式下才有效。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | segments;system;restart |
hot_standby_feedback
指定一个热备用机是否将会向主服务器或上游备用机发送有关于备用机上当前正被执行的查询的反馈。
- 这个参数可以被用来排除由于记录清除导致的查询取消,但是可能导致在主服务器上用于某些负载的数据库膨胀。
- 反馈消息的发送频度不会高于每个
wal_receiver_status_interval
周期发送一次。 - 如果使用级联复制,反馈将被向上游传递直到它最后到达主服务器。备用机在接收到反馈之后除了传递给上游不会做任何其他操作。
- 这个设置不会覆盖主服务器上
old_snapshot_threshold
的行为,备用服务器上一个超过了主服务器年龄阈值的快照可能会变得不可用,导致备用服务器上事务的取消。这是因为old_snapshot_threshold
会对死亡行能够存在的时间给出一个绝对限制,从而避免因一个备用服务器的配置而被破坏。
数据类型 | 默认值 | 设置分类 |
---|---|---|
boolean | off | segments;system;reload |
max_standby_archive_delay
当热备用机处于活动状态时,此参数决定取消那些与即将应用的 WAL 项冲突的备用机查询之前,备用服务器应该等待的时间(以毫秒为单位),详见 处理查询冲突。
- 当 WAL 数据被从 WAL 归档(并且因此不是当前的 WAL)时,max_standby_archive_delay 可以应用。
- 如果指定值时没有单位,则以毫秒为单位。
- 值
-1
允许备用机一直等到冲突查询结束。 - 注意:
max_standby_archive_delay
与取消之前一个查询能够运行的最长时间不同;它表示应用任何一个 WAL 段数据能够被允许的最长总时间。因此,如果一个查询早于 WAL 段导致了显著的延迟,后续冲突查询将只有更少的时间。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 30000 | -1 ~ INT_MAX | segments;system;reload |
max_standby_streaming_delay
当热备用机处于活动状态时,这个参数决定取消那些与即将应用的 WAL 项冲突的备用机查询之前,备用服务器应该等待的时间(以毫秒为单位),详见 处理查询冲突。
- 当 WAL 数据正在通过流复制被接收时,
max_standby_streaming_delay
可以应用。 - 如果指定值时没有单位,则以毫秒为单位。
- 值
-1
允许备用机一直等到冲突查询结束。 - 注意: 此参数与取消之前一个查询能够运行的最长时间不同;它表示在从主服务器接收到 WAL 数据并立刻应用它能够被允许的最长总时间。因此,如果一个查询导致了显著的延迟,后续冲突查询将只有更少的时间,直到备用服务器再次赶上进度。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 30000 | -1 ~ INT_MAX | segments;system;reload |
primary_conninfo
指定备用服务器用来连接发送服务器的连接字符串。
- 如果在这个字符串中有任何选项未被指定,那么将检查相应的环境变量。如果环境变量也没有被设置,则使用默认值。
- 连接字符串应当指定发送服务器的主机名(或地址),以及端口号(如果它和备用服务器的默认端口不同)。还要指定对应于发送服务器上合适权限角色的用户名。
- 如果发送服务器要求口令认证,则还需要提供一个口令。它可以在
primary_conninfo
字符串中提供,或者在备用服务器(使用replication
作为数据库名)的一个单独~/.pgpass
文件中提供。 - 不要在
primary_conninfo
字符串中指定一个数据库名。 - 这个参数只能在服务器启动时被设置。如果服务器没有处于备用模式,则此设置无效。
数据类型 | 默认值 | 设置分类 |
---|---|---|
string | segments;system;restart;superuser |
primary_slot_name
有选择地指定通过流复制连接到发送服务器时,使用一个现有的复制槽来控制上游节点上的资源移除。
- 这个参数只能在服务器启动时被设置。
- 如果没有设置
primary_conninfo
则这个设置无效。
数据类型 | 默认值 | 设置分类 |
---|---|---|
string | segments;system;restart |
promote_trigger_file
指定一个触发器文件,该文件的存在会结束备用机中的恢复状态。
- 即使这个值没有被设置,你也能够使用
pg_ctl promote
或调用pg_promote
来提升备用机。
数据类型 | 默认值 | 设置分类 |
---|---|---|
string | segments;system;reload |
recovery_min_apply_delay
默认情况下,备用服务器会尽快恢复来自于发送服务器的 WAL 记录。
- 有一份数据的延时拷贝是有用的,它能提供机会纠正数据丢失错误。这个参数允许系统在指定的时间后恢复延迟。例如,如果你设置这个参数为 5min,对于一个事务提交行为,只有当备用机上的系统时钟超过主服务器报告的提交时间至少 5分钟时,备用机才会重放该事务。
- 如果指定值时没有单位,则以毫秒为单位。
- 有可能服务器之间的复制延迟会超过这个参数的值,在这种情况下则不会增加延迟。注意:延迟是根据主服务器上写 WAL 的时间戳以及备用机上的当前时间来计算。由于网络延迟或者级联复制配置导致的传输延迟可能会显著地减少实际等待时间。
- 如果主服务器和备用机上的系统时钟不同步,这会导致恢复比预期的更早应用记录。但这不是一个主要问题,因为此参数设置的优势比服务器之间的时间偏差要大得多。
- 只有在事务提交的 WAL 记录上才会发生延迟。其他记录还是会被尽可能快地重放,这不会成为问题,因为 MVCC 可见性规则确保了在对应的提交记录被应用之前它们的效果不会被看到。
- 一旦恢复中的数据库已经达到一致状态,延迟就会产生,直到备用机被提升或者触发。在那之后,备用机将会结束恢复并且不再等待。
- 注意:这个参数的目的是和流复制部署一起使用。但是,如果指定了该参数,除了崩溃恢复之外所有的情况下都会遵守它。使用这个特性也会让
hot_standby_feedback
被延迟,这可能导致主服务器的膨胀,两者一起使用时要小心。 - 默认值为
0
,即不增加延迟。
注意!
当synchronous_commit
被设置为remote_apply
时,同步复制会受到这个设置的影响,每一个COMMIT
都需要等待被应用。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 0 | 0 ~ INT_MAX | segments;system;reload |
wal_receiver_status_interval
指定在备用机上的 WAL 接收者进程,向主服务器或上游备用机发送有关复制进度的信息的最小频度(以秒为单位)。
- 备用机将报告它已经写入的上一个 WAL 位置、刷到磁盘的上一个位置以及它已经应用的最后一个位置。
- 这个参数的值是报告之间的最大时间量。每次写入或刷出位置改变时会发送状态更新,或者至少按这个参数的指定的频度发送。因此,应用位置可能比真实位置略微滞后。
- 将这个参数设置为
0
将完全禁用状态更新。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 10 | 0 ~ INT_MAX/1000 | segments;system;reload |
wal_receiver_timeout
中止处于非活动状态超过此参数值时间(以毫秒为单位)的复制链接。
- 此参数对于正在接收的后备服务器检测主服务器崩溃或网络断开有用。
- 如果指定值时没有单位,则以毫秒为单位。
0
值表示禁用。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 60000 | 0 ~ INT_MAX | segments;system;reload |
wal_retrieve_retry_interval
指定当从任何来源(流复制、本地 pg_wal
或者 WAL 归档)都得不到 WAL 数据时,后备服务器应该等待多久(以毫秒为单位)才去重新尝试获取 WAL 数据。
- 此参数对恢复中的节点需要为新 WAL 数据可用等待多少时间的配置有用。例如,在归档恢复中,通过减小这个参数的值可以让恢复更积极地检测新的 WAL 日志文件。在一个 WAL 活动较低的系统上,增加这个参数的值可以减少访问 WAL 归档所必需的请求数量。这对于例如云环境是有用的,在其中对于基础设施的访问时间也是被考虑的。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 5000 | 1 ~ INT_MAX | segments;system;reload |
订阅者(Subscribers)
此部分参数控制逻辑复制订阅者的行为。它们在发布者上的值与此无关。
注意!
配置参数wal_receiver_timeout
、wal_receiver_status_interval
以及wal_retrieve_retry_interval
也影响逻辑复制工作者。
max_logical_replication_workers
指定逻辑复制工作者的最大数目。这同时包括应用工作者和表同步工作者。
- 逻辑复制工作者是从
max_worker_processes
定义的池中取出的。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 4 | 0 ~ 262143 | segments;system;restart |
max_sync_workers_per_subscription
每个订阅的同步工作者的最大数目。
- 此参数控制订阅初始化期间或者新表增加时的初始数据拷贝的并行度。
- 当前,每个表只能有一个同步工作者。
- 同步工作者是从
max_logical_replication_workers
定义的池中取出的。
数据类型 | 默认值 | 取值范围 | 设置分类 |
---|---|---|---|
int | 2 | 0 ~ 262143 | segments;system;reload |