中间件--MongoDB部署及初始化js脚本(docker部署,docker-entrypoint-initdb.d,数据迁移,自动化部署)
一、概述
MongoDB是一种常见的Nosql数据库(非关系型数据库),以文档(Document)的形式存储数据。是非关系型数据库中最像关系型数据库的一种。本篇主要介绍下部署和数据迁移。
在 MongoDB 官方镜像部署介绍中,MongoDB 的官方镜像会在容器首次启动时自动执行 docker-entrypoint-initdb.d/ 目录下的所有.js 文件(注意:只会在容器创建的第一次会执行,如果是运行之前已有的容器则不会执行),我们可以利用这一点来实现数据的迁移和自动化部署服务。
二、完整部署和迁移过程:
1、删除之前的容器
因为js脚本仅会在初次创建容器启动时才会被执行。如果是已存在的容器重新运行,js脚本是不会被执行的。所以如果之前有运行的容器,需要删除。
命令:
docker rm -f mongdb-with-js
删除示例:
2、编写Dockerfile脚本
因为我们要把我们指定的js文件压到官方的mongDB镜像中,所以这里需要编写Dockerfile文件,用来重新构建镜像。
Dockerfile示例:
# 使用自定义的 MongoDB 镜像
FROM mongo:7.0.4# 维护者信息
MAINTAINER weisian# 设置时区为上海
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime# 将 object-mongo.js 文件复制到容器的初始化脚本目录
COPY ./object-mongo.js /docker-entrypoint-initdb.d
3、编写用于初始化的js脚本
该js文件会被Dockerfile文件压入到镜像中。本例的js脚本就是需要初始化到库中的数据。
名称如:
object-mongo.js
代码示例:
console.log("start running js!!!");
const db = db.getSiblingDB("object_cloud"); // 指定库的名称try {console.log("Switching to database: object_cloud");console.log("Inserting data into object_sensor_category...");// 在object_cloud库的object_sensor_category表中插入数据(支持many和one两种方法)const result = db.object_sensor_category.insertMany([{"_id" : NumberLong("988405030841225243"),"sensorModel" : "DT-ZD-V1001","vibrateIndicators" : [ "rms", "peak"],"params" : {"frequencyResponse" : 22,"sensitivity" : 102},"deleteFlag" : false,"createTime" : ISODate("2024-06-20T03:28:43.030Z")},{"_id" : NumberLong("988405030841225244"),"sensorModel" : "DT-ZS-V1001","pointTypeList" : [ {"pointType" : 1020,"dataBizTypes" : [ 1020]}],"params" : {"workmanshipCollectInterval" : 60,"triggerCount" : 30},"createTime" : ISODate("2024-06-20T03:28:43.030Z"),"createUser" : "1543837863788879871"}]);const result2 = db.object_category.insertMany([{"_id" : NumberLong("988108368994373658"),"collectorChannelNum" : 18,"channelConfList" : [ {"channelType" : "1020","sensorTypeList" : [ NumberLong("988405030841225244")]}],"manufacturerId" : NumberLong("7382949823"),"workmanshipExist" : [ NumberLong(1060)],"sensorTypeList" : [ NumberLong("988404952147693592"), NumberLong("988405030841225242")],"updateTime" : ISODate("2024-06-19T07:49:53.351Z"),"updateUser" : "1543837863788879871"}]);} catch (e) {console.error("Error inserting data: " + e);
}
4、重新构建镜像
(1)、创建工作路径
随意创建一个目录即可。
上传前面编写的Dockerfile和object-mongo.js两个文件
(2)、重新构建镜像image-mongodb-js:1.0
命令:
docker build -t image-mongodb-js:1.0 .
(3)、查询镜像存在
5、启动mongodb服务
(1)、指定用户名(root),密码(123456),和镜像
命令:
docker run -d --name mongodb-with-js -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 image-mongodb-js:1.0
(2)、查看启动日志
命令:
docker logs mongodb-with-js
可以看到object-mongo.js中打印的日志信息,方便查看是否初始化js等操作信息。
6、客户端连接验证
使用如下的IP、端口,用户名,密码连接mongDb服务。
ip:27017
root/123456
可以看到登录成功,且数据初始化完成。
7、过程中的几个命令记一下
进入容器
docker exec -it 415dc88956bd bash
停止并删除容器
docker rm -f mongodb-with-js
删除镜像
docker rmi image-mongodb-js:1.0
宿主机打开mongo shell窗口(可执行原始的mongo命令,在mongDB5.0及之后改为mongosh)(如果进入容器内直接*mongosh即可打开)
docker exec -it mongodb-with-js mongosh以下几个为mong shell的脚本:展示mongo服务中有哪些个数据库
show databases
切换数据库
use phm_local
展示当前数据库下的表
show collections
展示当前数据库下,指定表中的数据
db.object_sensor_category.find().pretty();
加载执行js脚本
load("/docker-entrypoint-initdb.d/phm-mongo.js")
三、js脚本需要注意的点
(1)、Long类型的精度问题
在处理long类型时,如果不用双引号框起来会造成精度丢失问题甚至报错。如下为正确和错误的示例。
正确示例:
"_id" : NumberLong("988404952147693592"),错误示例如:
"_id" : NumberLong(988404952147693592),
(2)、注意mongDb的版本
使用5.0之前和之后的mongDb版本,js语法可能会不相同。
目前使用7.0.4版本,可用语法如下:
const db = db.getSiblingDB("object_cloud"); // 切换到object_cloud库
const result = db.object_sensor_category.insertMany([]) // db库导入多条数据
(3)、时间对象
时间对象需要改成以下格式,注意后面也有双引号
"createTime" : ISODate("2024-06-20T03:28:24.269Z")
四、通过代码做数据迁移
通过如下的代码,也可以实现mongoDb数据的迁移工作。但这种方式要求必须同时连接到两个数据源,对于一些线上环境往往是平常无法访问的。如果网络环境不通的情况下,就只能先把数据导出后,在迁移到目标环境中进行导入的工作(上面的js初始化方式也是这种实现的逻辑,但是不同在于js的方式实现了自动化部署,即:不需要人为再去操作迁移了)
java代码示例如下:
import com.alibaba.fastjson2.JSON;
import com.mongodb.MongoClientSettings;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.*;
import org.bson.Document;
import java.util.Collections;
import java.util.Iterator;public class MongoMigration {public static void main(String[] args) {String[] collections = new String[]{ // 指定需要迁移数据的表"object_category",
// "object_running_conf","object_sensor_category"};for (String collection:collections){copyCollection(collection); // 遍历上面的表进行数据迁移}}private static void copyCollection(String collection) {// 源MongoDB配置String sourceHost = "";int sourcePort = 27017;String sourceDatabase = "object-cloud";String sourceUsername = "root"; // 如果需要的话String sourcePassword = "123456"; // 如果需要的话// 目标MongoDB配置String targetHost = "";int targetPort = 38630; String targetDatabase = "object-cloud";String targetUsername = "root"; // 如果需要的话String targetPassword = "123456"; // 如果需要的话// 连接到源MongoDBMongoClient sourceClient = createMongoClient(sourceHost, sourcePort, sourceDatabase, sourceUsername, sourcePassword);MongoDatabase sourceDatabaseInstance = sourceClient.getDatabase(sourceDatabase);MongoCollection<Document> sourceCollectionInstance = sourceDatabaseInstance.getCollection(collection);// 连接到目标MongoDBMongoClient targetClient = createMongoClient(targetHost, targetPort, targetDatabase ,targetUsername, targetPassword);MongoDatabase targetDatabaseInstance = targetClient.getDatabase(targetDatabase);MongoCollection<Document> targetCollectionInstance = targetDatabaseInstance.getCollection(collection);// 从源集合读取数据并写入目标集合FindIterable<Document> documents = sourceCollectionInstance.find();Iterator<Document> iterator = sourceCollectionInstance.find().iterator();int i=0;while (iterator.hasNext()) {Document doc = iterator.next();targetCollectionInstance.insertOne(doc);if (++i>100){ // 仅迁移前100条数据,有些表数据量太大,不需要可以放弃。如果需要全量,这里要删除掉break;}}// 关闭连接sourceClient.close();targetClient.close();System.out.println("Data migration completed successfully!");}private static MongoClient createMongoClient(String host, int port, String database, String username, String password) {MongoCredential credential = null;if (username != null && !username.isEmpty() && password != null && !password.isEmpty()) {credential = MongoCredential.createCredential(username, database, password.toCharArray()); }MongoClientSettings settings = MongoClientSettings.builder().applyToClusterSettings(builder ->builder.hosts(Collections.singletonList(new ServerAddress(host, port)))).credential(credential) // 如果需要认证.build();return MongoClients.create(settings);}
}
五、总结
通过MongDB官方镜像的特性,会在容器首次启动时自动执行 docker-entrypoint-initdb.d/ 目录下的所有.js 文件,可以利用这一点来实现mongDB的数据迁移或自动化部署服务。
学海无涯苦作舟!!!
相关文章:
中间件--MongoDB部署及初始化js脚本(docker部署,docker-entrypoint-initdb.d,数据迁移,自动化部署)
一、概述 MongoDB是一种常见的Nosql数据库(非关系型数据库),以文档(Document)的形式存储数据。是非关系型数据库中最像关系型数据库的一种。本篇主要介绍下部署和数据迁移。 在 MongoDB 官方镜像部署介绍中ÿ…...
C语言期末考试——常见考题(模拟考)
目录 一、填空题(每空2分,共 20 分) 二、选择题(每题2分,共26分) 三、编程题(第1题6分,其余题目每题10分) !!!需要答案的可以私信&…...
流量过滤与路径转发控制
1,策略路由 PBR基本概念: 策略路由,使网络设备不仅能够基于报文的目的IP地址进行数据转发,也能基于其他元素进行转发,比如源IP地址、MAC地址 可以使用ACL匹配特定的报文,针对该ACL进行PBR部署 PRB策略的…...
Ungoogled Chromium127编译指南 Windows篇 - 获取源码(七)
1. 引言 在完成所有必要工具的安装和配置后,我们进入了Ungoogled Chromium编译过程的第一个关键阶段:获取源代码。本文将详细介绍如何正确获取和准备Ungoogled Chromium的源代码,为后续的编译工作打下基础。 2. 准备工作 2.1 环境检查 在…...
k8s 之 StatefulSet
深入理解StatefulSet(一):拓扑状态 k8s有状态与无状态的区别 无状态服务:deployment Deployment被设计用来管理无状态服务的pod,每个pod完全一致.什么意思呢? 无状态服务内的多个Pod创建的顺序是没有顺序的. 无状态服务内的多…...
iPhone 17 Air基本确认,3个大动作
近段时间,果粉圈都在讨论一个尚未发布的新品:iPhone 17 Air,苹果又要来整新活了。 从供应链消息来看,iPhone 17 Air本质上是Plus的替代品,主要是在维持“大屏”这一卖点的同时,增加了“轻薄”属性ÿ…...
鸿蒙实现应用通知
目录: 1、应用通知的表现形式2、应用通知消息的实现1、发布普通文本类型通知2、发布进度类型通知3、更新通知4、移除通知 3、设置通知道通展示不同形式通知4、设置通知组5、为通知添加行为意图1、导入模块2、创建WantAgentInfo信息3、创建WantAgent对象4、构造Notif…...
ElasticSearch常见的索引_集群的备份与恢复方案
方案一:使用Elasticsearch的快照和恢复功能进行备份和恢复。该方案适用于集群整体备份与迁移,包括全量、增量备份和恢复。 方案二:通过reindex操作在集群内或跨集群同步数据。该方案适用于相同集群但不同索引层面的迁移,或者跨集…...
vue图片之放大、缩小、1:1、刷新、左切换、全屏、右切换、左旋咋、右旋转、x轴翻转、y轴翻转
先上效果,代码在下面 <template><!-- 图片列表 --><div class"image-list"><img:src"imageSrc"v-for"(imageSrc, index) in images":key"index"click"openImage(index)"error"handleI…...
Docker多架构镜像构建踩坑记
背景 公司为了做信创项目的亮点,需要将现有的一套在X86上运行的应用系统迁移到ARM服务器上运行,整个项目通过后端Java,前端VUEJS开发通过CICD做成Docker镜像在K8S里面运行。但是当前的CICD产品不支持ARM的镜像构建,于是只能手工构…...
“pinn是无网格的”???
“pinn是无网格的”??? PINN,即物理信息神经网络(Physics-Informed Neural Networks),是一种将物理定律作为先验知识整合到神经网络训练过程中的方法。它之所以被称为“无网格”的,…...
换一个ip地址是什么意思?换一个网络ip地址会变吗
在网络的世界里,IP地址如同每台设备的“身份证”,是确保网络信息能够准确传输到指定目标的关键。然而,在某些情况下,我们可能需要更换这个“身份证”,也就是更换IP地址。那么,换一个IP地址究竟是什么意思&a…...
JavaWeb学习--cookie和session,实现登录的记住我和验证码功能
目录 (一)Cookie概述 1.什么叫Cookie 2.Cookie规范 3.Cookie的覆盖 4.cookie的最大存活时间 (Cookie的生命) (二) Cookie的API 1.创建Cookie:new 构造方法 2.保存到客户端浏…...
深度学习:基于MindSpore的极简风大模型微调
什么是PEFT?What is PEFT? PEFT(Parameter Efficient Fine-Tuning)是一系列让大规模预训练模型高效适应于新任务或新数据集的技术。 PEFT在保持大部分模型权重冻结,只修改或添加一小部份参数。这种方法极大得减少了计算量和存储开销&#x…...
【LeetCode力扣热题100】【LeetCode 1】两数之和
方法一:暴力循环 两层循环,遍历所有的组合,直到满足条件,返回结果。 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {for(int i0; i<nums.size()-1 ;i){for(int j i1; j<…...
定制链接类名,两类跳转传参,vue路由重定向,404,模式设置
router-link-exact-active 和 router -link-active两个类名都太长,可以在router路由对象中定制进行简化 // index.js// 路由的使用步骤 52 // 1.下载 v3.6.5 // 2.引入 // 3.安装注册Vue.use(Vue插件) // 4.创建路由对象 // 5.注入到new Vue中,建立关联…...
【ArcGIS微课1000例】0135:自动生成标识码(长度不变,前面自动加0)
文章目录 一、加载实验数据二、BSM计算方法一、加载实验数据 加载专栏《ArcGIS微课实验1000例(附数据)》配套数据中0135.rar中的建筑物数据,如下图所示: 打开属性表,BSM为数据库中要求的字段:以TD_T 1066-2021《不动产登记数据库标准》为例: 计算出来的BSM如下图: 二、B…...
ISO45001职业健康安全管理体系认证流程
前期准备 领导决策:企业高层领导需认识到实施 ISO 45001 体系的重要性和必要性,做出认证决策,并承诺提供必要的资源支持。成立工作小组:由企业各相关部门人员组成工作小组,明确各成员的职责和分工,确保工作…...
VueRouter路由
单页应用程序:例 网易云 多页应用程序:例 京东 网易云导航栏点击任一网页不会跳转京东导航栏点击任一包括导航区域就会实现网页跳转 路由介绍 VueRouter Vue路由介绍 5个步骤写完之后出现 #/,说明当前Vue实例已经被路由所管理 2个关键步骤 新…...
性能测试攻略(一):需求分析
性能测试成为软件开发和运维过程中不可或缺的一环。性能测试不仅能够帮助我们了解系统在特定条件下的表现,还能帮助我们发现并解决潜在的性能问题。那么我们怎么做一次完整的性能测试呢?首先,我们需要进行需求分析,来明确我们的测…...
【24年新算法时间序列预测】黑翅鸢BKA优化Transformer时间序列预测(评估指标全,出图多)
本文采用黑翅鸢优化算法( BKA,2024年新算法)优化Transformer模型的超参数,形成了BKA-Transformer时间序列预测模型,以进一步提升其在时间序列预测中的性能,本文采用Matlab编写了BKA-Transformer时间序列预测模型代码,代…...
YOLOv8改进,YOLOv8引入CARAFE轻量级通用上采样算子,助力模型涨点
摘要 CARAFE模块的设计目的是在不增加计算复杂度的情况下,提升特征图的质量,特别是在视频超分辨率任务中,提升图像质量和细节。CARAFE结合了上下文感知机制和聚合特征的能力,通过动态的上下文注意力机制来提升细节恢复的效果。 理论介绍 传统的卷积操作通常依赖于局部区域…...
ZooKeeper节点扩容
新节点的准备工作(这里由hadoop05节点,IP地址为192.168.46.131充当) 配置新节点的主机域名映射,并将其通告给集群中的其他节点配置主机间免密登录关闭防火墙并将其加入到开机不启动项同步hadoop01节点的时间将所需要的文件分发给新…...
深度学习的unfold操作
unfold(展开)是深度学习框架中常见的数据操作。与我们熟悉的卷积类似,unfold也是使用一个特定大小的窗口和步长自左至右、自上至下滑动,不同的是,卷积是滑动后与核求乘积(所以取名为卷积)&#…...
C# 抽奖程序winform示例
C# 抽奖程序winform示例 using System; using System.Collections.Generic; using System.Linq;public class LotterySimulator {private Random random new Random();public List<string> GenerateWinners(int numberOfWinners, int totalParticipants){List<strin…...
嵌入式蓝桥杯学习9 usart串口
复制一下之前ADC的工程,打开cubemx cubemx配置 1.在Connectivity中点击USART1 Mode(模式):Asynchronous(异步模式) 2.将PA9设置为USART1_TX,PA10设置为USART1_RX。 3.配置Parameter Settings. Baud R…...
车载ADB:让汽车更智能的桥梁
随着科技的不断进步,汽车行业也在迅速迈向智能化。车载Android系统(通常称为Android Auto)正在变得越来越流行,而Android Debug Bridge (ADB) 作为连接和调试这些系统的桥梁,也变得尤为重要。在本文中,我们…...
HarmonyOS-高级(一)
文章目录 一次开发、多端部署自由流转 🏡作者主页:点击! 🤖HarmonyOS专栏:点击! ⏰️创作时间:2024年12月09日12点19分 一次开发、多端部署 布局能力 自适应布局 拉伸能力均分能力占比能力缩放…...
【优选算法-滑动窗口】长度最小的子数组、无重复字符的最长子串、最大连续1的个数、将x减为0的最小操作数、水果成篮
一、长度最小的子数组 题目链接: 209. 长度最小的子数组 - 力扣(LeetCode) 题目介绍: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, .…...
Leetcode 每日一题 202.快乐数
目录 题意 算法思路 过题图片 算法实现 代码解析 复杂度分析 题目链接 结论 题意 判断正整数 n 是不是快乐数。 快乐数定义: (1)每次将正整数替换为它每个位置上的数字的平方和。 (2)重复这个过程直到这个数…...
wordpress 体育主题公园/外国网站开放的浏览器
学习tp5和小程序过程需要记住的重点记录 1,box-sizing: border-box; 规定两个并排的带边框的框 border-box 为元素设定的宽度和高度决定了元素的边框盒。 就是说,为元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制。 2,border…...
天空台108网站找手工活带回家做/百度软件中心下载
入门HelloWorld新建项目Configure your new project部分选中 Include C Support 复选框Next正常填写所有其他字段并完成向导接下来几个部分在向导的Customize C Support 部分,您可以使用谢列选项自定义项目:C Standard : 使用下拉列表选择使用的C标准。选…...
怎样做QQ网站呢/热门职业培训班
str.capitalize()【作用:返回首字母大写】【英语:capitalize》用大写字母写】【说明:返回一个新的字符串,原字符串不做修改】In [4]: "vition".capitalize()#通过字符串方法 Out[4]: Vition In [7]: str.capitalize(&qu…...
wordpress twenty thirteen/惠州seo推广优化
74HC595驱动4位7段数码管 1、74HC595介绍 74HCT595 是一个 8 位串行输入/串行或并行输出移位寄存器,带有一个存储寄存器和三态输出。移位寄存器和存储寄存器都有独立的时钟。该器件具有串行输入 (DS) 和串行输出 (Q7S) 以启用级联和异步复位 MR 输入。 MR 上的低电平将复位移…...
铜煤建设网站/seo优化排名易下拉软件
虽然,SQL Server中的DTS也能将数据倒入Excel,但不如使用程序灵活, 本程序主要代码在按钮函数内。可适应于报表开发的读取数据部分:) 我删除了原程序的很多垃圾代码,只留主要起作用的代码 //加入名称空间 using System.Data; using System.Data.SqlClie…...
修改wordpress标题图片/百度seo排名优化价格
Devops一般很少时间会花在数据库的部署上,只有到了不得不去考虑的情况下,才会去考虑如何调整数据库,以适应业务的发展。mongodb本身就很适合Devops,大部分情况下,部署基本按照说明操作一下即可。但实际操作起来&#x…...