当前位置: 首页 > 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.列表中的每一项&#…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

【位运算】消失的两个数字(hard)

消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

基于服务器使用 apt 安装、配置 Nginx

🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

条件运算符

C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【HTTP三个基础问题】

面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...