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

谈谈系列之金融直播展业畅想

近些年直播异常火热,对于各大中小型基金证券公司,也纷纷引入直播作为新型展业渠道。在这其中有一部分直接采用第三方云平台,也有少部分选择自建直播平台。当然自建直播平台也不是纯自研,大抵都是外购第三方厂商整体解决方案&#…...

【C 数据结构】双向链表

文章目录 【 1. 基本原理 】【 2. 双向链表的 创建 】实例 - 输出双向链表 【 3. 双向链表 添加节点 】【 4. 双向链表 删除节点 】【 5. 双向链表查找节点 】【 7. 双向链表更改节点 】【 8. 实例 - 双向链表的 增删查改 】 【 1. 基本原理 】 表中各节点中都只包含一个指针&…...

Leetcode刷题之消失的数字(C语言版)

Leetcode刷题之消失的数字(C语言版) 一、题目描述二、题目解析 一、题目描述 数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗? 注意:本题相对书上原题稍作…...

LeetCode654:最大二叉树

题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 …...

AI禁区徘徊监测识别摄像机

AI禁区徘徊监测识别摄像机是一种基于人工智能技术的智能监控设备,用于监测禁止进入或逗留的区域。这种摄像机通过高清摄像头实时捕捉场景图像,利用AI算法对人员徘徊行为进行识别和监测,有助于提高安全防范水平,减少潜在的安全风险…...

【学习】什么是信创适配性测试?信创适配性测试的重要性有哪些?

随着信息技术的快速发展和广泛应用,信息技术应用创新(信创)已成为推动我国产业升级和经济发展的重要力量。在信创领域,适配性测试至关重要,它不仅关系到信创产品的质量和性能,还直接影响到用户的使用体验和…...

linux 配置服务开机启动

一、Centos 中配置进程开启启动 1、使用 systemd 服务: (1)创建一个名为 myapp.service 的服务文件: [Unit] DescriptionMyApp #描述 After #描述服务类别 [Service] Typefork…...

React中State管理的4 个关键解决方案

在 React 应用开发中,状态(state)管理是非常重要的一部分。合理地管理状态可以确保组件的行为正确,提高应用的可维护性和性能。然而,在实际使用 React 的 state 时,开发者常常会遇到一些常见的问题和陷阱。 本文将从解决问题的角度,总结 React 中 state 管理的4个关键技巧: 使…...

Testng测试框架(6)--@Factory动态地创建测试类的实例

工厂允许您动态地创建测试。例如,假设您想创建一个测试方法,该方法将多次访问网站上的某个页面,并且您希望使用不同的值来调用它。 public class TestWebServer {Test(parameters { "number-of-times" })public void accessPage(…...

Kubernetes(K8s)运维实战:案例解析与代码实践

一、引言 随着容器技术的普及,Kubernetes(K8s)作为容器编排领域的领军者,已成为企业运维不可或缺的工具。K8s以其强大的自动化管理、可扩展性和高可用性等特点,为运维人员提供了便捷、高效的管理手段。本文将结合具体案…...