如何使用 MySQL 在多个客户端之间高效地同步数据?

Posted

技术标签:

【中文标题】如何使用 MySQL 在多个客户端之间高效地同步数据?【英文标题】:How to efficiently sync data between multiple clients with MySQL? 【发布时间】:2019-05-31 10:33:57 【问题描述】:

我正在建立一个基于 arduino 的网络,该网络具有多个控制器(电话、网页、PC 应用程序)来配置中继系统(基础)。该网络使用 mysql 数据库来存储和同步客户端和基础之间的配置。所有客户端和基地都可以操作配置,并且客户端应该看到基地的实时配置。这意味着如果客户端更改了配置,所有其他客户端和基础都应该看到此更改。如何在此网络中同步数据并避免冲突?有没有高效的算法?

我使用数据库服务器的时间戳来跟踪更改。每当 db 更改时,它都会保存时间戳。所有客户端都获取此时间戳并将其与上次获取的时间戳进行比较。但问题是当 2 个或更多客户端同时访问该数据库时,会发生冲突,并且我会丢失除一个之外的所有客户端的配置更改。 使用时间戳似乎不是一个好主意。如果基础离线,我们无法保存离线期间在基础上所做的更改。因为一旦它重新上线,它就会从数据库中获取配置。 对不起我的英语不好。

【问题讨论】:

【参考方案1】:

数据库应该是同步点:在进行更新之前,客户端应该将数据锁定在事务中,进行更改然后提交。

锁定数据的一种方法是将for update 添加到您的选择语句中。 MySQLdocumentation中有更多信息

【讨论】:

【参考方案2】:

如果您有不可靠的连接设备,并且有多个客户端修改一组公共数据,那么您天生就有相当复杂的应用程序设计。

您可以这样做的一种方法是将历史记录存储在您的表中。

所以,而不是

ID     config_1    config_2 ...  timestamp
----------------------------------------------
1          true         44         24-may-2019:20:00:02
2          false        88         26-may-2019:10:10:06

你可能会这样做

ID     config_1    config_2 ...  timestamp
----------------------------------------------
1          true         44         24-may-2019:20:00:02
1          false        44         21-may-2019:11:34:34
1          false        22         10-oct-2018:19:22:22
2          false        88         26-may-2019:10:10:06

在这种情况下,您不会更新记录,因此无需担心锁定 - 您只需插入新值,“最后一个获胜”。

【讨论】:

以上是关于如何使用 MySQL 在多个客户端之间高效地同步数据?的主要内容,如果未能解决你的问题,请参考以下文章

mysql按照租户同步

如何高效地处理数百个项目中的数千个 C# 文件?

美团MySQL实时同步到数据仓库架构与实践

如何高效地产生多个不重复的随机数?

如何高效地向Redis写入大量的数据

如何在 Python 中的多个异步进程之间进行同步?