今天搭建流复制,想起了一个一直以来没搞清楚的问题,fsync这个参数的含义。
首先说一下我自己个人的理解:fsync这个参数用来控制将操作系统缓存写入磁盘。(而不是数据库缓存)
举一个例子,在同步流复制中,如果参数 synchronous_commit=on,fsync=off ,在主库insert一条数据的时候,数据必须要落盘之后才能返回ok,这个时候就算fsync=off,操作系统依然会将缓存数据刷入磁盘。
第二个例子,在异步流复制中,如果参数synchronous_commit=off , fsync=on , 在主库insert一条数据后,数据写入到wal缓存就返回ok了,然后当数据库将wal缓存写入操作系统缓存时,操作系统缓存会直接将wal日志写入磁盘,而不会做对应的缓存。
不知道我上面的2个例子的理解是否正确?
你看看代码会更清楚,其实fsync是控制持久化调用的选择开关。
例如checkpoint, wal fsync都会涉及到持久化。
当 fsync=off时,处理逻辑会不一样(基本上是跳过持久化的系统调用),即不确保已持久化。
你可以去搜一下这个值:
enableFsync
看看就知道了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。