首页 > 数据库 >MongoDB 会丢数据吗? 在次补刀MongoDB 双机热备,以及如何删除Journal log【转】

MongoDB 会丢数据吗? 在次补刀MongoDB 双机热备,以及如何删除Journal log【转】

时间:2025-01-14 13:43:06浏览次数:1  
标签:热备 log 双机 MongoDB Journal 数据

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 (共1220人左右 1 + 2 + 3 +4)新人会进入3群 

以后会争取每天一段感悟,不讨论对错,幼儿园的孩子才每件事论对错

最强大的,这个词不一定是个好词,最强大的往往是最虚弱的,那些天天和你谈格局,谈奉献,谈爱,强大的人,很可能内心和垃圾堆里面的碎玻璃一样,闪闪发光。如何和这样的人交往呢,一定要把自己碎的更厉害,发出耀眼的光,此刻他就不和你谈格局了

上期中提到了关于MongoDB 双机热备那篇文章是毒 !本期继续补刀,不把这样害死人的思维模式捅死,我是不会罢休的。

在使用多年MongoDB 后,是否问过一个问题,MongoDB 是否会丢数据,回答是不会。为什么?

在MongoDB的使用中,除了我们熟知了 Oplogs 来进行数据的复制同步到其他的节点,同时MongoDB也提供大部分传统数据库都提供的WAL 日志,--- Journaling ,在早期的版本 4.0 前你还可以关闭Journal log 

storage.journal.enaled: false

但在4.0后的MongoDB 你不能在关闭Journal log, 这样的情况下很多人认为MongoDB 不会丢失数据,实际上不是的,这里我们全部默认MongoDB 的数据引擎为wiredTiger 并且checkpoint的工作是正常的,在这样的情况下, MongoDB 有了Journal log 有了checkpoint 的工作机制,这里看似MongoDB 应该不会丢数据,但是我们需要注意的是,看下图

图片

在 MongoDB 中,如果是单机的模式下,从逻辑的角度来说,会丢数据按照数据库秒的默认设置,100ms 刷新Journal log ,则按照上图,会有可能最大丢失 100ms 内在MongoDB 中操作的数据。

怎么结果是丢数据,MongoDB 会丢数据,估计那些对于这个在DBEGINE 排名第四的数据库还是唯一的NOSQL数据库要各种 “踩” 了。

图片

1  没有人告诉你MongoDB 的生产部署模式是单机, 那篇官方文档提到过,建议你部署MongoDB是单机模式。

2  有没有人告诉你,Mongodb 基本的部署模式 replica set 复制集默认的写是 w: majority 

Majority 的含义为写大多数,也就是默认复制集合的节点最少为3 ,在这样的情况下,大多数为至少每次写入数据落盘2个节点。

 

图片

好,那么在这样的操作下,MongoDB 有了Journal log , 有了Oplogs 支持下的 Replica 和 事务的大多数写作数的情况下,此时的MongoDB 的数据是安全的,在这样的情况下,我们认为操作 MongoDB 事务的情况下,数据是不会丢失的。

以下面的语句,这里插入了一条数据并且明确的标定,我们写入的情况下返回成功的前提是,节点中的大多数回馈,数据写入后,反馈事务提交成功。

db.data.insertOne(
   { name: "Simon", age : 30, level: "C" },
   { writeConcern: { w: "majority" , wtimeout: 5000 } }
)

在这样的情况下MongoDB 的数据写入是安全的,可以信赖的。

此时我们回到题目中的问题,如果你的MongoDB 是通过复制集中的协议但是你只搭建了2个节点,那么根据上述的MongoDB 数据安全和数据不丢失的理论就无从实现了,因为2个节点是不存在大多数这个概念的,在这样的情况下,我们无法从逻辑上保证数据是安全不丢失的。2节点破坏了MongoDB 的基本原理,包含Arbiter 的方式部署,这样的方式也在MongoDB 不在被推荐和建议。

所以每个数据库本身都有自己的理论和实现,并保证通过自己的理论来完成数据库不丢失数据的诺言。

所以MongoDB 双机热备就是一个伪命题,一个到处展现对于MongoDB无知的状态。

另关于MongoDB 如何清理  journal log 的问题,这里做一个回答,网络关于如果清理journal log 的部分,各种回答都有,这里注意

1  现在MongoDB 4.x 后都是WiredTiger 的数据引擎,这样的情况下不存在修改smallfile 的清理 journal log 的方案。

2  现有的Journal log 是产生100MB 大小的文件,并且在数据库做了checkpoint 的操作后,会自动删除废弃的 journal log 

3  如果需要手动删除journal log  则可以采用如下的方式进行手动删除

1 在需要删除Journal log 的MongoDB 服务器运行 

db.fsyncLock()

2  进入到Journal log 的日志目录,rm 相关文件

图片

 

3  在MongoDB 中执行

db.fsyncUnlock()

以上的工作原理为,db.fsyncLock() 主要是将数据脏页全部刷新到磁盘,并停止数据的再次刷新的工作,此时就是一个人工的checkpoint点,此时可以将jounral log 进行清理。然后必须解除不能数据刷新的锁定。

最后,不懂MongoDB 基本原理,然后提出MongoDB双机热备的 T DBA 们,你们呀 ?  GET OUT

转自

MongoDB 会丢数据吗? 在次补刀MongoDB 双机热备
https://mp.weixin.qq.com/s?__biz=Mzg4NDA0NTEwNA==&mid=2247498946&idx=1&sn=38127b0be4e1cf5917e2a966d36d6d8e&chksm=cfbc989df8cb118bf1dada3efef0d86e8dd4828a85a2f8775ab043768a04e7abfb12dd167941&scene=21#wechat_redirect

标签:热备,log,双机,MongoDB,Journal,数据
From: https://www.cnblogs.com/paul8339/p/18670611

相关文章

  • 使用 MongoDB 和 OpenAI 实现 RAG 的实战指南
    在本篇文章中,我们将深入探讨如何使用MongoDB和OpenAI实现检索增强生成(RAG,Retrieve-AugmentedGeneration)。通过结合数据库的高效检索能力和语言模型的生成能力,可以创建出功能强大的应用。接下来,我们将详细介绍如何搭建这样的系统,并提供可运行的代码示例。技术背景介绍......
  • 蓝易云 - Mongodb三种日志的区别
    Mongodb有三种主要的日志类型,它们分别是:WiredTiger日志、Mongod日志和系统日志。WiredTiger日志:描述:WiredTiger是MongoDB的默认存储引擎,它使用了多种类型的日志来保证数据的持久性和一致性。包括:WiredTiger日志包括预写日志(Write-AheadLogging,WAL)和事务日志(TransactionLog......
  • mongodb windows zip安装并服务自启动
    1.下载并解压。2.新建文件/文件夹data/db目录logs/mongod.log文件conf/mongod.conf文件3.编辑conf/mongod.conf文件systemLog:destination:filelogAppend:truepath:F:/mongodb-win32-x86_64-windows-6.0.20-rc3/logs/mongod.logstorage:dbPath:F:/m......
  • Node.js导入MongoDB具体操作指南
    在Node.js应用程序中,导入MongoDB是一项常见任务。本文将详细介绍如何在Node.js中连接和操作MongoDB数据库,包括安装必要的包、配置连接、执行基本的CRUD操作等步骤。1.安装必要的包首先,确保你已经安装了Node.js和npm。然后,通过npm安装MongoDB的Node.js驱动程序。npminstallmo......
  • MongoDB的索引和查询分析(explain)
    •创建普通索引,使用命令db.collection.createIndex({key:1})•创建唯一索引,使用命令db.collection.createIndex({key:1},{unique:true})a.语法中Key值为你要创建的索引字段,b.1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。• createIndex()接收可选参数,可......
  • Mongodb日常操作命令
    查看数据库状态:db.stats()查看集合状态:db.collection_name.stats()查看索引使用情况:db.collection_name.getIndexes()重新生成集合的索引:db.collection_name.reIndex()查看查询执行计划:db.collection_name.find({...}).explain()查看库大小:db.stats();查看集合大小:db.js_user.st......
  • MongoDB的部署和操作
    注:本博文展示部署哥操作步骤和命令,具体报告及运行截图可通过上方免费资源绑定下载一.数据库的部署与配置1.单MongoDB服务器的部署(1)将服务器、客户端和工具安装包上传到hadoop1的/export/software目录(2)使用解压缩命令:·tar-xzf/export/software/mongodb-linux-x86_64-rhel......
  • MongoDB集群中数据分布与分片
    MongoDB集群中数据分布Chunk是什么在一个shardserver内部,MongoDB还是会把数据分为chunks,每个chunk代表这个shardserver内部一部分数据。chunk的产生,会有以下两个用途:Splitting:当一个chunk的大小超过配置中的chunksize时,MongoDB的后台进程会把这个chunk切分成更小的chunk,从......
  • Windows单机安装MongoDB分片集群
    Windows单机部署MongoDB分片集群规划和准备端口规划操作系统:WindowsServer2012MongoDB版本:4.2.25IP/节点名mongosconfigshard1shard2shard3127.0.0.1(mongo1)mongos1(27017)config1(27018)主(27001)主(27002)主(27003)127.0.0.1(mongo2)mongos2(27027)c......
  • OpenEuler安装MongoDB并配置访问密码.241127
    1.下载MongoDB、安装wgethttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-4.4.18.tgztarzxvfmongodb-linux-x86_64-rhel80-4.4.18.tgz移动到/home路径下mvmongodb-linux-x86_64-rhel80-4.4.18/homecd/homemvmongodb-linux-x86_64-rhel80-4.4.1......