【问题标题】:Sharing data between nodes (app servers) in cloud在云中的节点(应用服务器)之间共享数据
【发布时间】:2010-08-09 13:33:27
【问题描述】:

我正在构建一个 Python/Pylons webapp,到目前为止它已经由单个服务器提供服务,现在我想研究它如何在前面有某种负载平衡器的多台服务器之间进行扩展。

当然,主要关注的是服务器端状态。它包括用户会话数据、用户上传的数据(图片等)和缓存。我希望应用程序服务器共享缓存,因此如果其他服务器已经完成,则一台服务器不必做额外的工作。扩展可能不会很快成为问题,但这似乎是一个重大的架构决策,所以最好在一开始就半正确。

对于会话,我可以使用基于 cookie 的会话:http://beaker.groovie.org/sessions.html#cookie-based

对于用户上传的数据和缓存(当前都存储在本地文件系统中),我需要一种不同的方法,但我不确定哪一种最适合。我考虑过的一些选项:

  • 分布式文件系统
    • 尤其是 Amazon S3,因为我将 Amazon 定位为云提供商。但是,我想避免我的代码变得过于特定于供应商,因此稍后更改云提供商是可行的。
  • [分布式] 键值存储,需要重写/抽象出假设所有数据都在文件系统上的代码部分
  • 以某种方式完全避免共享数据,负载平衡器可以非常聪明地将请求定向到在本地具有必要用户数据/缓存的节点。等等,这叫做分片,对吧?
  • 网络可访问的文件系统,特别是 NFS:NFS 目录导出到一个(可能是专用的)节点上,所有其他节点都挂载它。我能想到的可能问题:
    • NFS 主机的带宽可能成为瓶颈
    • 多个客户端尝试同时访问相同文件时的竞争条件

我目前正在考虑使用 NFS——它似乎是可能可行的最简单的解决方案。但是话又说回来,也许还有更多我不知道的警告,使这是一个短视的决定?对于托管在云中并有望横向扩展的应用程序,您的经验是什么?您使用了哪些形式的数据存储和共享?

【问题讨论】:

    标签: python architecture cloud scaling


    【解决方案1】:

    使用标准 memecached 可以轻松完成缓存 - 它可以分布在多个服务器上。 NFS 听起来是个坏主意,因为您需要实现自己的锁定机制以避免竞争条件。 我会选择一种分布式 no-sql 解决方案,例如 cassandra。

    【讨论】:

    • 我也在考虑使用 Memcache 和其他使用 Memcache 协议的项目。 Memcache 的主要问题是它使用内存进行缓存。我对稍慢的磁盘存储没问题,而且我可能有更多的数据要缓存而不是内存。我也对 NFS 持谨慎态度。 Beaker 是我用于缓存的 Python 库,它具有锁定逻辑,但我读到由于 NFS 客户端采用了激进的缓存,仍然很有可能出现不同步问题。
    • 如果磁盘存储是您想要的,我建议不要使用 NFS(正是因为客户端缓存会影响数据的完整性),并选择像 SAN 存储或任何其他“严重”的外部存储解决方案
    【解决方案2】:

    我强烈建议您查看分布式键/值存储而不是 NFS。

    我可能会使用 redis 而不是 cassandra,因为您目前在一个系统上并希望扩展到 2 个系统。 Cassandra 虽然很酷,但专为写入多于读取的系统而设计,并且在您拥有 3 个或更多节点时效果最佳。 另一方面,Redis 与单节点守护程序配合得非常好,本质上类似于 memcached,但具有易出错的持久性。

    Redis 在 python 下非常容易使用,它非常高效,因此在您处理数百万个请求之前,您不必担心 Redis 本身的分片或扩展,但它可能是最大的故障转移问题。我没有亲自部署它,所以我不确定如果它发生故障并且您故障转移到另一个数据,恢复所有数据有多有效/容易。如果你认为这很可能,那么我会调查它。

    如果您想存储更复杂的数据结构,我会研究 MongoDB 或它的等价物之一。

    【讨论】:

      猜你喜欢
      • 2020-09-12
      • 2013-01-05
      • 2013-02-25
      • 1970-01-01
      • 2016-07-30
      • 2016-06-27
      • 2017-05-29
      • 2016-07-13
      • 1970-01-01
      相关资源
      最近更新 更多