当前位置: 首页 > news >正文

MongoDB快照(LVM)业务场景应用实战

MongoDB和LVM快照概述

MongoDB的重要性:MongoDB支持的灵活的文档模型,使其成为处理大量分散数据的理想选择,特别是在需要快速迭代和频繁更改数据结构的应用中。

LVM(逻辑卷管理)快照技术基本概念:LVM允许在不停止数据库服务的情况下,创建数据在某一时间点的快照。这意味着可以在不影响数据库性能和用户体验的情况下进行备份。

应用方面

1、备份(恢复)的重要性:

备份MongoDB数据对于确保数据安全和业务连续性至关重要。无论是因为硬件故障、软件故障、还是人为错误,数据丢失的后果都可能是灾难性的。定期备份可以最小化这些风险,确保在出现问题时可以快速恢复。

2、测试和开发环境的创建

在测试和开发过程中,需要创建一个与生产环境相同的数据库副本。通过使用快照,可以在测试和开发环境中快速创建一个具有相同数据和结构的数据库副本,以便进行有效的测试和开发工作。

3、数据分析和报告生成

某些情况下,需要对数据库进行离线分析和报告生成。通过使用快照,在不影响生产环境的情况下,可以在备份中创建一个副本,用于数据分析和报告生成,而不会对生产环境的性能产生负面影响。

LVM快照的优势

使用LVM快照作为MongoDB备份策略的优点包括:

  • 快速备份:能够迅速捕捉到数据的瞬时状态,减少备份时间。
  • 最小化停机时间:备份过程中不需要停止服务,这对于需要24/7运行的业务至关重要。
  • 有效地恢复数据:可以精确到备份时的状态恢复数据,提高恢复效率。

环境准备

进行MongoDB备份前的环境准备包括:

  • 确保已安装LVM并正确配置存储。
sudo yum install lvm2首先,识别可用的磁盘或分区(例如,/dev/sdb)并创建物理卷:
sudo pvcreate /dev/sdb
展示效果:该命令应返回“Physical volume "/dev/sdb" successfully created”的信息。接着,创建一个卷组,加入刚创建的物理卷:sudo vgcreate vg0 /dev/sdb
展示效果:返回“Volume group "vg0" successfully created”表明卷组创建成功。步骤三:创建逻辑卷最后,在卷组内创建逻辑卷用于MongoDB数据存储:sudo lvcreate -L 10G -n mongo_data vg0
展示效果:应返回“Logical volume "mongo_data" created”的消息。
  • MongoDB数据库运行在支持LVM的存储卷上。
配置MongoDB以使用逻辑卷修改MongoDB的配置文件(通常为/etc/mongod.conf),指定数据存储路径到刚创建的逻辑卷上的某个目录:storage:dbPath: "/mnt/mongo_data"然后,将MongoDB数据目录移动到新的位置,并修改目录权限:sudo mkdir /mnt/mongo_data
sudo mount /dev/vg0/mongo_data /mnt/mongo_data
sudo rsync -av /var/lib/mongo/ /mnt/mongo_data
sudo chown -R mongodb:mongodb /mnt/mongo_data
  • 验证系统的性能和存储空间,确保快照操作不会导致性能瓶颈或空间耗尽。
htop
htop将显示CPU和内存的实时使用情况,用户需要确保在创建快照期间,这些资源的使用不会达到饱和

步骤详解

  1. 确认MongoDB数据库的存储卷

首先,使用lvdisplay命令来查找MongoDB数据存储在哪个逻辑卷上:

lvdisplay

这个命令会列出系统中所有的逻辑卷。你需要找到与MongoDB数据相关联的逻辑卷信息,比如卷名(Volume Name)、卷组名(VG Name)等。

  1. 创建快照卷

**注意:在执行的时候需要关闭数据库,以防止有数据继续写入(**​systemctl stop mongod

接着,根据确认的MongoDB数据卷,使用lvcreate命令创建一个新的快照卷。例如,如果MongoDB数据存储在名为mongo_data的逻辑卷上,位于卷组vg0中,可以执行:

sudo lvcreate --size 1G --snapshot --name mongo_backup /dev/vg0/mongo_data

这个命令创建了一个名为mongo_backup的快照卷,大小为1GB。

  1. 挂载快照卷并备份

创建快照卷后,需要将其挂载到系统的一个目录上,以便访问和备份数据。首先,创建一个挂载点,然后挂载快照卷:

sudo mkdir /mnt/mongo_backup
sudo mount /dev/vg0/mongo_backup /mnt/mongo_backup

挂载完成后,使用标准备份工具(如tarrsync)备份数据。例如,使用tar创建一个压缩的备份文件:

sudo tar czf /path/to/backup/mongo_backup.tar.gz /mnt/mongo_backup
  1. 卸载快照卷并删除

备份完成后,不要忘记卸载快照卷并删除它,以释放空间:

sudo umount /mnt/mongo_backup
sudo lvremove /dev/vg0/mongo_backup

在删除快照卷时,系统会询问你是否确定删除,输入y确认。

快照恢复流程

  1. 准备恢复环境

在恢复数据之前,确保目标位置有足够的空间接收从快照中恢复的数据。可以使用df -h命令检查磁盘空间,并根据需要清理或添加存储空间。

  1. 使用快照数据恢复

在进行数据恢复之前,确保MongoDB服务已停止,以避免数据恢复过程中的冲突。使用以下命令停止MongoDB服务:

sudo systemctl stop mongod

然后,将快照数据恢复到MongoDB的数据目录中。首先,确认快照挂载点和MongoDB的数据目录路径。假设快照挂载在/mnt/mongo_backup,MongoDB数据目录为/var/lib/mongo,可以使用rsync进行数据恢复:

sudo rsync -av /mnt/mongo_backup/ /var/lib/mongo/

确保使用结束斜杠/来指示同步目录内容而非目录本身。

  1. 启动MongoDB服务

数据恢复完成后,重启MongoDB服务,并验证数据的一致性和完整性:

sudo systemctl start mongod

重启服务后,检查MongoDB的日志文件,确保没有启动错误,并进行必要的数据一致性检查。使用MongoDB客户端或应用程序验证数据完整性和访问性。

MongoDB,作为一个高性能、开源、无模式的文档数据库,因其高可伸缩性和灵活性而受到广泛欢迎。然而,正如任何技术专家所知,无论数据库的强大与否,数据备份和恢复计划的重要性都不可忽视。本文将探讨如何利用逻辑卷管理(LVM)快照技术来备份MongoDB数据库,确保数据的安全和业务的连续性。

业务实战

(数据分析和报告生成:某些情况下,需要对数据库进行离线分析和报告生成。通过使用快照,在不影响生产环境的情况下,可以在备份中创建一个副本,用于数据分析和报告生成,而不会对生产环境的性能产生负面影响)。

财务报表的准确性对于公司的及时决策至关重要。当前,报表直接在业务数据库上运行,不仅耗时长,而且在月初出报时常常失败,这对财务部门和公司决策产生了影响。随着公司业务规模的持续增长,现有的报表运行方式已不再适用。

我们的业务数据每日凌晨从多个业务数据库同步到数据仓库中。数据同步的耗时长意味着,同步完成时的数据已不再是某一时刻的精准快照(因为业务数据库在不断更新)。

需求:我们需要一个能将数据从MongoDB业务数据库精准同步到阿里云MaxCompute数据仓库的简单且可靠方案。简单性至关重要,因为它能提高系统的可靠性。理想的解决方案中应避免使用复杂的自编脚本来处理主从同步的细节,例如确定binlog的位置或时间点等技术栈,而是应尽可能使用封装良好的技术解决方案。数据的精确性非常关键,任何错误都可能导致不可逆的后果。

思路:利用操作系统提供的LVM快照技术,可以在某一时刻将基于MongoDB的业务数据库数据精准同步到另一个MongoDB数据库中。这样,MaxCompute就可以从后者获取数据,进行同步任务。

实践:以核心系统的MongoDB数据库为例,我们将展示如何将数据精准同步到数据仓库中,从而为财务报表的生成提供可靠的数据基础。
在这里插入图片描述

实践步骤

1. 准备工作

首先,确保已经在服务器上安装并配置了MongoDB,并且有足够的磁盘空间用于创建快照。

2. 自动化脚本

为了实现这一过程的自动化,我们编写了一个MongoDB脚本和一个Shell脚本。MongoDB脚本用于锁定数据库,触发快照的创建,然后解锁数据库。Shell脚本负责实际创建LVM快照。

MongoDB 脚本 (snapshot.js)

这个JavaScript脚本是为了在MongoDB数据库中创建一个数据快照,同时确保数据一致性,而设计的。这是通过在不完全停止数据库服务的情况下“锁定”数据库来实现的。

conn = new Mongo();
db = conn.getDB("admin");
db.auth('root','xxx');
db = db.getSiblingDB('数据库名称');session = db.getMongo().startSession();
session.startTransaction();
db.fsyncLock();
run('/opt/mongodb_snap.sh');
db.fsyncUnlock();
session.commitTransaction();
session.endSession();
conn.close();
  1. 建立连接和认证

    • conn = new Mongo(); 创建一个新的MongoDB连接。
    • db = conn.getDB("admin"); 选择admin数据库进行操作。
    • db.auth('root','xxx'); 使用root账号和对应密码进行认证。
    • db = db.getSiblingDB('fubaodai'); 切换到目标数据库fubaodai,这是实际要快照的数据库。
  2. 事务和锁定

    • session = db.getMongo().startSession(); 启动一个新的会话。
    • session.startTransaction(); 在该会话中开始一个新的事务。
    • db.fsyncLock(); 锁定数据库,以准备进行快照。这个操作会阻止写操作,但读操作仍然可以继续,从而保证了数据的一致性而不完全停止服务。
  3. 执行快照脚本

    • run('/opt/mongodb_snap.sh'); 执行Shell脚本/opt/mongodb_snap.sh来创建一个LVM快照。注意,run函数在这个上下文中并不是MongoDB Shell的内置函数,这里假设它是为了说明目的而使用的。在实际MongoDB Shell脚本中,你可能需要通过其他方式触发快照脚本,比如通过MongoDB的系统命令执行或外部程序调度。
  4. 解锁和结束

    • db.fsyncUnlock(); 解锁数据库,恢复正常的读写操作。
    • session.commitTransaction(); 提交事务,虽然这里的事务主要用于fsync锁定和解锁操作。
    • session.endSession(); 结束会话。
    • conn.close(); 关闭与MongoDB的连接。

通过上述步骤,这个脚本使得数据库能够在确保数据一致性的同时,进行LVM快照创建,而不需要停机或重启服务。这对于需要24/7运行的生产环境尤为重要。

Shell 脚本 (mongodb_snap.sh)
#!/bin/bash
name=mongodb-$(date +%Y%m%d%H%M%S)
/usr/sbin/lvcreate -s -L 100G -n $name /dev/mapper/data-mongodb

这些脚本通过Cron任务在每天零点自动执行,以确保数据同步的准确性和及时性。

要通过cron在凌晨自动执行mongo --nodb mongodb_snap.js命令,你需要按照以下步骤操作:

在终端中运行crontab -e命令。这将打开一个文本编辑器,允许你编辑当前用户的cron作业。

0 1 * * * /usr/bin/mongo --nodb /path/to/mongodb_snap.js

在每天的1:00 AM,执行/usr/bin/mongo --nodb /path/to/mongodb_snap.js命令。请确保根据你的环境替换/usr/bin/mongo/path/to/mongodb_snap.jsmongo命令和mongodb_snap.js脚本的实际路径。

3. 数据同步

完成LVM快照后,我们可以将快照数据同步到另一个MongoDB数据库实例,该实例将作为数据仓库同步任务的数据源。这保证了数据仓库中的数据既准确又是最新的。

总结

MongoDB数据库的备份和恢复是确保数据安全和业务连续性的重要环节。通过使用LVM快照作为备份策略,我们能够快速备份MongoDB数据,最小化停机时间,并以高效的方式恢复数据。这种备份方式的优点在于它提供了高级别的数据保护和可靠性,使得企业能够在数据风险和灾难发生时保持高度的安全性和稳定性。

相关文章:

MongoDB快照(LVM)业务场景应用实战

MongoDB和LVM快照概述 MongoDB的重要性:MongoDB支持的灵活的文档模型,使其成为处理大量分散数据的理想选择,特别是在需要快速迭代和频繁更改数据结构的应用中。 LVM(逻辑卷管理)快照技术基本概念:LVM允许…...

3D开发工具HOOPS:推动汽车行业CAD可视化发展

在最近的行业对话中,Tech Soft 3D(HOOPS厂商)的Jonathan Girroir和Actify的Peter West探讨了CAD可视化在当代企业中的重要性和挑战。作为CAD可视化领域的佼佼者,Actify通过其广受欢迎的Spinfire应用,赋能了全球40多个国…...

Centos安装MySQL提示公钥尚未安装

一、问题 在Centos7.9使用yum安装MySQL时出现错误,提示:mysql-community-server-5.7.44-1.el7.x86_64.rpm 的公钥尚未安装,如下图所示: 执行命令:systemctl start mysqld也提示错误:Failed to start mysq…...

FebHost:英国.UK域名简介

.UK域名是互联网上最广为人知且广泛使用的国家代码顶级域名之一。作为英国官方的国家代码,自诞生之日起,.UK域名对英国本土个人、企业及在线品牌建设扮演了关键角色。 .UK域名于1985年首次推出,这是早期为创建有序域名系统而努力的一部分。当…...

SQL Serve---查询

概要 1、order by子句 —默认asc(升序)、desc(降序) 2、distinct关键字 3、group by子句 4、聚合函数 —max()、min()、sum()、avg()、count() 5、having子句 6、compute子句 英文关键字 order by 排序 asc…...

RabbitMQ3.13.x之十一_RabbitMQ中修改用户密码及角色tags

RabbitMQ3.13.x之十一_RabbitMQ中修改用户密码及角色tgs 文章目录 RabbitMQ3.13.x之十一_RabbitMQ中修改用户密码及角色tgs1. 修改用户的密码1. 修改密码语法2. 修改案例 2.修改角色tags1. 修改标签(tags)语法2. 修改案例 可以使用 RabbitMQ 的命令行工具 rabbitmqctl 来修改用…...

Taro打包生成不同目录

使用taro init创建taro项目时,taro默认打包目录是: /config/index.js outputRoot:dist默认的目录,编译不同平台代码时就会覆盖掉,为了达到多端同步调试的目的,这时需要修改默认生成目录了,通过查看官方文…...

2024-04-08 NO.5 Quest3 手势追踪进行 UI 交互

文章目录 1 玩家配置2 物体配置3 添加视觉效果4 添加文字5 其他操作5.1 双面渲染5.2 替换图片 ​ 在开始操作前,我们导入先前配置好的预制体 MyOVRCameraRig,相关介绍在 《2024-04-03 NO.4 Quest3 手势追踪抓取物体-CSDN博客》 文章中。 1 玩家配置 &a…...

PaddleDetection 项目使用说明

PaddleDetection 项目使用说明 PaddleDetection 项目使用说明数据集处理相关模块环境搭建 PaddleDetection 项目使用说明 https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.7/configs/ppyoloe/README_cn.md 自己项目: https://download.csdn.net/d…...

leetcode解题思路分析(一百五十五)1352 - 1358 题

最后 K 个数的乘积 请你实现一个「数字乘积类」ProductOfNumbers,要求支持下述两种方法: add(int num) 将数字 num 添加到当前数字列表的最后面。 getProduct(int k) 返回当前数字列表中,最后 k 个数字的乘积。 你可以假设当前列表中始终 至少…...

如何将普通maven项目转为maven-web项目

文件-项目结构(File-->Project Structure ) 模块-->learn(moudle-->learn) 选中需要添加web的moudle,点击加号,我得是learn,单击选中后进行下如图操作: 编辑路径 结果如下…...

LeetCode 226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 示例 2: 输入:root [2,1,3] 输出:[2,3,1] 示例…...

【ArcGIS Pro二次开发】(85):Aspose.Cells中的Excel操作

Aspose.Cells是一款功能强大的Excel文档处理和转换控件,开发人员和客户电脑无需安装Microsoft Excel也能在应用程序中实现类似Excel的强大数据管理功能。 1、获取工作薄Workbook string excelFile "C:\Users\Administrator\Desktop\FE.xlsx"; Workbook …...

基于java+springboot+vue实现的兴顺物流管理系统(文末源码+Lw)23-287

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,货运信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…...

pytorch view、expand、transpose、permute、reshape、repeat、repeat_interleave

非contiguous操作 There are a few operations on Tensors in PyTorch that do not change the contents of a tensor, but change the way the data is organized. These operations include: narrow(), view(), expand() and transpose() permute() This is where the con…...

uni-app实现下拉刷新

业务逻辑如下: 1.在滚动容器中加入refresher-enabled属性,表示为开启下拉刷新 2.监听事件,添加refresherrefresh事件 3.在事件监听函数中加载数据 4.关闭动画,添加refresher-triggered属性,在数据请求前开启刷新动画…...

vue ts 应用梳理

文章目录 前言一、页面传值1.1 [props](https://cn.vuejs.org/guide/components/props.html)1.2 [emit](https://cn.vuejs.org/guide/components/events.html)1.3 [store](https://pinia.vuejs.org/zh/getting-started.html) 二、实时计算2.1 [watch](https://cn.vuejs.org/gui…...

CUDA12.4文档-全文翻译

本博客参考官方文档进行介绍,全网仅此一家进行中文翻译,走过路过不要错过。 官方网址:https://docs.nvidia.com/cuda/cuda-c-programming-guide/ 本文档分成多个博客进行介绍,在本人专栏中含有所有内容: https://blog.csdn.net/qq_33345365/category_12610860.html CU…...

【C 数据结构】循环链表

文章目录 【 1. 基本原理 】【 2. 循环链表的创建 】2.1 循环链表结点设计2.2 循环单链表初始化 【 3. 循环链表的 插入 】【 4. 循环单链表的 删除操作 】【 5. 循环单链表的遍历 】【 6. 实例 - 循环链表的 增删查改 】【 7. 双向循环链表 】 【 1. 基本原理 】 对于单链表以…...

Python列表

使用场景:列表是用来存储多组数据的 列表是可变类型 列表支持切片 1.基本规则 1.列表使用[]来表示 2.初始化列表:list [] 3.列表可以一次性存储多个数据:[数据1,数据2,数据3,…] 4.列表中的每一项&#…...

PHP和Node.js哪个更爽?

先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨‍&#x1f…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...