2012-08-22 304 views
1

我正在寻找更清晰的方式来在对源代码和基础结构影响最小的情况下水平扩展我的Java应用程序。这里是我的问题:我目前在本地文件系统中保存资源,所以我需要一致在我所有的新处理处理节点之间共享这些文件。 我知道ehcache和terractora服务器阵列的存在,但本地可重新启动(持久性保证)仅适用于ehcache企业,我希望尽可能保留商业许可证。 其他替代方案可以是memcached,redis,mongodb(坚持记住),甚至nfs,但我希望那些有经验使用这些服务作为存储服务的人的意见,我还需要澄清一下:需求阻止使用任何联机云存储服务虽然我打开任何可以安装在我的数据中心当然!文件存储服务器

+0

您正在复制的资源文件有多大?这些是否需要最终在应用程序的文件系统中进行操作,还是可以使用直接从数据存储加载的数据? – Stennie

+0

文件通常很小,约1mb。我可以设法直接从数据存储加载资源,我认为这不会是一个问题。 –

回答

1

用MongoDB的,你可以利用:

  • replica sets将数据分发到多台服务器
  • sharding规模写入(如果适用于数据量并写入你需要管理)

你有几个选项来存储你的二进制文件在MongoDB中:

1)你可以保存fi在MongoDB文档的一个字段中作为二进制数据。当前的文档大小限制(如MongoDB 2.2)为16Mb,这似乎足以满足〜1Mb文件的要求。

2)您可以使用GridFS API方便地处理较大的文档或以较小的块获取二进制文件(另请参阅:Java docs for the GridFS class)。

+0

在mongodb中通过选择gridfs而非二进制文件表示方式会有什么显着的性能差异吗? –

+0

我不知道使用单个二进制字段与GridFS的任何相对性能基准。 [GridFS规范](http://www.mongodb.org/display/DOCS/GridFS+Specification)将文件分割成更小的块(通常为256k),这可以在编写非常大的文件时帮助并发,但确实有一定的开销重新构建文件。 GridFS实现还负责存储文件和元数据,因此很容易实现。对于大约1 MB的文件,在单个文档中处理它们可能会更方便。我会测试两种方法,看看有什么合适的。 – Stennie

相关问题