GBase 8c的主备式部署方式,主备节点之间采用流复制的方式进行数据同步;分布式部署方式,同一个DN组中,主从节点之间也是采用流复制的方式进行数据同步。流复制(Streaming Replication)是PostgreSQL9.0开始使用的传递WAL日志的方式,只要primary库一产生日志,就会立马传递到standby库。

流复制主要分为2个阶段,实例恢复阶段和主备同步阶段。

  • 实例恢复阶段:当pg库异常宕机后,数据库启动时,pg会重放宕机前的最后一个checkpoint之后的所有WAL日志(这跟oracle、mysql等关系型数据库实例恢复是同样的原理,目的就是把数据库置为一致性状态)。pg备库在搭建时,一般主库都是不停机的,此时备份主库出来的备份库处于不一致状态,在备库启动时statup进程将进行实例恢复操作。
  • 主备同步阶段:wal receiver进程将备库最新的LSN号传递给主库,wal sender将主库最新LSN到备库最新的LSN之间的wal 传递给wal receiver,wal receiver接收WAL并将WAL写入到磁盘上,startup进程根据磁盘上的WAL日志在备库上重放。

下文主要介绍GBase 8c涉及流复制的主要参数配置:

(1)发送端服务器

max_wal_senders

参数说明:指定事务日志发送进程的并发连接最大数量。不可大于等于max_connections。
该参数属于POSTMASTER类型参数。
须知: wal_level必须设置为archive或者hot_standby以允许备机的连接。
取值范围:整型,0~1024
建议取值范围为8 ~ 100。
只有当使用单DN实例无主备场景下才可以设置为0。
默认值:16

wal_keep_segments

参数说明:Xlog日志文件段数量。设置“pg_xlog”目录下保留事务日志文件的最小数目,备机通过获取主机的日志进行流复制。
该参数属于SIGHUP类型参数。
取值范围:整型,2 ~ INT_MAX
默认值:16
设置建议:
当服务器开启日志归档或者从检查点恢复时,保留的日志文件数量可能大于wal_keep_segments设定的值。
如果此参数设置过小,则在备机请求事务日志时,此事务日志可能已经被产生的新事务日志覆盖,导致请求失败,主备关系断开。
当双机为异步传输时,以COPY方式连续导入4G以上数据需要增大wal_keep_segments配置。以T6000单板为例,如果导入数据量为50G,建议调整参数为1000。您可以在导入完成并且日志同步正常后,动态恢复此参数设置。
若 synchronous_commit 级别小于LOCAL_FLUSH,重建备机时,建议调大改参数为1000,
避免重建过程中,主机日志回收导致重建失败。

wal_sender_timeout

参数说明:设置本端等待事务日志接收端接收日志的最大等待时间。
该参数属于SIGHUP类型参数。
须知:
如果主机数据较大,重建备机数据库时需要增大此参数的值,主机数据在 500G时,此参数的参考值为600s。
此值不能大于wal_receiver_timeout或数据库重建时的超时参数。
取值范围:整型,0 ~ INT_MAX,单位为毫秒(ms)。
默认值:6s

logical_sender_timeout

参数说明:设置本端等待逻辑日志接收端接收日志的最大等待时间。
该参数属于USERSET类型参数。
取值范围:整型,0 ~ INT_MAX,单位为毫秒(ms)。
默认值:30s

max_replication_slots

参数说明:设置主机端的日志复制slot个数。
该参数属于POSTMASTER类型参数。
取值范围:整型,0~1024(建议取值范围:8~100)
默认值:8
enable_slot_log

参数说明:是否开启逻辑复制槽主备同步特性。
该参数属于USERSET类型参数。
取值范围:布尔型
on表示开启逻辑复制槽主备同步特性。
off表示不开启逻辑复制槽主备同步特性。
默认值:off

max_changes_in_memory

参数说明:逻辑解码时单条事务在内存中缓存的大小上限,单位字节。
该参数属于POSTMASTER类型参数。
取值范围:整型,1~2147483647‬
默认值:4096

max_cached_tuplebufs

参数说明:逻辑解码时总元组信息在内存中缓存的大小上限,单位字节。建议设置为max_changes_in_memory的两倍以上。
该参数属于POSTMASTER类型参数。
取值范围:整型,1~2147483647‬
默认值:8192

logical_decode_options_default

参数说明:指定逻辑解码启动时未指定解码选项的全局默认值。
该参数属于SIGHUP类型参数。
当前支持指定的逻辑解码选项包括:parallel-decode-num, parallel-queue-size, max-txn-in-memory, max-reorderbuffer-in-memory, exclude-users。选项的意义请参考“应用程序开发教程 > 基于JDBC开发 > 示例:逻辑复制代码示例”章节。

取值范围:通过逗号分隔的key=value字符串,例如:'parallel-decode-num=4,parallel-queue-size=128,exclude-users=userA'。其中空字符串表示采用程序硬编码的默认值。
默认值:""

enable_wal_shipping_compression

参数说明:在流式容灾模式下设置启动跨数据库实例日志压缩功能。
该参数属于SIGHUP类型参数。
须知: 该参数仅作用于流式容灾中跨数据库实例传输的一对walsender与walreceiver中,在主数据库实例上配置。
取值范围:布尔型
true表示打开流式容灾跨数据库实例日志压缩
false表示关闭流式容灾跨数据库实例日志压缩
默认值:false

repl_auth_mode

参数说明:设置主备复制和备机重建的验证模式。
该参数属于SIGHUP类型参数。
须知:
如果主机上开启了UUID验证功能、且配置了非空字符串的repl_uuid验证码,那么备机也需要开启UUID验证功能、且配置相同的repl_uuid验证码,否则主备日志复制和备机重建请求将被主机拒绝。
该参数支持SIGHUP动态加载新值。修改之后,不影响已建连的主备连接,对后续主备复制请求和主备重建请求生效。
支持Quorum、DCF协议下的备机重建验证;支持Quorum协议下的主备复制验证;不支持DCF协议下的主备复制验证。
UUID验证功能主要为了防止主、备误连导致的数据串扰和污染,不是用于安全目的。
该参数不支持主、备间自动同步。
取值范围:枚举类型
off 表示关闭UUID验证功能。
default 表示关闭UUID验证功能。
uuid 表示开启UUID验证功能。
默认值:default

replconninfo1 -replconninfo8

参数说明:设置本端侦听和鉴权的第一 ~ 八个节点信息。
该参数属于SIGHUP类型参数。
取值范围:字符串。其中空字符串表示没有配置第一 ~ 八个节点信息。
默认值:空字符串

cross_cluster_replconninfo1 - cross_cluster_replconninfo8

参数说明:设置跨集群的本端侦听和鉴权的第一 ~ 八个节点信息。
该参数属于SIGHUP类型参数。
取值范围:字符串。其中空字符串表示没有配置第一 ~ 八个节点信息。
默认值:空字符串

available_zone

参数说明:设置本端节点所在区域信息。
该参数属于POSTMASTER类型参数。
取值范围:字符串。其中空字符串表示没有配置节点信息。
默认值:空字符串

max_keep_log_seg

参数说明:流控参数,逻辑复制在DN本地会解析物理日志转换成逻辑日志,当未被解析的物理日志文件数量大于该参数时会触发限流。此参数为0表示关闭限流功能。
该参数属于USERSET类型参数。
取值范围:整型,0 ~ 2147483647。
默认值:0

(2)主服务器

synchronous_standby_names

参数说明:潜在同步复制的备机名称列表,每个名称用逗号分隔。
该参数属于SIGHUP类型参数。
须知:
当前连接的同步备机是列表中的第一个名称。如果当前同步备机失去连接,则它会立即更换下一个优先级更高的备机,并将此备机的名称放入列表中。
备机名称可以通过设置环境变量PGAPPNAME指定。
取值范围:字符串。当取值为*,表示匹配任意提供同步复制的备机名称。支持按如下格式配置:
ANY num_sync(standby_name [, …]) [, ANY num_sync (standby_name [, …])]
[FIRST] num_sync (standby_name [, …])
standby_name [, …]
说明:其中num_sync是事务需要等待其回复的同步复制的备机的数量,standby_name 是备机的名称,FIRST以及ANY指定从所列服务器中选取同步复制的备机的策略。
ANY N (node1,node2,…) 表示在括号内任选N个主机名称作为同步复制的备机名称列表。例如,ANY 1 (node1,node2) 表示在node1和node2中任选一个作为同步复制的备机名称。
ANY N1 (node1,node2,…), ANY N2 (node3,node4,…) 表示分组潜在同步复制的备机名称列表,在第一组括号内任选N1个主机名称作为第一组同步复制的备机名称列表,在第二组括号内任选N2个主机名称作为第二组同步复制的备机名称列表。此时两个分组之间为且关系,必须两个分组均达到各自需求的同步备机数,本地事务才可以被提交。
FIRST N (node1,node2,…)表示在括号内按出现顺序的先后作为优先级选择前N个主机名称作为同步复制的备机名称列表。例如,FIRST 1 (node1,node2)表示选择node1作为同步复制的备机名称。
node1,node2,…和FIRST 1 (node1,node2,…) 具有的含义相同。
若使用gs_guc工具设置该参数,需要如下设置:
gs_guc reload -Z datanode -N @NODE_NAME@ -D @DN_PATH@ -c "synchronous_standby_names='ANY NODE 1(dn_instanceId1, dn_instanceId2)'";
或者:
gs_guc reload -Z datanode -N @NODE_NAME@ -D @DN_PATH@ -c "synchronous_standby_names='ANY 1(AZ1, AZ2)'";
默认值:*
说明:
备机名称列表中不可出现重复的名称,配置中num_sync 不可大于备机列表数量。
多分组同步备机配置 如ANY N1 (node1,node2,…), ANY N2 (node3,node4,…) 的时候,多个分组之间为且关系,当前仅支持多ANY分组。不允许使用 * 来作为模糊匹配,不允许出现配置重复的备机。

most_available_sync

参数说明:在有同步备机故障时,主机事务不因同步备机故障而被阻塞。比如有两个同步备机,一个故障,另一个正常,这个时候主机事务只会等好的这个同步备,而不被故障的同步备所阻塞; 再比如走quorum协议时,一主三同步备,配置ANY 2(node1,node2,node3),当node1、node3故障,node2正常时,主机业务同样不被阻塞。
该参数属于SIGHUP类型参数。
取值范围:布尔型
on表示在有同步备机故障时,不阻塞主机。
off表示在有同步备机故障时,阻塞主机。
默认值:off

keep_sync_window

参数说明:延迟进入最大可用模式的时间。
当最大可用模式most_available_sync配置为on,在主备场景下,当存在同步备发生故障,导致不满足当前所配置的同步备数量(详细可参考synchonous_standby_name的含义)时,如果配置了keep_sync_window参数, 则在keep_sync_window设置的时间窗口内,继续保持最大保护模式,即阻塞主机的事务提交, 延缓进入最大可用模式的时间。
若在keep_sync_window超时窗口内,同步备机故障恢复,且满足当前所配置的同步备数量, 则不阻塞事务, 恢复到正常状态.
如果设置keep_sync_window,推荐最小配置为5s,以避免监控系统监控到网络不稳定的误报。
该参数属于SIGHUP类型参数。
取值范围:整形,范围0~INT_MAX,单位为秒。
0表示不设置keep_sync_window超时时间窗口, 即直接进入最大可用模式。
其余表示keep_sync_window超时时间窗口的大小。
默认值:0
须知:
配置该参数可能会对RPO造成影响, 若主机在所配置的超时时间窗口内发生故障,则从开始阻塞到主机故障这段时间窗口内的数据可能丢失。

enable_stream_replication

参数说明:控制主备、主从是否进行数据和日志同步。
该参数属于SIGHUP类型参数。
须知:
此参数属于性能测试参数,用于测试带有备机和不带备机的性能参数。关闭参数后,不能进行切换、故障等异常场景测试,否则会出现主备从不一致的情况。
此参数属于受控参数,不建议正常业务场景下关闭此参数。
当前版本默认不支持主备从部署模式。
取值范围:布尔型
on表示打开主备、主从同步。
off表示关闭主备、主从同步。
默认值:on

enable_mix_replication

参数说明:控制主备、主从之间WAL日志及数据复制的方式。
该参数属于INTERNAL类型参数,默认值为off,不允许外部修改。
须知:
此参数目前不允许正常业务场景下改变其值,即关闭WAL日志、数据页混合复制模式。
当前版本默认不支持主备从部署模式。
取值范围:布尔型
on表示打开WAL日志、数据页混合复制模式。
off表示关闭WAL日志、数据页混合复制模式。
默认值:off

vacuum_defer_cleanup_age

参数说明:指定VACUUM使用的事务数,VACUUM会延迟清除无效的行存表记录,延迟的事务个数通过vacuum_defer_cleanup_age进行设置。即VACUUM和VACUUM FULL操作不会立即清理刚刚被删除元组。
该参数属于SIGHUP类型参数。
取值范围:整型,0~1000000,值为0表示不延迟。
默认值:0

data_replicate_buffer_size

参数说明:发送端与接收端传递数据页时,队列占用内存的大小。此参数会影响主备之间复制的缓冲大小。
该参数属于POSTMASTER类型参数。
取值范围:整型,4096~1072693248,单位为KB。
默认值:16MB(即16384KB)

walsender_max_send_size

参数说明:设置主机端日志或数据发送缓冲区的大小。
该参数属于POSTMASTER类型参数。
取值范围:整型,8~INT_MAX,单位为KB。
默认值:8M(即8192KB)

enable_data_replicate

参数说明:当数据库在数据导入行存表时,主机与备机的数据同步方式可以进行选择。
该参数属于USERSET类型参数。
取值范围:布尔型
on表示导入数据行存表时主备数据采用数据页的方式进行同步。当replication_type参数为1时,不允许设置为on,如果此时用guc工具设置成on,会强制改为off。
off表示导入数据行存表时主备数据采用日志(Xlog)方式进行同步。
默认值:off

ha_module_debug

参数说明:用于查看数据复制时具体数据块的复制状态日志。
该参数属于USERSET类型参数。
取值范围:布尔型
on表示日志中将打印数据复制时每个数据块的状态。
off表示日志中不打印数据复制时每个数据块的状态。
默认值:off

enable_incremental_catchup

参数说明:控制主备之间数据追赶(catchup)的方式,目前默认不支持主备从部署模式。
该参数属于SIGHUP类型参数。
取值范围:布尔型
on表示备机catchup时用增量catchup方式,即从从备本地数据文件扫描获得主备差异数据文件列表,进行主备之间的catchup。
off表示备机catchup时用全量catchup方式,即从主机本地所有数据文件扫描获得主备差异数据文件列表,进行主备之间的catchup。
默认值:on

sync_config_strategy

参数说明:主机和备机、备机和级联备之间配置文件的同步策略。
该参数属于POSTMASTER类型参数。
取值范围:枚举类型
all_node: 主机配置为all_node时,表示允许主机向所有备机主动同步配置文件;备机配置为all_node时,表示允许当前备机向其主机发送同步请求,允许当前备机向其所有级联备主动同步配置文件;级联备配置为all_node时,表示允许当前级联备向上一级备机发送同步请求。
only_sync_node: 主机配置为only_sync_node时,表示仅允许主机向所有同步备机主动同步配置文件;备机配置为only_sync_node时,表示允许当前备机向其主机发送同步请求,不允许当前备机向其所有级联备机主动同步配置文件;级联备配置为only_sync_node时,表示允许当前级联备向其备机发送同步请求。
none_node: 主机配置为none_node时,表示不允许主机向任何备机主动同步配置文件;备机配置为none_node时,表示不允许当前备机向其主机发送同步请求,不允许当前备机向其所有级联备主动同步配置文件;级联备配置为none_node时,表示不允许当前级联备向其备机发送同步请求。
默认值:all_node
须知:
在一个包含了主机、备机和级联备的GBase 8s集群中,主机相对于备机是发送端,备机相对于主机是接收端,备机相对于级联备是发送端,级联备相对于备机是接收端。
发送端主动向接收端同步配置文件、接收端请求发送端同步配置文件是两个独立的事件,均会使得配置文件同步。若不希望配置文件同步,则需要将集群中所有节点的sync_config_strategy参数配置为none_node;若仅希望主机与同步备机同步配置文件,则需要将主机的sync_config_strategy参数配置为only_sync_node,其余节点配置为none_node;若希望所有节点同步配置文件,则需要将所有节点的sync_config_strategy参数配置为all_node。目前暂不支持自定义指定任意节点间的同步策略。
配置参数同步的具体表现为,发送端发送配置文件,对接收端配置文件中的对应参数直接覆盖。若设置了配置文件需要同步的策略,则修改接收端配置参数后,发送端会立刻覆盖接收端的配置参数,使得接收端修改不生效。
即使设置了配置文件需要同步的策略,仍有部分配置参数不会被同步。它们是:
“application_name”、 “archive_command”、 “audit_directory”、 “available_zone”、 “cgbase_control_port”、 “cgbase_sctp_port”、 “listen_addresses”、 “log_directory”、 “port”、 “replconninfo1”、 “replconninfo2”、 “replconninfo3”、 “replconninfo4”、 “replconninfo5”、 “replconninfo6”、 “replconninfo7”、 “replconninfo8”、 “ssl”、 “ssl_ca_file”、 “ssl_cert_file”、 “ssl_ciphers”、 “ssl_crl_file”、 “ssl_key_file”、 “ssl_renegotiation_limit”、 “ssl_cert_notify_time”、 “synchronous_standby_names”、 “local_bind_address”、 “perf_directory”、 “query_log_directory”、 “asp_log_directory”、 “streaming_router_port”、 “enable_upsert_to_merge”、 “archive_dest”、 “recovery_min_apply_delay”、 “sync_config_strategy”。
 

(3)备服务器

hot_standby

参数说明:设置是否允许备机在恢复过程中连接和查询。
该参数属于POSTMASTER类型参数。
须知:
如果此参数设置为on,wal_level必须设置为hot_standby,否则将导致数据库无法启动。
在双机环境中,因为会对双机其他一些功能产生影响,hot_standby参数不能设置成off。
如果hot_standby参数曾经被关闭,且wal_level参数曾被设置低于hot_standby等级,那么,再次打开hot_standby参数之前,为了确保主备环境下备机上待回放的日志都可以支持备机查询功能,需要进行如下操作:
1)将主、备的wal_level参数调整到hot_standby等级或以上,并重启实例生效。
2)在主机上执行checkpoint操作,并通过查询pg_stat_get_wal_senders()系统函数,确认各个备机的receiver_replay_location追上主机当前的sender_flush_location,保证wal_level的调整同步到备机并生效,且备机不需要再回放之前低等级的日志。
3)将主、备的hot_standby参数打开(设为on),并重启实例生效。
取值范围:布尔型
on表示允许备机在恢复过程中连接和查询。
off表示不允许备机在恢复过程中连接和查询。
默认值:on

max_standby_archive_delay

参数说明:当开启双机热备模式时,如果备机正处理归档WAL日志数据,这时进行查询就会产生冲突,此参数就是设置备机取消查询之前所等待的时间。
该参数属于SIGHUP类型参数。
须知: -1表示允许备机一直等待冲突的查询完成。
取值范围:整型,范围:-1~INT_MAX,单位为毫秒。
默认值:3s(即3000ms)

max_standby_streaming_delay

参数说明:当开启双机热备模式时,如果备机正通过流复制接收WAL日志数据,这时进行查询就会产生冲突,这个参数就是设置备机取消查询之前所等待的时间。
该参数属于SIGHUP类型参数。
须知: -1表示允许备机一直等待冲突的查询完成。
取值范围:整型(毫秒),范围:-1~INT_MAX。
默认值:3s(即3000ms)

al_receiver_status_interval

参数说明:设置WAL日志接收进程的状态通知给主机的最大时间间隔。
该参数属于SIGHUP类型参数。
取值范围:整型,范围:0 ~ INT_MAX,单位为毫秒。
默认值:5s(即5000ms)
须知:
当该参数设置为0时,表示关闭备机向主机反馈日志接收位置等信息,可能会导致主机事务提交阻塞、switchover操作失败等异常现象。正常业务场景,不建议将该参数设置为0。

hot_standby_feedback

参数说明:设置是否允许将备机上执行查询的结果反馈给主机,这可以避免查询冲突。
该参数属于SIGHUP类型参数。
取值范围:布尔型
on表示允许将备机上执行查询的最小事务号反馈给主机。
off表示不允许将备机上执行查询的最小事务号反馈给主机。
默认值:off
须知: 当该参数为on时,主机的旧版本数据的清理会受限于备机正在读的事务,即主机只允许清理小于备机反馈回来的事务所作的更改。 所以,若该参数开启时,会影响主机的性能。

wal_receiver_timeout

参数说明:设置从主机接收数据的最大等待时间。
该参数属于SIGHUP类型参数。
取值范围:整型,0 ~ INT_MAX,单位为毫秒。
默认值:6s(即6000ms)
2.6.3.7wal_receiver_connect_timeout
参数说明:设置连接主机的最大等待超时时间。
该参数属于SIGHUP类型参数。
取值范围:整型,0 ~ INT_MAX / 1000,单位为秒。
默认值:2s

wal_receiver_connect_retries

参数说明:设置连接主机的最大尝试次数。
该参数属于SIGHUP类型参数。
取值范围:整型,1~ INT_MAX。
默认值:1

wal_receiver_buffer_size

参数说明:备机与从备接收Xlog存放到内存缓冲区的大小,目前默认不支持主备从部署模式。
该参数属于POSTMASTER类型参数。
取值范围:整型,4096~1047552,单位为KB。
默认值:64MB(即65536KB)

primary_slotname

参数说明:设置备机对应主机的slot name,用于主备校验,与wal日志删除机制。
该参数属于SIGHUP类型参数。
取值范围:字符型
默认值:空字符串

max_logical_replication_workers

参数说明:订阅端apply worker线程的最大数量。
该参数属于POSTMASTER类型参数。
取值范围:整型,0~262143
默认值:4

max_sync_workers_per_subscription

参数说明:订阅端每个订阅的tablesync worker线程的最大数量。
该参数属于SIGHUP类型参数。
取值范围:整型,0~262143
默认值:2