• dream
    2019-12-23
    老师,请问一下:日志、journal、oplog 这三个有什么联系与区别呢?感觉这三者的概念很混淆。

    作者回复: 日志: 这个是一个比较通用的概念,可以包括你说的所有(journal,oplog,以及server日志)。

    具体一点来说, journal日志是数据库的crash recovery手段。通常的做法是把数据库内的数据块修改,提前用文件顺序写方式刷到盘上,然后再去真正的提交数据的修改。这样的目的是在服务器宕机的时候,内存中被丢失的数据可以在恢复过程中从journal 日志文件中读回来。

    Oplog也是记录的数据库的操作日志,但是记的是逻辑操作命令。主要的目的是用于节点之间复制数据,而不是上面journal主要是用来recover crash。

    还有一种就是mongod.log,这个就是一个文本文件,记录数据库系统的正常运行和错误信息等等。

     1
     3
  • 一步
    2019-12-25
    Mongo 落盘的时候,有用到文件系统的 Page Cache 机制吗?
    当有一条数据更新的时候是先写到内存,然后是Page Cache 最后是 硬盘吗?

    j 这个参数是代表写到 Page Cache 还是硬盘呢?

    作者回复: j:1 表示Journal 日志刷盘,所以就是要写文件到硬盘。

    正常数据只是写到内存的Cache(不是操作系统的cache,而是WiredTiger自己管理的Cache),然后异步刷盘。

    
     1
  • 长期规划
    2019-12-18
    老师,j参数一般要设置为true吗

    作者回复: 如果你使用majority write concern的话,不一定非得需要j:true。因为即使在主节点crash场景下,这条数据也已经在另一个节点上有了。

     2
     1
  • cording
    2020-02-10
    老师,你好,mongodb有分布式锁吗?如果有如何实现生成全局唯一ID呢?
    
    
  • 李英权
    2020-01-19
    老师,mongodb事务的默认隔离级别是什么?听说是相当于read uncommitted,这样似乎存在问题啊

    作者回复: 默认是read uncommitted。正常情况都不会有问题,除了发生宕机的时候,这个可能会有问题 - 你读到的一条数据可能会在宕机的时候被回滚掉。这种事情概率很小,发生了可能问题也不算特别严重,很多场景可以接受。如果要求比较高,那么需要用 readConcern: majority 来提高隔离级别。

    
    
  • 默
    2020-01-18
    怎么就确定重新启动的主节点是同步x=1的节点呢.也可能是还没同步x=1节点.

    作者回复: 按照mongodb复制集选举规则,有最新数据的会第一优先被选为主节点

    
    
  • yihang
    2020-01-06
    1.6 day01 mongodb高手课
    学习了 writeconcern 用法
    它的作用是描述写入操作的数据可靠性的保证,是一致性和性能的一个权衡选项
    例如
    insert(数据,{writeConcern:{w:值,j:值,timeout:值}})
    * w 默认为1,如果是majority表示必须传播至集群超半数节点才返回,如果是n表示要传播到集群的n个节点才返回
    * j 为 true 表示需要写入到 journal 日志才返回,journal 有点像 mysql 的 redo log,提供了crash 恢复功能
    * wtimeout 指定了传播超时时间
    展开
    
    
  • dream
    2020-01-01
    老师,请问个问题呀,一条数据在某个特定的业务场景,我需要把它写入 es 与 mongo(先写入mongo,然后在写入es),写入mongo是ok的,但是由于某些原因写入es失败。
    这个时候我需要回滚 mongo 里面的数据,怎么处理呢?

    作者回复: 跨系统事务(XA)目前在MongoDB/ES上并无实现。Tough luck, 搜索下Saga Pattern,自己做事务补偿吧。

    
    
  • Allen
    2019-12-30
    老师,我发现配置好了后,需要调用一下rs.reconfig()命令才能生效,这个和mongodb的版本有关系吗?

    作者回复: 这个是需要用reconfig命令才能生效的。

    
    
  • 撑伞也是雨中人。
    2019-12-28
    老师 mongo是否可以在服务器端配置 majority write concern ,跟 j : true ? 如果在sql层面每条语句加 w:majority , j : true 有点麻烦,开发也不一定按照规范来操作。 如果可以在服务器直接配置,该如何配置

    作者回复: 服务器端无法配置。
    你可以在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/


    
    
  • Casper
    2019-12-26
    老师您好,我在演练的时候发现(使用mongodb的cli工具),当集群为3个的时候,将writeConcern的w设置为4时, 数据任然可以插入成功,但是cli有错误信息返回。这个和预想的情况不同。如果我想让这种情况也无法插入数据应该如何设置呢?

    作者回复: 这个问题我已经提交给原厂了,暂时还没有回复。

    
    
  • Julien
    2019-12-26
    老师您好,我们在使用 1 primary + 2 secondaries, writeConcern:majority, j:1 的情况下,写性能是standalone mongod的好几倍,请问这个现象是正常的吗?理论上来说,客户端代码一样的情况下,即使数据需要拷贝到secondary,也不过是standalone的两倍时间。希望老师指教一下~

    作者回复: “写性能是standalone mongod的好几倍”
    复制集比单机更快?还是更慢?

     1
    
  • dream
    2019-12-21
    老师,请问一下 j:true 是保证主节点的日志写入成功,还是保证writeConcern配置的参数对应的节点的日志写入成功才返回呢?

    作者回复: 后者。对应于 w:N 里面N个节点的日志落盘。

    
    
  • dream
    2019-12-21
    老师请问一下,就是一主二从的模式,writeConcern 为 majority,刚好写入一条数据时主节点宕机,此时两个从节点一个有数据,一个没有这条数据,有数据的一个作为主节点。此时,没有数据的一个还是从节点,它的同步是去监听新的主节点的日志变化,但是刚刚写的那条数据是在它监听之前写入新的主节点的日志的,那么这个从节点不就丢失了这条写的数据了吗?mongodb还有其他什么机制保证吗?

    作者回复: 有点绕。但是“刚刚写的那条数据是在它监听之前写入新的主节点的日志的,那么这个从节点不就丢失了这条写的数据了” 我只能说,这个从节点不会丢失。

    最后一个从节点通过比较自己的oplog和新主的oplog来确定是否要同步新数据。两者的oplog肯定会差一条(新的数据),就会从新主那里复制。


    
    
  • dream
    2019-12-21
    请问mongodb不管主节点,还是从节点,只要需要写入的数据写入到了内存中,就会响应给客户端写入成功吗?

    mongodb 主节点接收到写操作后,主节点的写入过程是什么样的呢?先写入内存,在写入rollback文件,在写入日志(此时从节点监听到主节点日志发生变化,同步变化到从节点进行相同的流程),在写入磁盘。是这样的吗?

    作者回复: 这个就是这个课程讲的内容,你再仔细学习一边,如果觉得还是没有得到答案,可以线下联系下我 tjtang826

    
    
  • 长期规划
    2019-12-20
    老师,w=majority时,写入成功会数据一定不会丢吧?比如副本集有5个节点,某一次更新录录记为r,更新成功。主和另一从节点宕机,剩下A,B,C三个节点,且满足
    1. A与B,C能通信,但B和C之间无法通信
    2. A比B和C有更高优先级
    3. A的opIog比B和C旧,少一个修改记录r
    这种情况下,A是不是有可能成为主节点呢?如果是,B和C同步A的数据后,会回滚那个记录r吧?数据不就丢了吗

    作者回复: 你这个是Triple Failure - 三重错误。 如果按照这种假设,极端点的话就像是3个硬盘同时坏掉,你全部写入都没用。数据还是丢了。

    然后,你的描述确实有可能发生。

     1
    
  • Geek_b0e6d2
    2019-12-19
    writeConcern增加了写操作延时,应该一定会增加集群压力吧?毕竟延时期间,占用着资源,处理能力会下降,吞吐量也会下降,延迟太大最终成功率也会掉
    
    
  • walker
    2019-12-18
    请问怎样限制 MongoDB 使用的总内存大小?
    将 mongod.cfg 中 storage.wiredTiger.engineConfig.cacheSizeGB 设置为 32 之后,在任务管理器中发现,MongoDB Server 占用的内存还是达到了 45 GB,相关配置如下:
    ```
    storage:
      dbPath: E:\MongoDB\Server\4.2\data
      journal:
        enabled: true
      engine: wiredTiger
      wiredTiger:
        engineConfig:
             cacheSizeGB: 32
    ```
    系统版本: Windows Server 2012 R2
    MondoDB 版本: 4.2.1
    展开

    作者回复: 32GB只是控制数据的缓存空间大小。MongoDB服务器本身还需要内存来进行工作,如管理TCP连接,聚合、排序运算等。

     1
    
我们在线,来聊聊吧