FAQ : 关于 synchronous_commit 参数使用
GBase社区管理员一、参数说明
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 则是控制哪些节点可以成为同步备机。
二、GBase 8c中的同步机制实现
在GBase 8c中,控制“主备间事务同步提交规则”是由高可用组件自动进行维护的,在实际使用当中,非特殊应急场景(如所有备机宕掉或挂起)用户无需调整 synchronous_commit、synchronous_standby_names 参数。
在当前版本中,GBase 8c高可用组件管理“主备间事务同步提交”,按以下规则进行管理:
- 对于CN节点
CN没有备机,都是服务对等的节点,所以需要设置为 synchronous_commit=off,--不要进行修改,异常情况下可能引发节点无法正常启动问题。
- 对于DN节点
- 备机2台或以上,高可用管理机制会自动 synchronous_commit 设置为 ON,确保备机能同步到数据,保证数据同步提交。而当前的同步列表,即 synchronous_standby_names 配置为 ANY <半数备机>,以保证数据安全与性能之间的均衡。同时,在近期版本,将调整为 FIRST <半数备机> 的配置,即以优先级的策略保证节点的同步。
- 备机只有1台,即一主一备的场景下,synchronous_commit默认取值为off,synchronous_standby_names 默认取值为"*"。
环境部署的为一主一备,在当前版本(B48)发生备机发生异常时,如果synchronous_commit配置成on,则主节点有可能会发生类似的等待事件,影响服务,因此高可用会自动设置为off,非特殊情况不要进行修改。并且生产环境建议部署为1主2备或以上的模式。
针对此问题,GBase 8c 的高可用管理机制也在不断进行优化,未来版本会增加同步提交“降级”机制(版本待确定),最大限度保证服务的连续性。
三、读写分离
问题:高可用同步管理机制下,读写分离场景如何保证数据一致性?
解答:读写分离机制,可以通过修改配置文件的方式将CN节点配置为只读节点,由该 CN 节点将请求发送至已进行同步的备DN节点上,无备选DN可用时则使用主DN节点,以保证读写事务的一致性。
(注意:未来 synchronous_standby_names 调整为 FIRST <半数备机> 后,只读CN节点也可以按此优先级机制选取高优先级的同步备DN节点)
热门帖子
- 12025-12-01浏览数:182763
- 22023-05-09浏览数:25059
- 42023-09-25浏览数:18525
- 52020-05-11浏览数:17529