19.6. 复制 #
这些设置控制内置流复制特性(见第 26.2.5 节)和内置逻辑复制特性(见第 29 章)的行为。
对于流复制,服务器将可以是主库或备库。主库能发送数据,而备库总是被复制数据的接收者。当使用级联复制(见第 26.2.7 节)时,备库也可以是发送者,同时也是接收者。这些参数主要用于发送服务器和备库,尽管某些只在主库上有意义。如果有必要,设置可以在集簇中变化而不出问题。
对于逻辑复制,发布者(执行 CREATE PUBLICATION 的服务器)向订阅者(执行 CREATE SUBSCRIPTION 的服务器)复制数据。服务器也可以同时是发布者和订阅者。注意,下文各节将发布者称为“发送者”。有关逻辑复制配置设置的更多详细信息,请参见第 29.12 节。
19.6.1. 发送服务器 #
这些参数可以在任何发送复制数据给一个或多个备库的服务器上设置。主库总是一个发送服务器,因此这些参数总是要在主库上设置。这些参数的角色和含义不会在一个备库变成主库后改变。
max_wal_senders(integer) #指定来自备库或流式基础备份客户端的最大并发连接数(即同时运行的 WAL 发送进程的最大数量)。默认值为
10。值0表示禁用复制。流式客户端突然断开连接后,可能会留下一个孤立连接槽,直到超时才释放。因此,此参数应设置得略高于预期的最大客户端数,使断开连接的客户端能够立即重新连接。此参数只能在服务器启动时设置。此外,wal_level必须设置为replica或更高级别,才允许来自备库的连接。运行备库时,必须将此参数设置为大于或等于主库上的值。否则,备库上将不允许查询。
max_replication_slots(integer) #指定服务器可以支持的复制槽(见第 26.2.6 节)最大数量。默认值为 10。这个参数只能在服务器启动时设置。将它设置为一个比当前已有复制槽要少的值会阻碍服务器启动。此外,要允许使用复制槽,
wal_level必须被设置为replica或更高。output_plugin_libraries(string) #列出安装在 dynamic_library_path 所指定位置中、同时也受信任、可供复制客户端用作逻辑输出插件的库。任何针对其他库的逻辑解码或复制请求都将被拒绝。所有用户都受此限制。默认值为
'pgoutput, test_decoding',它们是标准 PostgreSQL 发行版中包含的两个逻辑输出插件。其格式为以逗号分隔的库名称列表,每个名称的解释方式与
LOAD命令相同(但逻辑解码客户端指定的插件名称必须与列表中的一个条目完全匹配,大小写或路径结构不得有变化)。条目之间的空白会被忽略;如果库名称中需要包含空白或逗号,请用双引号将其括起。服务器管理员有责任确保,加载添加到此列表中的库时,不会无意中向非超级用户授予额外权限。
注意
从没有
output_plugin_libraries参数的版本更新服务器时,以下查询可帮助构造所有持久逻辑复制槽所需的插件列表:SELECT DISTINCT plugin FROM pg_replication_slots WHERE plugin IS NOT NULL;
调整
output_plugin_libraries之前,请仔细审查该列表以确保安全。上述查询只能显示过去某个时刻已成功添加到复制槽的插件。新近被拒绝的请求将以类似以下消息出现在日志中:
ERROR: library "..." may not be used as an output plugin DETAIL: The configuration parameter "output_plugin_libraries" (currently 'pgoutput, test_decoding') does not name this library as a trusted output plugin. HINT: If it is safe for all REPLICATION users to use this library as an output plugin, add it to "output_plugin_libraries" and reload the server configuration.
wal_keep_size(integer) #指定在
pg_wal目录中保留的旧 WAL 文件的最小总量,以便备库需要时获取这些文件进行流复制。如果连接到发送服务器的备库落后超过wal_keep_size兆字节,发送服务器可能会移除备库仍需要的 WAL 段,从而导致复制连接终止。下游连接最终也会因此失败。(不过,如果使用了 WAL 归档,备库可以通过从归档获取该段来恢复。)此设置只规定
pg_wal中保留的段的最小总量;系统可能需要为 WAL 归档或从检查点恢复而保留更多段。如果wal_keep_size为零(默认值),系统不会为备库额外保留任何段,因此备库可用的旧 WAL 段数取决于前一个检查点的位置和 WAL 归档的状态。如果指定值时没有单位,则按兆字节计算。此参数只能在postgresql.conf文件中或服务器命令行上设置。max_slot_wal_keep_size(integer) #指定检查点时复制槽允许在
pg_wal目录中保留的 WAL 文件最大总量。如果max_slot_wal_keep_size为 -1(默认值),复制槽可以保留无限量的 WAL 文件。否则,如果复制槽的 restart_lsn 落后当前 LSN 超过给定大小,使用该槽的备库可能会因为所需 WAL 文件被移除而无法继续复制。可以在 pg_replication_slots 中查看复制槽的 WAL 可用情况。如果指定值时没有单位,则按兆字节计算。此参数只能在postgresql.conf文件中或服务器命令行上设置。idle_replication_slot_timeout(integer) #使保持空闲状态(未被复制连接使用)超过此持续时间的复制槽失效。如果指定值时没有单位,则以秒为单位。零值(默认值)将禁用空闲超时失效机制。该参数只能在
postgresql.conf文件中或服务器命令行上设置。由于空闲超时导致的槽失效会在检查点期间发生。由于检查点每隔
checkpoint_timeout触发一次,因此从idle_replication_slot_timeout超时到下一个检查点使槽失效之间可能会有一些延迟。若要避免这种延迟,用户可以强制执行检查点,以便及时使不活动的槽失效。槽的不活动时间根据其 pg_replication_slots.inactive_since值计算。请注意,空闲超时失效机制不适用于不保留 WAL 的槽,也不适用于正在从主库同步的备库上的槽(即 pg_replication_slots.
synced值为true的备库槽)。已同步的槽总是被视为空闲,因为它们不会执行逻辑解码来生成变更。wal_sender_timeout(integer) #终止非活动时间超过此值的复制连接。这有助于发送服务器检测备库崩溃或网络中断。如果指定值时没有单位,则按毫秒计算。默认值为 60 秒。值零禁用超时机制。
对于跨多个地理位置分布的集簇,在各位置使用不同的值可以提高集簇管理的灵活性。对于网络延迟较低的备库,较小的值有助于更快地检测故障;对于地处远端、网络延迟较高的备库,较大的值有助于更准确地判断其健康状况。
track_commit_timestamp(boolean) #记录事务的提交时间。该参数只能在服务器启动时设置。默认值是
off。
19.6.2. 主库 #
这些参数可以在向一个或多个备库发送复制数据的主库上设置。除这些参数外,还必须在主库上适当设置 wal_level,也可以选择启用 WAL 归档(见第 19.5.3 节)。这些参数在备库上的取值不影响备库运行,不过也可以预先设置,以备将来提升为主库。
synchronous_standby_names(string) #如第 26.2.8 节所述,这个参数指定一个支持同步复制的备库的列表。将有一个或多个活动的同步备库,在这些备库确认收到它们的数据之后,等待提交的事务将被允许继续下去。同步备库是那些名字出现在这个列表中,并且当前已连接并且正在实时流式传输数据(如
pg_stat_replication视图中streaming的状态所示)的服务器。指定多于一台同步备库可以得到非常高的可用性并且能防止数据丢失。用于这一目的的备库的名称是其
application_name设置,它在备库的连接信息中设置。对于物理复制备库,应在primary_conninfo设置中指定。若已设置 cluster_name,则默认使用其值;否则默认值为walreceiver。对于逻辑复制,可以在订阅的连接信息中设置,默认值为订阅名称。对于其他复制流消费者,请参考其文档。这个参数使用下面的语法之一来指定一个备库列表:
[FIRST]
num_sync(standby_name[, ...] ) ANYnum_sync(standby_name[, ...] )standby_name[, ...]其中
num_sync是事务需要等待其回复的同步备库的数量,standby_name是一个备库的名称。num_sync必须是大于零的整数。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必须被放在双引号内。PostgreSQL 版本 9.6 之前使用过第三种语法,目前也仍然支持。它与使用
FIRST且num_sync等于 1 的第一种语法相同。例如,FIRST 1 (s1, s2)和s1, s2具有相同的含义:s1或者s2会被选中作为同步备库。特殊项
*匹配任意备库名称。没有机制强制备库名称的唯一性。在出现重复的情况下,匹配的备库之一将被认为是较高优先级,不过无法弄清到底是哪一个。
注意
每一个
standby_name都应该具有合法 SQL 标识符的形式,除非它是*。如果必要你可以使用双引号。但是注意在比较standby_name和备库应用程序名称时是大小写不敏感的(不管有没有双引号)。如果这里没有指定同步备库名称,那么不启用同步复制并且事务提交将不会等待复制。这是默认的配置。即便当同步复制被启用时,个体事务也可以被配置为不等待复制,做法是将 synchronous_commit 参数设置为
local或off。这个参数只能在
postgresql.conf文件中或通过服务器命令行进行设置。synchronized_standby_slots(string) #逻辑 WAL 发送进程将等待的流复制备库槽名称的逗号分隔列表。逻辑 WAL 发送进程仅在指定复制槽确认接收 WAL 后,才会把解码后的更改发送给插件。这可以确保逻辑复制故障切换槽在相应物理备库接收这些更改并将其刷盘之前,不会消耗这些更改。如果逻辑复制连接需要在物理备库被提升后切换到该备库,则应在这里列出该备库的物理复制槽。请注意,如果
synchronized_standby_slots中指定的槽不存在或无效,逻辑复制将不会继续。此外,使用逻辑故障切换槽的复制管理函数pg_replication_slot_advance、pg_logical_slot_get_changes和pg_logical_slot_peek_changes将阻塞,直到synchronized_standby_slots中列出的所有物理槽都确认接收到了 WAL。与
synchronized_standby_slots中物理复制槽对应的备库必须配置sync_replication_slots = true,这样它们才能从主库接收逻辑故障切换槽的更改。
19.6.3. 备库 #
这些设置控制备库接收复制数据时的行为。它们在主库的值是无关的。
primary_conninfo(string) #指定备库用来连接发送服务器的连接字符串。这个字符串的格式在第 32.1.1 节中描述。如果在这个字符串中有任何选项未被指定,那么将检查相应的环境变量(见第 32.15 节)。如果环境变量也没有被设置,则使用默认值。
连接字符串应当指定发送服务器的主机名(或地址),以及端口号(如果它与备库的默认端口不同)。还要指定发送服务器上具有适当权限的角色所对应的用户名(见第 26.2.5.1 节)。如果发送端要求密码认证,还需要提供密码。它既可以直接写在
primary_conninfo字符串中,也可以写在备库上的独立~/.pgpass文件中(数据库名使用replication)。对于复制槽同步(见第 47.2.3 节),还必须在
primary_conninfo字符串中指定有效的dbname。该设置只用于槽同步,对流式传输会被忽略。这个参数只能在
postgresql.conf文件或服务器命令行上设置。如果在 WAL 接收进程运行时修改该参数,则会向该进程发送信号使其关闭,并期望它使用新设置重新启动(除非primary_conninfo是空字符串)。如果服务器没有处于备库模式,则此设置无效。primary_slot_name(string) #可选地指定通过流复制连接到发送服务器时使用一个现有的复制槽来控制上游节点上的资源移除(见第 26.2.6 节)。这个参数只能在
postgresql.conf文件或服务器命令行上设置。如果在 WAL 接收进程运行时更改此参数,则会向该进程发送关闭信号,并预期它使用新设置重新启动。如果没有设置primary_conninfo或服务器没有处于备库模式,则此设置无效。hot_standby(boolean) #指定在恢复期间,你是否能够连接并运行查询,如第 26.4 节中所述。默认值是
on。这个参数只能在服务器启动时设置。它只在归档恢复期间或备库模式下才有效。max_standby_archive_delay(integer) #当热备处于活动状态时,此参数确定备库在取消与即将应用的 WAL 条目冲突的备库查询之前应等待多长时间,如第 26.4.2 节中所述。
max_standby_archive_delay在从 WAL 归档中读取 WAL 数据时适用(因此不是当前的)。如果未指定单位,则将其视为毫秒。默认值为 30 秒。值为-1 允许备库永远等待冲突查询完成。此参数只能在postgresql.conf文件或服务器命令行中设置。注意,
max_standby_archive_delay并不等同于查询在被取消前可以运行的最长时间;它表示应用任意一个 WAL 段的数据所允许的最长总时间。因此,如果某个查询先前在处理该 WAL 段时已造成显著延迟,后续冲突查询的宽限时间就会短得多。max_standby_streaming_delay(integer) #当热备处于活动状态时,此参数确定备库在取消与即将应用的 WAL 条目冲突的备库查询之前应等待多长时间,如第 26.4.2 节中所述。
max_standby_streaming_delay在通过流复制接收 WAL 数据时应用。如果未指定单位,则将其视为毫秒。默认值为 30 秒。值为-1 允许备库永远等待冲突查询完成。此参数只能在postgresql.conf文件或服务器命令行中设置。注意,
max_standby_streaming_delay并不等同于查询在被取消前可以运行的最长时间;它表示从主库接收到 WAL 数据后,允许用于应用这些数据的最长总时间。因此,如果某个查询已造成显著延迟,后续冲突查询的宽限时间就会短得多,直到备库再次赶上进度。wal_receiver_create_temp_slot(boolean) #指定在未使用 primary_slot_name 配置要使用的永久复制槽时,WAL 接收进程是否应在远程实例上创建临时复制槽。默认值为 off。此参数只能在
postgresql.conf文件中或服务器命令行上设置。如果在 WAL 接收进程运行时更改此参数,则会向该进程发送信号使其关闭,并预期它使用新设置重新启动。wal_receiver_status_interval(integer) #指定在备库上的 WAL 接收进程向主库或上游备库发送有关复制进度的信息的最小频度,它可以使用
pg_stat_replication视图看到。备库将报告最后写入的预写日志位置、最后刷盘的位置以及最后应用的位置。这个参数的值是报告之间的最大时间量。每次写入或刷盘位置改变时会发送状态更新,或者在此参数设置为非零值时,按其指定的频度发送。另外还会在一些情况下忽略此参数发送更新;例如,当现有的 WAL 处理完成或当synchronous_commit设置为remote_apply时。因此,应用位置可能比真实位置略微滞后。如果指定值时没有单位,则以秒为单位。默认值是 10 秒。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。hot_standby_feedback(boolean) #指定一个热备机是否将会向主库或上游备库发送有关于备库上当前正被执行的查询的反馈。这个参数可以被用来消除由清理记录引起的查询取消,但是在某些负载下可能导致主库上的数据库膨胀。反馈消息的发送频度不会高于每个
wal_receiver_status_interval周期发送一次。默认值是off。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。如果使用级联复制,反馈将被向上游传递直到它最后到达主库。备库在接收到反馈之后除了传递给上游不会做任何其他操作。
请注意,如果备库上的时钟被向前或向后调整,反馈消息可能无法按要求的时间间隔发送。在极端情况下,由于该反馈机制基于时间戳,这可能导致主库长时间面临无法移除死元组的风险。
wal_receiver_timeout(integer) #中止处于非活动状态超过这个时间量的复制连接。这对于正在接收的备库检测主库崩溃或网络断开有用。如果指定值时没有单位,则以毫秒为单位。默认值是 60 秒。值为零会禁用超时机制。这个参数只能在
postgresql.conf文件中或者服务器命令行中设置。wal_retrieve_retry_interval(integer) #指定当从任何来源(流复制、本地
pg_wal或者 WAL 归档)都得不到 WAL 数据时,备库应该等待多久才去重新尝试获取 WAL 数据。如果指定值时没有单位,则以毫秒为单位。默认值是 5 秒。这个参数只能在postgresql.conf文件或者服务器命令行中设置。这个参数在恢复节点需要控制等待新 WAL 数据可用时长的配置中很有用。例如,在归档恢复中,降低该参数的值可以让系统在检测到新 WAL 文件时更快作出响应;在 WAL 活动较低的系统上,增大该值则可以减少访问 WAL 归档所需的请求次数,这在对基础设施访问次数进行计量的云环境中尤其有用。
在逻辑复制中,该参数还限制失败的复制应用工作进程或表同步工作进程被重新启动的频率。
recovery_min_apply_delay(integer) #默认情况下,备库会尽快恢复来自发送服务器的 WAL 记录。保留一份延迟的数据副本可能很有用,因为它提供了纠正数据丢失错误的机会。此参数允许将恢复延迟指定的时间。例如,将此参数设置为
5min时,只有当备库系统时间比主库报告的提交时间至少晚五分钟,备库才会重放各事务的提交。如果没有指定单位,则以毫秒计。默认值为零,不增加延迟。服务器之间的复制延迟可能超过此参数的值,这种情况下不会增加延迟。注意,延迟根据主库写入的 WAL 时间戳与备库当前时间之差计算。网络延迟或级联复制配置导致的传输延迟,可能显著缩短实际等待时间。如果主库和备库的系统时钟不同步,恢复时可能比预期更早应用记录;但这通常不是主要问题,因为此参数的实用取值远大于服务器间常见的时间偏差。
延迟仅发生在事务提交的 WAL 记录上。其他记录会尽快重放;这不会造成问题,因为 MVCC 可见性规则确保在对应提交记录被应用之前,它们的效果不会可见。
恢复中的数据库达到一致状态后开始延迟,直到备库被提升或触发。此后,备库会结束恢复,不再等待。
WAL 记录必须保留在备库上,直到可以应用它们。因此,更长的延迟会导致更多 WAL 文件积压,增加备库
pg_wal目录所需的磁盘空间。此参数旨在用于流复制部署;不过,只要指定了此参数,它就会在除崩溃恢复以外的所有情况下生效。使用此功能也会延迟
hot_standby_feedback,可能导致主库膨胀;同时使用两者时应谨慎。警告
当
synchronous_commit设置为remote_apply时,同步复制会受到此设置影响;每个COMMIT都必须等待提交被应用。此参数只能在
postgresql.conf文件中或服务器命令行上设置。sync_replication_slots(boolean) #使物理备库能够从主库同步逻辑故障切换槽,以便逻辑订阅者在故障切换后能够从新的主库恢复复制。
默认情况下该参数被禁用。该参数只能在
postgresql.conf文件中或服务器命令行上设置。
19.6.4. 订阅者 #
这些设置控制逻辑复制订阅者的行为。它们在发布者上的值与此无关。更多详细信息请参见第 29.12 节。
max_active_replication_origins(integer) #指定同时可以跟踪多少个复制源(参见第 48 章),从而实际上限制了服务器上可以创建多少逻辑复制订阅。将其设置为低于当前正在跟踪的复制源数量(体现在 pg_replication_origin_status 中)会阻止服务器启动。默认值为 10。该参数只能在服务器启动时设置。
max_active_replication_origins至少必须设置为订阅者上要添加的订阅数量,再加上一些用于表同步的预留。max_logical_replication_workers(integer) #指定逻辑复制工作进程的最大数量,其中包括领导者应用工作进程、并行应用工作进程和表同步工作进程。
逻辑复制工作进程来自
max_worker_processes定义的进程池。默认值是 4。此参数只能在服务器启动时设置。
max_sync_workers_per_subscription(integer) #每个订阅允许的最大同步工作进程数。该参数控制订阅初始化时或新增表时初始数据复制的并行度。
目前,每个表只能有一个同步工作进程。
同步工作进程来自
max_logical_replication_workers定义的进程池。默认值是 2。此参数只能在
postgresql.conf文件中或服务器命令行上设置。max_parallel_apply_workers_per_subscription(integer) #每个订阅可使用的并行应用工作进程最大数。该参数控制订阅设置为
streaming = parallel时,对流式传入的进行中事务进行并行应用的程度。并行应用工作进程来自
max_logical_replication_workers定义的进程池。默认值是 2。此参数只能在
postgresql.conf文件中或服务器命令行上设置。
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.