一、参数说明
1. synchronous_commit
含义:表示当前事务的同步方式。
通常情况下,一个事务产生的日志的同步顺序如下:
- 主机将日志内容写入本地内存。
- 主机将本地内存中的日志写入本地文件系统。
- 主机将本地文件系统中的日志内容刷盘。
- 主机将日志内容发送给备机。
- 备机接受到日志内容,存入备机内存。
- 备机将备机内存中的日志写入备机文件系统。
- 备机将备机文件系统中的日志内容刷盘。
- 备机回放日志,完成对数据文件的增量更新。
而 synchronous_commit 的取值影响着主机提交以及主备机间同步提交的方式,具体如下:
- on
表示主机事务提交需要等待备机将对应日志刷新到磁盘。当为on且开启了同步备库的时候(设置了synchronous_standby_names),必须要等事务日志刷新到本地磁盘,并且还要等远程备库也提交到磁盘才能返回客户端已经提交。
- off
表示主机事务提交无需等待主机自身将对应日志刷新到磁盘,通常也称为异步提交。
- local
表示主机事务提交需要等待主机自身将对应日志刷新到磁盘,通常也称为本地提交,此时不关心备机的情况。
- remote_write
表示主机事务提交需要等待备机将对应日志写到文件系统(无需刷新到磁盘)。
- remote_receive
表示主机事务提交需要等待备机接收到对应日志数据(无需写入文件系统)。
- remote_apply
表示主机事务提交需要等待备机完成对应日志的回放操作。
2. synchronous_standby_names
含义:用来指定同步备机的列表,存放的是需要设置为同步备机的备机名称表示同步复制的备机名称列表,每个名称用逗号分隔。
支持以下几种方式进行配置:
- 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,…) 具有的含义相同。
3. 参数总结
简单理解,第一个参数 synchronous_commit 控制的是事务提交的时候要不要等备机进行同步提交,以及如何等(或要等到wal落到哪个层级),第二个参数 synchronous_standby_names 则是控制哪些节点可以成为同步备机。