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数据,最小化停机时间,并以高效的方式恢复数据。这种备份方式的优点在于它提供了高级别的数据保护和可靠性,使得企业能够在数据风险和灾难发生时保持高度的安全性和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/536987.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CY7.5-COOH荧光属性Cyanine7.5花菁染料

CY7.5-COOH,作为一种Cyanine 7.5花菁染料,在荧光属性上表现出色。其独特的化学结构赋予了它荧光性质,使其在生物标记、荧光成像和光学传感等领域具有诸多应用前景。 CY7.5-COOH具有出色的荧光量子产率,这意味着在激发光的照射下&…

C#/.NET/.NET Core拾遗补漏合集(24年4月更新)

前言 在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。 GitHub开源地…

微信小程序搜索排名优化的八个套路

微信小程序的搜索优化排名是一个综合性的工作,需要针对多个维度进行操作。小柚给各位新老客户列出一些关键步骤和策略,帮助老板利用微信小程序的搜索排名规则进行优化。 1.选择合适的关键词 深入研究目标用户的搜索习惯,选择高搜索量、低竞争…

Java List基础篇

目录 前言一、常用List1.1 List1.1.1 特点1.1.2 常用API 1.2 ArrayList1.2.1 特点1.2.2 使用 1.3 LinkedList1.3.1 特点1.3.2 使用 1.4 CopyOnWriteArrayList1.4.1 特点1.4.2 使用 1.5 Arrays.asList()1.5.1 特点1.5.2 使用 二、对比总结 前言 一、常用List 1.1 List List是…

Day93:云上攻防-云服务篇对象存储Bucket桶任意上传域名接管AccessKey泄漏

目录 云服务-对象存储-权限配置不当 权限控制-公共读或公共读写:可完整访问但不显示完整结构目录 权限控制-Bucket授权策略:设置ListObject显示完整结构目录 权限控制-Bucket公共读写权限:公共读写直接PUT文件任意上传 云服务-对象存储-…

手写ArrrayList

需求 自定义的MyArrayList import java.util.Arrays; import java.util.Objects;public class MyArrayList<E> {private Object[] elementData ; // 存储元素的数组private int size; // 记录 的元素个数private static final int DEFAULT_CAPACITY 10; // 默认容量// …

Java高频面试之JVM篇

说一下 Jvm 的主要组成部分&#xff1f;及其作用&#xff1f; 类加载器执行器运行时数据区域本地接口 谈谈对运行时数据区的理解&#xff1f; 堆和栈的区别是什么&#xff1f; 堆中存什么&#xff1f;栈中存什么&#xff1f; 堆总存对象,栈中存局部变量,引用 为什么要把堆…

最新php投票系统源码下载 二维码投票生成器系统 源码开源可二开

在当今数字化时代&#xff0c;投票系统已成为各类活动、选举、调查等场景中不可或缺的工具。为了满足广大用户对于高效、便捷投票系统的需求&#xff0c;分享一款最新版的PHP投票系统源码&#xff0c;带二维码投票生成器功能&#xff0c;为用户提供了更为灵活和多样化的投票体验…

说说你对栈、队列的理解?应用场景?

一、栈 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性表&#xff0c;限定仅在表尾进行插入和删除操作的线性表 表尾这一端被称为栈顶&#xff0c;相反地另一端被称为栈底&#xff0c;向栈顶插入元素被称为进栈、入栈、压栈&#xff0c;从栈顶删…

【Python实践应用】使用Python加载栅格数据

下面的代码实现的是加载伊宁市NDVI数据&#xff0c;首先进行相关的python包的导入&#xff0c;然后定义和读取我们需要加载的数据&#xff0c;这里我们使用的NDVI数据是将伊宁23年的NDVI数据合并成为了一张栅格图像&#xff0c;每个波段表示一年的 NDVI&#xff0c;我们这里显示…

备战蓝桥杯---刷杂题2

显然我们直接看前一半&#xff0c;然后我们按照斜行看&#xff0c;我们发现斜行是递增的&#xff0c;而同一行从左向右也是递增的&#xff0c;因此我们可以直接二分&#xff0c;同时我们发现对称轴的数为Ck,2k. 我们从16斜行枚举即可 #include<bits/stdc.h> using name…

探索AI工具导航网站

在现代科技发展迅猛的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了各行各业中不可或缺的一部分。了解和利用最新的AI工具对于工作、学习和娱乐都具有重大意义。在这篇博客中&#xff0c;我们将探索一些最新的人工智能工具导航网站&#xff0c;以及其中一款名…

liunx系统发布.net core项目

liunx系统发布.net core项目 准备.net6程序运行环境部署nginx&#xff0c;通过一个地址既能访问web api&#xff0c;又能访问web项目有一个客户把web api放到docker中&#xff0c;想通过nginx转发&#xff0c;nginx也支持配置多个程序api接口的其它 liunx系统&#xff1a;cento…

【vue】ref 和 reactive 对比

ref&#xff1a;存储单个数据&#xff0c;如数值&#xff0c;字符串reactive&#xff1a;存储复杂数据&#xff0c;如对象&#xff0c;数组 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"vie…

短剧小程序系统开发,让短剧观看与创作更加便捷。短剧系统源码搭建

一、目前短剧发展趋势 1. 市场规模&#xff1a;根据数据来看&#xff0c;2023年中国微短剧市场规模达到了373.9亿元&#xff0c;同比上升了267.65%。预计2024年市场规模将超过500亿元。这一市场规模的增长速度非常显著&#xff0c;显示出短剧行业的巨大潜力和发展前景。 2. 投…

3款热门婴儿洗衣机全面对比测评:希亦、小吉、觉飞哪款性能最强?

经常洗大人衣物的传统洗衣机&#xff0c;很少有专门的高温除菌等功能&#xff0c;所以洗衣机里有可能会有一些大人身上带有的细菌&#xff0c;特别是婴儿衣物&#xff0c;婴儿抵抗能力弱&#xff0c;衣物混洗可能让宝宝感染细菌而导致生病&#xff0c;这种事情是有过发生的&…

SI案例分享--实用的单端口Delta-L测试方法

目录 0 引言 1 单端口Delta-L技术 2 基于单端口Delta-L方法的反射灵敏度分析 3 用充分表征的材料系统验证该方法 4 在单端口法中提取总损耗 5 总结 0 引言 Intel Delta-L方法已被公认为一种常规方法&#xff0c;通过对测试线进行2端口测量来提取层压板材料的Dk和插入损耗…

FX110网:汇市经纪商Prospero Markets被ASIC发出正式清盘令

澳大利亚联邦法院已批准金融监管机构 ASIC 的请求&#xff0c;向ASIC 许可的&#xff08;前&#xff09;零售外汇和差价合约经纪商 Prospero Markets Pty Ltd 发出正式清盘令。 相关阅读&#xff1a;《ASIC请求下令清盘汇市经纪商Prospero Markets》 法院于周四发布命令&#…

JVM调优工具详解-jps、jmap、jstat、jstack

jps 用于查看相关java线程的相关信息 选项作用-q仅显示进程 ID&#xff0c;而不显示类名或 JAR 文件的路径-m显示传递给主类的参数-l显示完整的主类名或 JAR 文件的路径-v显示传递给 Java 虚拟机的参数 jmap 此命令用来查看内存信息&#xff0c;实例个数以及占内存大小 jmap…

Ant Design 表单基础用法综合示例

Ant Design 的表单组件设计得非常出色,极大地简化了表单开发的复杂度,让开发者能够快速构建出功能丰富、交互友好的表单界面。 接下来总结一下 Ant Design 中表单的基本用法。 Form 组件 用于定义整个表单,可以设置表单的布局方式、提交行为等。通常会将表单字段组件嵌套在 F…