2016-08-15 152 views
3

这个问题更多的是架构和库,而不是实现。保持部分离线的sqlite数据库与postgresql同步

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

实现语言是Python。现在我正在查看像SQLAlchemy这样的ORM,但之前没有任何工作。

  • SQLAlchemy有没有任何工具可以让sqlite和postgres dbs保持同步?
  • 如果没有,是否还有其他Python库有这样的工具?
  • 如果任务必须“手工”解决,那么关于架构应该如何应该是什么样的想法?

补充: 这就像遥测,目标客户将只有一天

所以大约20分钟的网络连接,该主要问题是这样一个系统的构建筑

+2

这个问题太广泛了。 – e4c5

+0

附注。如果在桌面上有一个折衷的地方,你可以看看CouchDB作为离线优先数据库(文档虽然不是关系数据库)做广告。或者至少在他们的文档中寻找关于[最终一致性]的想法(http://docs.couchdb.org/en/2.0.0/intro/consistency.html#eventual-consistency)(并可能通过关系数据库实现它)。根据我的经验,它太严格和不方便,但你的里程可能会有所不同。 – saaj

+0

这是单向复制还是双向复制?即客户端上的数据库是只读的?如果它只是更新客户端上的数据库,那么它就简单得多。没有碰撞。如果客户端和服务器都对数据库进行了修改,您是否可以对每个客户端的数据进行分区?我问这个问题的原因是,看看是否有办法避免碰撞,其中2个客户端正在脱机更新同一行,然后同时上传 - 你会如何协调: –

回答

4

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

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

  • 你怎么找出数据改变什么(即插入,更新或删除)
  • 什么是打包变化日志的最有效的方法
  • 你需要处理冲突吗?你将如何做到这一点。

找出变化的最有效方法是让数据库直接告诉你。 Bottled water可以在这方面提供一些启示。这个想法是挖掘postgres用于复制的事件日志。你需要像Kafka这样的东西来跟踪你的每个客户已经知道的东西。这将允许您优化您的服务器以进行写入操作,因为您将无法查询客户端是否试图找出自上次在线以来更改的内容。 同样可以通过使用event callbacks的sqlight结尾来实现,您只需交换客户端上的一些存储空间以保留要发送到服务器的更改。如果这听起来像您的需求太多的基础设施,那么您可以使用SQL和池来轻松实现,但我仍然会将其视为事件日志,并考虑它是如何实现的细节 - 可能允许更多高效实施起来。

构建和打包更改日志的最佳方法将取决于您的应用程序要求,可用带宽等。如果需要,您可以使用标准格式,如json,compress和encrypt。

设计您的应用程序以避免冲突,并可能在单一方向上流动数据或分区您的数据,使其始终以单一方向流向特定分区将会简单得多。

最后一个教训是,使用这样的体系结构,您将获得增量更新,其中一些可能由于计划外原因(系统故障,错误,丢弃的消息等)而错过。你可以有一些内置的启发式方法来检查你的数据是否匹配,比如至少检查每一边的记录数,用一些方法来恢复这样的错误,以最小的方式手动重新获取来自权威的数据源,即如果服务器是权威的,客户端应该能够丢弃它的数据并重新获取它。无论如何,您可能需要这种机制来处理客户端重新安装的情况等。

相关问题