目前,我在InnoDB表中将图像(最大6MB)存储为BLOB.随着数据量的增长,夜间备份越来越慢,阻碍了正常的性能.
因此,二进制数据需要转到文件系统.(指向文件的指针将保存在数据库中.)
数据具有树关系:
- main site - user_0 - album_0 - album_1 - album_n - user_1 - user_n etc...
现在我希望数据通过目录结构均匀分布.我该怎么做到这一点?
我想我可以尝试MD5('userId, albumId, imageId');
切片结果字符串以获取我的目录路径:
/var/imageStorage/f/347e/013b/c042/51cf/985f7ad0daa987d.jpeg
这将允许我将第一个字符映射到服务器,并将目录结构均匀分布在多个服务器上.
然而,这不会保持每个用户组织的图像,可能将图像分散在多个服务器上的1个专辑中.
我的问题是:
在保持用户/专辑数据在一起的同时,以平衡的方式将图像数据存储在文件系统中的最佳方法是什么?
我在想正确的方向吗?或者这是完全做事的错误方式?
更新:
我将为md5(user_id)
最高级别的拆分进行字符串切片.然后将所有用户数据放在同一个存储桶中.这将确保数据的均匀分布,同时保持用户数据紧密存储在一起.
/var - imageStorage - f/347e/013b - f347e013bc04251cf985f7ad0daa987d - 0 - album1_10 - picture_1.jpeg - 1 - album1_1 - picture_2.jpeg - picture_3.jpeg - album1_11 - picture_n.jpeg - n - album1_n
我想我会使用从后面拆分的albumId(我喜欢这个想法!),以保持每个目录的专辑数量更小(尽管大多数用户不需要).
谢谢!
只需从后面拆分用户ID即可.例如
UserID = 6435624 Path = /images/24/56/6435624
对于备份,您可以使用MySQL Replication并备份从属数据库,以避免在备份时出现问题(例如锁定).
关于将文件名分配到不同目录的一件事,如果你考虑将你的md5文件名分成不同的子目录(这通常是个好主意),我建议将完整的哈希保存为文件名,并将前几个字符复制为目录名.通过这种方式,您可以更轻松地识别文件,例如,当您必须移动目录时.
例如
abcdefgh.jpg - > a/ab/abc/abcdefgh.jpg
如果你的文件名不是均匀分布的(不是哈希),请尝试选择一个获得均匀分布的分割方法,例如最后一个字符,如果它是一个递增的用户ID