一 简介 我们来聊聊Journal日志
二 核心观点 WAL 日志先行策略
三 开启journal流程
在开启journal的系统中,写操作从请求到写入磁盘共经历5个步骤,在serverStatus()中已经列出各个步骤消耗的时间。
1 Write to privateView
2 prepLogBuffer
3 WritetoJournal
4 WritetoDataFile
5 RemaptoPrivateView
四 基本概念知识
1 shared view
数据文件映射到一块内存区域,称为shared view,数据会直接写入(在不开启journal的情况下) 系统每60s刷新这块内存到磁盘.如果系统断电,就会丢失这60S的未持久化的数据
2 private view
系统会再映射一块内存区域供journal使用,称之为private view,mongodb默认每100ms刷新privateView到journal(在开启journal情况下) 如果系统断电.会容忍这100ms的数据丢失,当服务重启时,会利用journal进行恢复
3 mongo的journal和mysql的redo效果一样,日志先行.但是有一点不同的是,mongo的journal的功能是可以关闭的
五 系统相关
1 当单个文件达到1GB的时候,就会创建一个新的文件,旧文件不会循环使用,自动删除
2 文件构成
1 lsn代表最后使用的journal序列号
2 prealloc 代表已经分配但是还没有使用的文件
3 j.*代表的是正在使用的journal文件
六 系统命令
1 journal延迟测试的函数,
db.runCommand("journalLatencyTest"):
2 启动
journal = true
3 查看journal运行状态
db.serverstatus() dur相关,具体请自行查看
commitsInWriteLock:在有写锁的情况下提交的数量,这表示写的压力很大
earlyCommits:表示在journalCommitInterval之前的时间,mongod请求提交的次数。用这个参数确定journalCommitInterval是不是设置的过长。
4 journalCommitInterval
默认100ms,根据上述的监控指标可以进行结合判断是否要进行调整。
七 相关问题
1 journal本身占据过大的问题
推断 可能是由于大批量瞬间事务引起的
原文地址:https://www.cnblogs.com/danhuangpai/p/11022789.html