我正在考虑如何设计一种机制来一次将(可能很大)MongoDB 或其他 NoSQL(CouchDB 等)数据库复制到数十个客户端。客户端的功能类似于副本集,但复制是单向的,远程客户端将属于其他方。具体来说,我正在寻找以下功能:
- 实时:对主数据库的更改应尽快推送给客户端
- 复制到新客户端:新客户端必须能够连接,自动同步大部分现有数据,然后接收实时更新。
- 高效:数据的初始同步/传输和实时更新的跟踪(“差异”,如果你愿意的话)在计算上都很高效,连接了多个客户端。
- 安全:主数据库提供了一个接口,远程客户端(不属于同一所有者或系统)可以连接到该接口:即,我们不能只将所有客户端添加到主数据库的副本集中。
- 健壮:客户端和主数据库之间的临时连接故障应该可以轻松有效地恢复。
在某种意义上,服务器正在发布数据集合,而客户端正在订阅它。我意识到这是一个很难的软件工程问题,据我所知,还没有任何软件能够完全实现这一点。但是,有些方法已经想到了,我将在下面列出。
Meteor 的 DDP 协议:它旨在使用类似 Mongo 的集合来执行此操作,并准确地实现了发布和订阅一组数据(而不是消息流)的模型。它管理初始同步并发送实时更改。然而,它仍在开发中,远不是工业级的解决方案——当前的缺点是服务器以一种可能低效的方式保存每个客户端状态的副本,并且只在可以适合网络内存的集合上进行测试应用程序。此外,如果不从头开始获取所有内容,DDP 似乎无法有效地同步过时的数据库。如果有人可以指出一些示例,说明可以通过 DDP 同步多少集合,那就太好了。(也可以看看:https://stackoverflow.com/q/10128430/586086)
广播Mongo oplog :使用像Apache Kafka这样的高吞吐量消息总线,可以一次有效地将 oplog 发送到多个客户端。这解决了一些系统实施挑战。但是,这要求客户端从初始同步开始,以某种方式使它们足够接近当前的主状态,然后从适当的点开始重播 oplog。
CouchDB 的连续复制:考虑到文档的稀疏性,我不确定这是如何实现的以及它有多健壮。但是,它似乎确实适用于远程数据库连接。但是,当多个客户端尝试同时复制时,这有多有效?(与此类似的 hack 是使客户端 MongoDB优先级为 0 副本集成员;但是,这似乎与其预期用途相去甚远。另请参见: http: //guide.couchdb.org/draft/replication.html)
请指出已经实现部分功能的软件或软件片段,或有关有效执行此操作所需的算法/数据结构的建议。