叫啥名奕

导航

 

wal 详解 https://zhuanlan.zhihu.com/p/163245243

 

WAL如何工作?

wal类似oracle redo log

 

WAL机制实际是在这个写数据的过程中加入了对应的写WAL log的过程,步骤一样是先到Buffer,再刷新到Disk。

Change发生时:

  •  先将变更后内容记入WAL Buffer
  •  再将更新后的数据写入Data Buffer

Commit发生时:

  •  WAL Buffer刷新到Disk
  •  Data Buffer写磁盘推迟

Checkpoint发生时:

  •  将所有Data Buffer刷新到磁盘

 

 

WAL的配置参数:

  • fsync:该参数直接控制日志是否先写入磁盘。默认值是ON(先写入)。开启该值时表明,更新数据写入磁盘时系统必须等待WAL的写入完成。可以配置该参数为OFF,更新数据写入磁盘完全不用等待WAL的写入完成,没有了等待的时间,显然接下来的工作能够更早的去做,节省了时间,提高了性能。其直接隐患是无法保证在系统崩溃时最近的事务能够得到恢复,也就无法保证相关数据的真实与正确性。
  • synchronous_commit:参数表明是否等待WAL完成后才返回给用户事务的状态信息。默认值是ON,表明必须等待WAL完成后才返回事务状态信息。配置OFF值能够更快的反馈回事务状态。因参数只是控制事务的状态反馈,因此对于数据的一致性不存在风险。但事务的状态信息影响着数据库的整个状态。该参数可以灵活的配置,对于业务没有严谨要求的事务可以配置为OFF,能够为系统的性能带来不小的提升。
  • wal_sync_method:WAL写入磁盘的控制方式,默认值是fsync。可选用值:open_datasync,fdatasync,fsync_writethrough,fsync,open_sync。
  • full_page_writes:表明是否将整个page写入WAL。
  • wal_buffers:用于存放WAL数据的内存空间。系统默认值是64K,执行一个大的事务肯定受到影响,应该适当的增大该参数。类似oracle中的log buffer。该参数还受以下几个参数影响。
  • wal_writer_delay:WAL writer进程的间歇时间。默认值是200ms。准确的配置应该根据自身系统的运行状况。如果时间过长可能造成WAL buffer的内存不足;反之过小将会引起WAL的不断的写入,对磁盘的IO也是很大考验。
  • commit_delay:表示了一个已经提交的数据在WAL buffer中存放的时间,单位ms,默认值是0,不用延迟。非0值表示可能存在多个事务的WAL同时写入磁盘。如果设置为非0,表明了某个事务执行commit后不会立即写入WAL中,而仍存放在WAL buffer中,这样对于后面的事务申请WAL buffer时非常不利,尤其是提交事务较多的高峰期,可能引起WAL buffer内存不足。如果内存足够大,可以尽量延长该参数值,能够使数据集中写入这样降低了系统的IO,提高了性能。同样如果此时崩溃数据面临着丢失的危险。个人建议采用默认值,同时将WAL文件存放在IO性能好的磁盘上。
  • commit_siblings:该参数非常有意思,该参数还决定了commit_delay的有效性。系统默认值是5。表示当一个事务发出提交请求,此时数据库中正在执行的事务数量大于5,则该事务将等待一段时间(commit_delay的值),反之,该事务则直接写入WAL。

 

 

 

'archive_cleanup_command'                                                         '预写式日志 / 归档恢复'             '设置将在每个重新启动点执行的shell命令.'                                                                                
'archive_command'                                                                 '预写式日志 / 归档'                 '设置用于对WAL文件进行归档的shell命令'                                                                                
'archive_mode'                             'on'                                   '预写式日志 / 归档'                 '允许使用archive_command参数对WAL文件进行归档.'                                                                      
'archive_timeout'                          '0'                      's'           '预写式日志 / 归档'                 '如果新的文件没有在N秒内启动,那么强制切换到下一个WAL文件.'                                                                       
'checkpoint_completion_target'             '0.5'                                  '预写式日志 / Checkpoints'          '在检查点事件期间花费在将缓冲区中脏页刷新到磁盘的时间, 这个时间作为检查点间隔的百分比。'                                                          
'checkpoint_flush_after'                   '32'                     '8kB'         '预写式日志 / Checkpoints'          '页面数,在此之后以前执行的写操作会被刷写到磁盘。'                                                                              
'checkpoint_timeout'                       '300'                    's'           '预写式日志 / Checkpoints'          '设置两次自动WAL检查点事件之间需要等待的最大时间'                                                                             
'checkpoint_warning'                       '30'                     's'           '预写式日志 / Checkpoints'          '如果检查点段的填充频度超过了最大值,启用警告功能。'                                                                             
'commit_delay'                             '0'                                    '预写式日志 / 设置'                 '设置事物提交和刷新 WAL 到磁盘间的延迟时间, 单位微秒.'                                                                        
'commit_siblings'                          '5'                                    '预写式日志 / 设置'                 '在执行commit_delay前,设置最少的可同步打开事务的数量.'                                                                     
'fsync'                                    'on'                                   '预写式日志 / 设置'                 '强制和磁盘同步更新'                                                                                             
'full_page_writes'                         'on'                                   '预写式日志 / 设置'                 '在检查点事件发生后发生第一次修改数据时,把所有的页写到WAL文件中'                                                                     
'max_wal_size'                             '1024'                   'MB'          '预写式日志 / Checkpoints'          '设置触发一次检查点的WAL尺寸。'                                                                                      
'min_wal_size'                             '80'                     'MB'          '预写式日志 / Checkpoints'          '设置要把WAL收缩到的最小尺寸。'                                                                                      
'recovery_end_command'                                                            '预写式日志 / 归档恢复'             '设置将在恢复结束时执行一次的shell命令.'                                                                                
'recovery_target'                                                                 '预写式日志 / 恢复目标'             'Set to "immediate" to end recovery as soon as a consistent state is reached.'                          
'recovery_target_action'                   'pause'                                '预写式日志 / 恢复目标'             '设置到达恢复目标时要执行的操作.'                                                                                      
'recovery_target_inclusive'                'on'                                   '预写式日志 / 恢复目标'             '设置是否包括或排除具有恢复目标的事务.'                                                                                   
'recovery_target_lsn'                                                             '预写式日志 / 恢复目标'             '设置预写式日志位置的LSN,恢复将继续进行.'                                                                                
'recovery_target_name'                                                            '预写式日志 / 恢复目标'             '设置将继续进行恢复的命名还原点.'                                                                                      
'recovery_target_time'                                                            '预写式日志 / 恢复目标'             '设置恢复将要进行的时间戳.'                                                                                         
'recovery_target_timeline'                 'latest'                               '预写式日志 / 恢复目标'             'Specifies the timeline to recover into.'                                                               
'recovery_target_xid'                                                             '预写式日志 / 恢复目标'             '设置要进行恢复的事务ID.'                                                                                         
'restore_command'                                                                 '预写式日志 / 归档恢复'             '设置将检索存档的WAL文件的shell命令.'                                                                                
'synchronous_commit'                       'on'                                   '预写式日志 / 设置'                 '设置当前事物的同步级别.'                                                                                          
'wal_buffers'                              '512'                    '8kB'         '预写式日志 / 设置'                 '为 WAL 设置共享内存中磁盘页缓冲区的个数.'                                                                               
'wal_compression'                          'off'                                  '预写式日志 / 设置'                 '压缩写入WAL文件的整页写。'                                                                                        
'wal_init_zero'                            'on'                                   '预写式日志 / 设置'                 '首次使用前将零写入新的WAL文件.'                                                                                     
'wal_level'                                'replica'                              '预写式日志 / 设置'                 '设置写入WAL文件的信息的内容详细级别'                                                                                   
'wal_log_hints'                            'off'                                  '预写式日志 / 设置'                 'Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification.'
'wal_recycle'                              'on'                                   '预写式日志 / 设置'                 '通过重命名来回收WAL文件.'                                                                                        
'wal_sync_method'                          'fdatasync'                            '预写式日志 / 设置'                 '选择用于强制将WAL缓冲区的内容更新到磁盘的方法.'                                                                             
'wal_writer_delay'                         '200'                    'ms'          '预写式日志 / 设置'                 'WAL 写入器中执行 WAL 刷写之间的时间。'                                                                               
'wal_writer_flush_after'                   '128'                    '8kB'         '预写式日志 / 设置'                 '触发一次刷写的 WAL 写入器写出的 WAL 数量。'                               

 

posted on 2022-03-17 17:22  叫啥名奕  阅读(241)  评论(0)    收藏  举报