保持部分离线的sqlite数据库与PostgreSQL同步

tho*_*nev 4 python database architecture sqlite sqlalchemy

这个问题更多的是关于体系结构和库,而不是实现。

我目前在项目中工作,该项目要求客户端的本地长期缓存存储(每天更新一次)与服务器上的远程数据库保持同步。对于客户端,sqlite已被选为轻量级方法,而PostgreSQL被选为服务器上的功能丰富的db。postgres的本机复制机制是不可选择的,因为我需要保持客户端真正的轻量级,并且不依赖于db服务器等外部组件。

实现语言为Python。现在,我正在研究像SQLAlchemy这样的ORM,但是之前从未使用过。

  • SQLAlchemy是否有任何工具可以使sqlite和postgres数据库保持同步?
  • 如果没有,是否还有其他具有此类工具的Python库?
  • 如果必须“手动”解决任务,关于体系结构应该如何的任何想法?

补充: 就像遥测一样,因为客户端一天只能连接大约20分钟的互联网

所以,主要的问题是关于这样一个系统的体系结构

Alp*_*par 5

在数据库之间同步数据通常不属于ORM的任务,因此您可能必须自己实现它。考虑到数据库的选择,我不知道有什么解决方案可以为您处理同步。

有两个重要的设计选择要考虑:

  • 您如何确定哪些数据已更改(即,插入,更新或删除了)
  • 打包变更日志的最有效方法是什么
  • 您将不得不处理冲突吗?以及您将如何做。

找出更改的最有效方法是让数据库直接告诉您。瓶装水可以在这方面提供一些启发。这个想法是利用postgres用于复制的事件日志。您将需要像Kafka这样的东西来跟踪每个客户已经知道的内容。这将使您可以优化服务器的写入,因为您不会让客户端查询试图找出自从上次在线以来发生了什么变化。在sqlight端使用事件回调可以实现相同的目的,您只需要在客户端上交换一些存储空间即可保留要发送到服务器的更改。如果听起来太多的基础结构无法满足您的需求,那么您也可以轻松地通过SQL和池实现它,但是我仍将其视为事件日志,并考虑如何实现细节-可能允许更多有效的实施起泡。

构造和打包变更日志的最佳方法取决于您的应用程序要求,可用的带宽等。您可以使用标准格式(例如json),必要时进行压缩和加密。

这样设计应用程序会避免冲突,避免冲突,并可能使数据沿单一方向流动,或者对数据进行分区,以使其对于特定分区始终沿单一方向流动,这将更加简单。

最后讲到的是,采用这种架构,您将获得增量更新,其中某些更新可能由于计划外的原因(系统故障,错误,消息丢失等)而丢失。您可以使用一些内置的启发式方法来检查您的数据是否匹配,例如至少检查每一侧的记录数,并通过某种方式来恢复这种故障,同时至少可以通过一种手动方式从权威机构中重新获取数据。源,即如果服务器是权威的,则客户端应该能够丢弃其数据并重新获取它。无论如何,在重新安装客户端等情况下,您可能仍需要这种机制。