目录
mongDB
read
write
ES
read
write
MySql
write
总结
mongDB
3.0 版本后的WiredTiger存储引擎
read
1. 应用通过driver 发起Buffer I/O读操作,由操作系统将磁盘数据页加载到文件系统的页缓存区
2. 引擎层读取页缓冲区的数据,进行解压后放到内部缓存区
3. 在内存中完成匹配查询,将结果返合给应用
tip: MongoDB默认的内部缓存大小达到了机器内存的一半; 由wireTigerCacheSize参数指定
write
1. 应用通过driver 发起写入操作
2.数据库从内部缓存获取当前记录所在的页快,如果不存在则会从磁盘中加载
3.WiredTiger 开始写事物,修改数据写入页快的更新表,
4. 同时写Journal 日志(ReDo Log),默认100ms 写入磁盘;用于弥补CheckPoint的不足
5. 数据库默认每隔60s 执行CheckPoint ,将内存中数据写入到磁盘中
ES
read
1. clinet 发动请求到 coordinate node
2. coordinate node 请发转到 shard 对应的主节点或者备份节点
3. 每个shard 节点将自己的搜索结果返合给coordinate node ,由协调节点进行数据的合并、排序、分页等操作产出最终的结果
write
a.Lucene 中,单个倒排索引⽂文件被称为 Segment。Segment 是⾃自包含的,不不可变更更的。 多个 Segments 汇总在⼀一起,称为 Lucene 的 Index,其对应的就是 ES 中的 Shard
b.乐观锁,删除用.del标记,然后过滤;
c.写index buffer(闪存)+ 写Transaction Log (磁盘)
d.Refresh : index buffer 1秒一次写入 segment ,可以被搜索到;估进称为进实时搜索
e. merage
MySql
write
mySql 分server层和存储层,这里的存储层默认指nnoDB; 先写存储层,在写server层binlog
1. InnoDB将要更新的数据所在的整页数据更到到缓存(Buffer pool 一半为机器内侧60%)中
2. InnoDB写入undo 日志便于回滚
3. InnoDB更新Buffer pool 内存中的数据,开放查询
4. InnoDB写redo log buffer
5. InnoDB commit 提交时 redo 日志写入磁盘
6. Server层写binlog文件
7. commit 标识写入redo 日志与binlog 保持一致
8. buffer pool 中的数据写入磁盘
总结:
总结MySql, ElasticSearch,MongoDB三种现代数据的写操作,不难发现,实现机制大同小异: 先写buffer + Transaction Log; 同时满足一定的条件时,再写入到磁盘中;进而提升写入效率;