mongodb 系列 ~ journal日志畅谈

一 简介 我们来聊聊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