【问题标题】:transform and synchronize data across multiple systems跨多个系统转换和同步数据
【发布时间】:2021-06-16 14:32:00
【问题描述】:

我将快速解释上面的数据流图。

左下角的主进程和旁边的mongodb数据存储是我系统的两个主要组件。简而言之,主要过程是从 MySQL 系统收集数据,该系统用作我们公司其他后端系统的数据存储。我系统外部的其他系统不断更改各自 MySQL 数据库中的数据。主要过程是从这些系统转换数据,实际上并未更改原始模式,而是向其中添加更多信息,有时更新其值,而不是 SCHEMA。转换后的数据由我们的移动应用程序使用,即 DFD 中 mongodb 数据存储旁边的外部实体。现在,当我使用该系统创建转换数据的新副本时,一切正常,此时它在数据方面与所有其他系统同步。

问题是,

当我稍后尝试进一步转换数据时,我希望能够将更改通知用户并将其与原始数据同步(如果用户愿意),因为其他外部系统甚至我自己的进程可能有更新了数据。

{
"data_gathered_by_process": [
    {
        "id": "DB1",
        "original data field 1": "original value 1"
    },
    {
        "id": "DB2",
        "original data field 2": "original value 2"
    },
    {
        "id": "DB3",
        "original data field 3": "original value 3"
    }
]
}

这可以转化为

{
"transformed data": [
    {
        "id": "DB1",
        "original data field 1": "transformed value 1",
        "additional field added by process": "value"
    },
    {
        "id": "DB2",
        "original data field 2": "original value 2",
        "additional values": ["one", "two"]
    },
    {
        "id": "DB3",
        "original data field 3": "original value 3"
    }
]
}

现在可以再次以这种方式更改原始数据

{
"data_gathered_by_process": [
    {
        "id": "DB1",
        "original data field 1": "changed to some other value"
    },
    {
        "id": "DB2",
        "original data field 2": "original value 2"
    },
    {
        "id": "DB3",
        "original data field 3": "original value 3"
    }
]
}

我正在考虑实现这样的东西:

在 DB1、DB2、DB3 的实体上添加 last_updated 时间戳,并将其存储在转换后的数据副本中。在处理已经转换的数据时,一一检查所有实体的时间戳,如果不匹配则更新。我将首先通知用户原始数据已更改,如果他想进行更改,请使用相同的逻辑。但这将是一个处理开销,因为有十多个实体,每个实体都有不同的属性集。

我认为有更好的方法来做到这一点,只要有人能指出我正确的方向。

【问题讨论】:

    标签: mysql mongoose database-design sequelize.js


    【解决方案1】:

    (从 MySQL 的角度来看...)

    单个数据集(所有数据库),位于 3 台机器上。这 3 台机器处于某种 Replication 中。

    如果具体是“3”,那么Galera Cluster是个不错的选择。每个客户端都可以写入其附近的 Galera“节点”;该数据将立即复制到其他两个节点。

    如果“3”可能随着时间的推移而增长,我将有 1 个“主要”和一些副本。此拓扑要求所有写入都转到主节点。从每个客户端到主节点可能居住的位置有多远(ping 时间)?

    副本的数量可以为零——一切都在主节点上完成。或者它可能是越来越多的服务器;如果 read 流量太高而无法在单个服务器中处理,这很有用。

    这两种方法(Galera 与 Primary+Replicas)都强制每次 写入 到所有服务器,从而消除您描述的同步。

    (第三种方法是“InnoDB Cluster”。)

    【讨论】:

    • 我不确定复制将如何解决这个问题,副本不是另一个数据库的精确副本吗?就我而言,我现在有三个 mysql 数据库(所有不同的不是副本),我正在组合来自它们的信息,然后将其转换并存储为一个单一的 mongodb 文档。现在一件好事是,我不是通过跨数据库连接来创建实体,它们是从数据库的单个表创建的,甚至在存储在 mongodb 文档中的转换数据中,我保留原始模式并仅添加新数据给它。
    • 对于我保留的数据(模式),我想要一种优雅的方式来检查它与它的 mysql 对应物,而无需运行多个查询和循环并检查每个实体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多