1

我有几台服务器都通过 WAN 链接连接(中等带宽,更高的延迟),它们都需要能够共享有关已连接客户端的信息。每个客户端都可以连接到“网格”中的任何服务器。我正在寻找某种分布式数据库,每个服务器都可以托管和更新。如果每台服务器离线任何时间长度,它都能够使用当前状态进行更新,这一点很重要。

如果我找不到任何东西,另一种选择是选择一个服务器来托管所有服务器可以插入的 MySQL DB;但如果可能的话,我真的很想将其作为单点故障删除。(以及与将奴隶提升为主相关的停机时间)

是否有任何您以前使用过并推荐的非单主分布式数据存储?

如果任何解决方案都有 Python 接口,那将是最有用的。

4

5 回答 5

2

你看过 Python 的multiprocessing.Manager对象吗?

您必须添加逻辑来维护分布式数据库(例如,选择新的主数据库、冗余以及您想要的任何属性),这可以通过扩展Manager对象和实现您自己的Proxy对象轻松完成,但我提到的模块会处理为您完成所有同步和数据发送。

这样,您的网格将共享 Pythondict或复杂的数据类型,而不是使用分布式数据库,您指示Manager对象共享到连接的代理。

于 2012-02-26T20:56:05.877 回答
1

看看doozerd 项目。有一个基于gevent的python 客户端

于 2012-03-11T00:41:51.967 回答
0

也许 Hadoop 或类似的东西对你有用?

http://hadoop.apache.org/

于 2012-02-26T20:48:56.293 回答
0

你所描述的让我想起了 Apache Cassandra 集群的配置,这样每台机器都托管整个数据集的副本,并且当它们到达单个节点时读取和写入成功(我从未这样做过,但我认为这是可能的)。当 WAN 链接断开时,节点应该能够保持正常运行,并在它们重新上线后立即接收挂起的更新。尽管如此,这并不神奇——如果在不同的服务器上发布了冲突的更新,或者使用过时的副本来生成新数据,那么您选择的任何架构都会出现一致性问题。

第二个问题是,对于每次本地写入,您将获得 n-1 次远程写入,并且您的服务器可能会花费大量时间和带宽来争论谁拥有最新记录。

我强烈建议您启动几个 EC2 实例并使用它们的连接来检查一切是否按您期望的方式工作。这似乎是在“创造性滥用”区域,如果你得到任何东西,你的里程可能会有很大差异。

于 2012-02-27T13:56:07.753 回答
0

如果每台服务器离线任何时间长度,它都能够使用当前状态进行更新,这一点很重要。

ZooKeeper的临时节点允许您维护所有服务器节点的存在信息。

于 2012-05-13T00:53:43.167 回答