关键字:
Wal、人大金仓、KingbaseES
基本概念
1、事务的四大特性(ACID):
(1)原子性(Atomicity):事务的原子性是指事务必须是一个原子的操作序列单元,事务中包含的各项操作要么全部完成,要么全部不完成。
(2)一致性(Consistency):事务的一致性是指事务前后,数据保持一致,多个事务对同一个数据读取的结果时相同的。
(3)隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。
(4)持久性(Durability):一个事务被提交后,它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
其中,原子性、持久性、隔离性都是手段,目的都是为了实现一致性。
2、WAL日志
事务日志是数据库的重要组成部分,存储了数据库系统中所有更改和操作的历史,以确保数据库不会因为故障例如突然断电或其他导致服务器崩溃的故障而丢失数据。
WAL全称writes achead log,即预写式日志,简称WAL日志。WAL日志活跃在KingbaseES的各个功能模块,绝大多数的数据库行为都会被记录在WAL日志中。WAL日志在数据库恢复、高可用、流复制、逻辑复制等KingbaseES模块中扮演着极其重要的角色。其中心思想是:先写入日志文件,再写入数据。利用WAL日志进行恢复的按方法能最大程度上恢复数据库系统未落盘数据,能明显提升数据库可用性和容错容灾能力。
WAL日志的参数介绍
重要参数说明:
- fsync:控制wal日志刷新是否开启刷新到磁盘,此参数控制wal_sync_method参数的刷新方法;
- wal_sync_method:wal日志的刷新方法;
- wal_buffer:wal缓冲区,默认为-1,大小为1/32的share_buffer;
- wal_writer_delay:表示每隔这么长时间就会刷wal日志缓冲区的数据;
- commit_delay:提交的延迟时间,如果设置此参数,则会commit后延迟一段时间再进行提交;
- max_wal_size:这个参数指定两个checkpoint检查点之间产生的WAL最大量,当WAL日志文件超过这个大小时会被自动删除;
- min_wal_size:为将来使用而回收的WAL文件的数量设置了一个最小值;
- checkpoint_timeout:自动WAL检查点之间的最长时间,以秒为单位;
- checkpoint_completion_target:默认值为0.5,表示在下一个检查点启动之前的大约一半时间内完成检查点,也就是说每个checkpoint需要在checkpoint间隔时间的50%内完成。
3.WAL日志工作原理
预写式日志(Write-Ahead Logging(WAL))是保证数据完整性、实现事务日志的一种标准方法。预写式日志在实现上的关键点就是先写日志,再写数据,在写 数据的过程中加入了写对应的WAL log的过程,先写Buffer再刷新到Disk。
- 当需要更新数据时,先将变更后的内容写入WAL Buffer、再将更新后的数据写入Data Buffer。
- 当提交变更时(commit),会将WAL Buffer刷新到Disk,Data Buffer写磁盘会推迟。
- 当checkpoint时,会将Data Buffer刷新到Disk。
全页写
- 块不一致造成原因
(1)操作系统进行I/O操作时,总是以块为单位,比如1KB等。
(2)数据库块一般是操作系统块的整数倍,比如2k、4k、8k
(3)块是数据库最小的I/O单位,当数据库写一个数据块时,操作系统需要I/O多次,可能在I/O过程中系统断电、磁盘故障等原因导致一个数据块没有完整的写入,导致块不一致。
- 全页写
(1)全页写:把数据块写到WAL日志中
(2)目的:全页写可以解决块不一致问题,保护数据的完整性
(3)缺点:全页写会导致WAL日志膨胀,增加额外I/O
启用全页写的崩溃恢复