2

我有一个 Web 应用程序 - 一个简单的 Web 应用程序存档文件 - 它有多个用于不同存储类型的存储适配器,即。MongoDB 和 CouchDB。通过使用这个应用程序,我可以使用我编写的 Web 服务将数据存储/查询到那些数据库。目前我每个应用程序只能有一个数据库实例,不能有多个,这会阻止我进行并行处理。


我想要的是在多台机器上运行我的应用程序。除此之外,我想编写一个 UI,使客户端能够在不知道数据库类型/地址的情况下存储/查询数据。

我有两种不同的情况,想问你其中哪一种是更好的方法,为什么。


1)假设我有三台服务器运行三个单一数据库 - couchdb。我可以将我的应用程序上传到这些服务器,然后在我的 UI 或应用程序上方的层的帮助下,我可以定义一个服务器地图,以便我可以存储和查询数据。

在此处输入图像描述

正如您在上面看到的,数据库和应用程序位于同一台服务器上,因此它们是远程的。


2)假设三台服务器仍在远程运行,但在这种情况下,我的应用程序是本地的。我让它接受几个数据库实例。

在此处输入图像描述


我实际上更喜欢第一个,因为在这种情况下我不需要扩展我的应用程序,但我想听听你的想法。如果你能为这种分布式场景提供一些资源,我会很高兴——我对那种东西完全没有经验。

4

1 回答 1

2

请查看描述Instagram 架构的文章。了解 3 位工程师如何处理每天 1.5 亿张照片的 15-25 百万用户是非常有趣的。

另外我会推荐有趣的博客,它描述了流行网络资源的不同可扩展性解决方案:

有很多信息。

但最常见的是:

尽管您可能会找到每一个的解释,但我想根据您的要求关注最后一个。

当您想让您的应用程序水平扩展时,您需要将每个集群视为单独的逻辑模块,而不考虑集群中涉及的实际服务器数量。Fe 对于您的 Web 应用程序,您可以设置该应用程序的多个实例并在它们之前设置负载平衡器。因此用户可以访问单个入口点(例如http://mysite.com),同时实际实例可能是任意的。

如果您需要在彼此之间进行实例协作,那么您需要避免使用内存存储,而是使用“键值”存储,例如Redis以及消息代理,例如ActiveMQRabbitMQ或云版本Iron.IO等.

您还需要将数据存储视为单一入口点,例如分片集群(fe MongoDB 支持开箱即用的自动分片,大多数 NoSQL 解决方案也有它 - CouchDBHBase)。所以基本上你调用一些分片控制器,它根据特定的分片键重定向到相应的实例。但请注意,通常分片可能是非常重要的事情,因此在大多数情况下,当您处理 RDBMS 时,您需要使用垂直可伸缩性。

考虑到以上所有内容,我建议您采用这样的结构:

简单模式

当然,理想情况下,所有服务器必须在物理上彼此靠近(fe 在同一个数据中心)。但是,如果您打算将您的应用程序用作 World-wide,那么您需要根据更少的延迟对您的实例进行分片。这是关于服务器配置的非常有趣的讲座(即使是关于 MongoDb,我相信一些方法也可能对您的情况有所帮助):https ://www.youtube.com/watch?v=TZOH92mZIN8

但是,如果不需要将所有服务器用于分布式“map/reduce”计算,并且为了获得结果,您只需要一个特定服务器的实例,在这种情况下,我相信场景 #1非常适合并且更好地满足您的需求(以防万一如果您在实例之前设置负载均衡器)。

于 2013-03-18T11:02:32.883 回答