Nodejs mongodb 如何搞 数据推送, 数据同步 ?

Nodejs mongodb 如何搞 数据推送, 数据同步 ?

我有一台内网的主机,还有一个服务器, 内网机器上的数据总是比较新,而且时不时会产生新的数据, 如何自动化增量推送到公网服务器上?

4 回复

Node.js + MongoDB 数据推送与同步

如果你有一台内网的主机(我们称之为源主机),以及一台公网服务器(我们称之为目标服务器),并且你需要将源主机上不断更新的数据自动增量推送到目标服务器,可以使用 Node.js 和 MongoDB 来实现这一需求。下面是一个简单的方案和示例代码。

方案概述

  1. 监听数据变更:在源主机上监听 MongoDB 集合中的数据变更。
  2. 增量推送:当检测到数据变更时,将新增或修改的数据推送到目标服务器。
  3. 接收数据:在目标服务器上接收并保存这些数据。

示例代码

源主机代码(监听数据变更并推送)

首先,确保你已经安装了 mongodbmongoose 库:

npm install mongodb mongoose

然后,编写监听数据变更并推送的代码:

const MongoClient = require('mongodb').MongoClient;
const mongoose = require('mongoose');

// 连接源数据库
const sourceDbUrl = 'mongodb://source_host:27017/source_db';
const sourceDb = await MongoClient.connect(sourceDbUrl);

// 监听集合变化
const collection = sourceDb.db('source_db').collection('your_collection');
collection.watch().on('change', async (event) => {
    if (event.operationType === 'insert' || event.operationType === 'update') {
        const newData = event.fullDocument || event.updateDescription.updatedFields;
        // 将数据推送到目标服务器
        pushDataToTargetServer(newData);
    }
});

async function pushDataToTargetServer(data) {
    const targetDbUrl = 'mongodb://target_host:27017/target_db';
    const targetDb = await MongoClient.connect(targetDbUrl);
    const targetCollection = targetDb.db('target_db').collection('your_collection');
    
    try {
        await targetCollection.insertOne(data);
        console.log('Data pushed successfully to target server.');
    } catch (error) {
        console.error('Error pushing data:', error);
    } finally {
        targetDb.close();
    }
}
目标服务器代码(接收并保存数据)

在目标服务器上,你需要创建一个简单的 API 来接收来自源主机的数据,并将其存储到 MongoDB 中。这里我们使用 Express 框架来创建 API。

首先,安装所需的库:

npm install express mongodb

然后,创建一个简单的 API 接收数据:

const express = require('express');
const MongoClient = require('mongodb').MongoClient;

const app = express();
app.use(express.json());

const dbUrl = 'mongodb://target_host:27017/target_db';
const dbName = 'target_db';

app.post('/receive-data', async (req, res) => {
    const data = req.body;

    try {
        const client = await MongoClient.connect(dbUrl);
        const db = client.db(dbName);
        const collection = db.collection('your_collection');

        await collection.insertOne(data);
        console.log('Data received and saved successfully.');
        res.status(200).send({ message: 'Data received successfully.' });
    } catch (error) {
        console.error('Error saving data:', error);
        res.status(500).send({ error: 'Failed to save data.' });
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

总结

通过上述代码,你可以实现从源主机到目标服务器的数据增量推送。这种方式适用于实时性要求较高的场景。实际应用中,可能还需要考虑更多的异常处理、安全性和性能优化。


内网那个复制集环境,可以用mongosync

mongosync 可以自动执行吗?

为了实现从内网主机到公网服务器的数据推送和同步,我们可以使用 Node.js 和 MongoDB 的组合。以下是一个简单的示例,展示如何使用 Node.js 和 MongoDB 实现数据推送和同步。

步骤 1: 配置 MongoDB

首先,确保两台机器上的 MongoDB 已正确配置并可以互相连接。假设内网机器上的 MongoDB 用于存储最新数据,而公网服务器上的 MongoDB 用于存储同步后的数据。

步骤 2: 设置数据推送服务

在内网机器上创建一个 Node.js 应用程序,用于监控数据变化,并将变化的数据推送到公网服务器上的 MongoDB。

示例代码

const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://<username>:<password>@<internal-host>:27017';
const remoteUrl = 'mongodb://<username>:<password>@<public-host>:27017';

async function syncData() {
    const internalClient = await MongoClient.connect(url);
    const remoteClient = await MongoClient.connect(remoteUrl);

    const internalDb = internalClient.db('yourdb');
    const remoteDb = remoteClient.db('yourdb');

    const internalCollection = internalDb.collection('yourcollection');
    const remoteCollection = remoteDb.collection('yourcollection');

    // 监控内部数据库中的变更
    const changeStream = internalCollection.watch();

    changeStream.on('change', async (change) => {
        if (change.operationType === 'insert' || change.operationType === 'update') {
            try {
                await remoteCollection.insertOne(change.fullDocument);
                console.log('Data pushed to remote server:', change.fullDocument);
            } catch (error) {
                console.error('Failed to push data:', error);
            }
        }
    });
}

syncData().catch(console.error);

步骤 3: 配置防火墙和网络

确保内网机器可以访问公网服务器上的 MongoDB 端口(默认为 27017),并且公网服务器可以接收来自内网机器的连接请求。

解释

  • MongoClient: 用于连接 MongoDB 数据库。
  • watch(): 用于监视集合中的变更。
  • changeStream: 当检测到变更时,会触发回调函数。
  • insertOne: 将新数据插入到远程 MongoDB 中。

注意事项

  1. 安全性: 确保使用安全的连接方式(如 TLS/SSL)以及强密码。
  2. 性能: 对于大量数据或高频更新的情况,考虑使用批量操作以提高效率。
  3. 错误处理: 在实际应用中添加更详细的错误处理逻辑。

以上示例提供了一个基本框架,你可以根据具体需求进行调整和优化。

回到顶部