我们在 Ubuntu 14.04 机器上有 3 个文件夹,每个文件夹包含 250K 张图片,每个文件夹的大小为 2KB-30KB,预计每个目录的文件数量会增长到 1M。
在尝试将应用程序扩展到多台服务器时,我们正在研究 Glusterfs 的共享存储。250K 文件在 ext4 上不是问题,但对于 glusterfs 来说似乎有问题。尝试复制文件会导致机器完全崩溃。
我希望将文件分成两级目录:
mkdir -p {000..255}/{000..255}
/000/000/filename
/001/000/filename
/001/001/filename
...
这听起来像是一种可行的方法吗?整个结构稍后将包含数百万个文件。这是否能让 glusterfs 在生产中可靠且性能良好地托管数百万个文件?
答案1
使用 GlusterFS 存储和访问大量非常小的文件是许多实现面临的困难,而且似乎您已经找到了解决该问题的良好方法:将文件分成单独的目录。
您可以实现这样的解决方案。只需创建一堆目录,为每个目录中可以容纳的文件数量设置一个限制,并希望您不会用尽文件存放的地方。在您的示例中,您创建了 65k+ 个目录,因此这在短期内不太可能成为问题。
另一个选项是根据文件创建日期创建目录。例如,如果文件cust_logo_xad.png
是今天创建的,它将存储在这里:
/gluster/files/2015/08/24/cust_logo_xad.png
如果您托管不同实体(客户、部门等)的数据,您可以根据所有权分离文件,为实体分配某种唯一 ID。例如:
/gluster/files/ry/ry7eg4k/cust_logo_xad.png
除此之外,最好看看GlusterFS 文档用于调整用于托管小文件的存储集群。 至少要确保:
- GlusterFS 存储服务器上的文件系统具有足够的可用 inode(
mkfs
选项) - GlusterFS 存储服务器上的驱动器可以处理大量 IOP。
- 您使用适当的文件系统执行任务(ext4 或 xfs)
- 您的应用程序/工作人员不会频繁尝试扫描包含大量小文件的目录。
如果可以的话(如果还没有的话),最好创建一个数据库作为文件的索引,而不必一直扫描(例如ls
)或搜索(例如find
)文件。