作者回复: 日志: 这个是一个比较通用的概念,可以包括你说的所有(journal,oplog,以及server日志)。
具体一点来说, journal日志是数据库的crash recovery手段。通常的做法是把数据库内的数据块修改,提前用文件顺序写方式刷到盘上,然后再去真正的提交数据的修改。这样的目的是在服务器宕机的时候,内存中被丢失的数据可以在恢复过程中从journal 日志文件中读回来。
Oplog也是记录的数据库的操作日志,但是记的是逻辑操作命令。主要的目的是用于节点之间复制数据,而不是上面journal主要是用来recover crash。
还有一种就是mongod.log,这个就是一个文本文件,记录数据库系统的正常运行和错误信息等等。
作者回复: j:1 表示Journal 日志刷盘,所以就是要写文件到硬盘。
正常数据只是写到内存的Cache(不是操作系统的cache,而是WiredTiger自己管理的Cache),然后异步刷盘。
作者回复: 如果你使用majority write concern的话,不一定非得需要j:true。因为即使在主节点crash场景下,这条数据也已经在另一个节点上有了。
作者回复: 默认是read uncommitted。正常情况都不会有问题,除了发生宕机的时候,这个可能会有问题 - 你读到的一条数据可能会在宕机的时候被回滚掉。这种事情概率很小,发生了可能问题也不算特别严重,很多场景可以接受。如果要求比较高,那么需要用 readConcern: majority 来提高隔离级别。
作者回复: 按照mongodb复制集选举规则,有最新数据的会第一优先被选为主节点
作者回复: 跨系统事务(XA)目前在MongoDB/ES上并无实现。Tough luck, 搜索下Saga Pattern,自己做事务补偿吧。
作者回复: 这个是需要用reconfig命令才能生效的。
作者回复: 服务器端无法配置。
你可以在Connection String上设置,这个一般是全局统一的设置。
例子:
mongodb://db0.example.com,db1.example.com,db2.example.com/?replicaSet=myRepl&w=majority&wtimeoutMS=5000
详细文档:
https://docs.mongodb.com/manual/reference/connection-string/
作者回复: 这个问题我已经提交给原厂了,暂时还没有回复。
作者回复: “写性能是standalone mongod的好几倍”
复制集比单机更快?还是更慢?
作者回复: 后者。对应于 w:N 里面N个节点的日志落盘。
作者回复: 有点绕。但是“刚刚写的那条数据是在它监听之前写入新的主节点的日志的,那么这个从节点不就丢失了这条写的数据了” 我只能说,这个从节点不会丢失。
最后一个从节点通过比较自己的oplog和新主的oplog来确定是否要同步新数据。两者的oplog肯定会差一条(新的数据),就会从新主那里复制。
作者回复: 这个就是这个课程讲的内容,你再仔细学习一边,如果觉得还是没有得到答案,可以线下联系下我 tjtang826
作者回复: 你这个是Triple Failure - 三重错误。 如果按照这种假设,极端点的话就像是3个硬盘同时坏掉,你全部写入都没用。数据还是丢了。
然后,你的描述确实有可能发生。
作者回复: 32GB只是控制数据的缓存空间大小。MongoDB服务器本身还需要内存来进行工作,如管理TCP连接,聚合、排序运算等。