Linux文件系统或CDN数百万个带有复制的文件

请告诉我这种情况的解决scheme:

  • 几百万个文件,位于一个目录(“img / 8898f6152a0ecd7997a68631768fb72e9ac2efe1_1.jpg”)
  • 〜平均80k文件大小
  • 90%的随机读取权限
  • 备份(复制)到其他服务器(每5分钟或立即)
  • 图像的元数据保存到数据库中

当文件数量超过200万时,我们遇到了随机访问时间慢的问题。 文件系统是使用noatimedir_index选项的ext3,但不需要使用诸如“ls”或“find”之类的命令。

我认为可能的解决scheme:

  1. 留在ext3并简单地将目录树结构转换为“img / 889 / 8f6 / 152 / a0ecd7997a68631768fb72e9ac2efe1_1.jpg”
  2. 迁移到其他文件系统(ReiserFS,XFS,EXT4等)
  3. 使用分布式文件系统设置存储引擎(举例)
  4. 或者其他…

如果我们select1或2,我们如何复制? rsync无法在ext3文件系统上处理这么多的数据。

对我们来说最好的解决scheme是使用Amazon S3,但是对于我们的stream量来说,这太昂贵了…也许你会推荐一些类比(便宜的CDN或开源项目)

一个目录中的数百万个文件是不好的devise,速度会很慢。 将它们细分为数量较less的目录。

看看https://unix.stackexchange.com/questions/3733/number-of-files-per-directory

使用RAID和/或SSD。 这本身并不能解决访问时间慢的问题,但是如果引入多个目录并减less每个目录的文件数量,比如说一两个数量级,这将有助于防止热点。

考虑XFS,尤其是在使用多个驱动器和多个目录时,它可能会给你带来不错的收益(参见例如这个线程的选项使用,它提供了一些关于md RAID上的XFS的技巧)。

我个人会:

  1. 坚持你目前的FS。 把它们拆分成像你所build议的那样的目录,如果你想要的话,你仍然可以把它作为一个单独的目录,例如用mod_rewrite (猜测这是一个CDNtypes的应用程序)
  2. logging将需要复制的变化,例如每天/每小时等,以便每次需要同步时,需要复制哪些文件可以像在日志上运行diff一样简单(即,您总是先同步日志并同步它们但是在replace它们以计算还需要复制之前做一个diff)。