云中节点(应用服务器)间的数据共享
我正在构建一个Python/Pylons的网页应用,之前一直是用单台服务器来提供服务,现在我想研究一下如果在前面加一个负载均衡器,把这个应用扩展到多台服务器上会是什么样子。
当然,最主要的担忧是服务器端的状态。这包括用户的会话数据、用户上传的数据(比如图片)和缓存。我希望应用服务器能够共享缓存,这样如果一台服务器已经处理过某些事情,其他服务器就不需要再做重复的工作。虽然短期内扩展可能不是问题,但这似乎是一个很重要的架构决策,所以最好在一开始就尽量做到正确。
对于会话管理,我可以使用基于cookie的会话:http://beaker.groovie.org/sessions.html#cookie-based
至于用户上传的数据和缓存(目前都存储在本地文件系统上),我需要一种不同的方法,但我不确定哪种方法最合适。我考虑过一些选项:
- 分布式文件系统
- 特别是亚马逊的S3,因为我打算使用亚马逊作为云服务提供商。不过,我希望我的代码不要过于依赖某个特定的供应商,这样以后更换云服务提供商时会比较方便。
- [分布式]键值存储,这需要重写或抽象出我代码中假设所有数据都存储在文件系统上的部分
- 以某种方式避免共享数据,负载均衡器可以很聪明地将请求导向那些本地有必要用户数据/缓存的节点。等一下,这个叫做分片,对吧?
- 网络可访问的文件系统,特别是NFS:在一个(可能是专用的)节点上导出NFS目录,其他所有节点都挂载它。我能想到的一些可能问题:
- 到NFS主机的带宽可能成为瓶颈
- 当多个客户端同时尝试访问同一个文件时可能会出现竞争条件
我目前考虑使用NFS——这似乎是一个可能有效的最简单的解决方案。但是,也许还有我不知道的更多问题,这会让这个决定变得短视?你们的经验如何?对于那些托管在云端并预计会横向扩展的应用,你们使用过什么样的数据存储和共享方式?
2 个回答
我强烈建议你考虑使用分布式的键值存储,而不是NFS。
我可能会选择使用redis,而不是cassandra,因为你现在只在一个系统上,想要扩展到两个系统。虽然cassandra很酷,但它是为写入操作多于读取操作的系统设计的,最好是在有三个或更多节点的情况下使用。而redis则在单节点的情况下表现得很好,基本上就像memcached,但它有一定的数据持久性。
在python中使用redis非常简单,而且性能也很好,所以在你还没有达到每秒数百万请求之前,不用担心如何分片或扩展redis本身,但它的故障转移可能是最大的挑战。我个人没有部署过,所以不太确定如果它出现故障并且需要切换到另一个实例时,恢复所有数据的效果和难易程度。如果你觉得这种情况可能会发生,那就值得深入了解一下。
如果你想存储更复杂的数据结构,可以考虑MongoDB或类似的产品。
缓存可以很简单地通过标准的memcached来实现,而且它可以分布在多个服务器上。使用NFS听起来不太好,因为你需要自己实现一个锁机制来避免竞争条件。我的建议是选择像cassandra这样的分布式无SQL解决方案。