怎么存储千万级别的图片文件, 在保证尽可能节省空间的前提下,还能方便读写

2020-06-03 14:06:53 +08:00
 xchaoinfo

之前的图片都是一个个小文件放在文件夹中, 这样的问题是, 需要的存储空间比较大, 图片迁移也不方便, 而且对 I/O 的消耗非常大. 目前考虑使用数据库来存储, 方案有 lmdb sqlite 请问各位 V 友, 有其他好的方案吗? 能支持多线程读写最好.

6920 次点击
所在节点    数据库
74 条回复
keepeye
2020-06-03 16:00:00 +08:00
https://github.com/sjqzhang/go-fastdfs
支持文件合并存储,但要通过接口存取
sivacohan
2020-06-03 16:01:37 +08:00
6 、7 年之前,我们处理这种情况是放 leveldb
msg7086
2020-06-03 16:01:45 +08:00
@hakono 各个大厂的小文件 FS 难道不是为了做大型集群?
楼主要是打算搞起一柜子存储服务器放个几百 TB 的图,那用小文件 FS 是挺好的。
如果只是单机的话,ReiserFS 或者 Reiser4 不能胜任吗?

@xchaoinfo 如果要考虑这种单文件迁移的话,可以看看 tar 包或者无压缩 zip 包,因为没有压缩所以串流起来很方便,可以直接定位便宜然后读数据。
rrfeng
2020-06-03 16:01:53 +08:00
tfs 之类的。
hdfs 也行。

文件系统主要是 inode 过多性能就好不到哪里去…
hankai17
2020-06-03 16:02:54 +08:00
不是服务外网 nginx + 小文件模块 足够了
yincrow
2020-06-03 16:07:24 +08:00
参考手机中微信的图片目录,文件 hash,切割 hash 值,分段创建层级目录
37Y37
2020-06-03 16:15:10 +08:00
对象存储很合适啊,类似于阿里的 OSS,网易的 NOS,七牛云之类的
sherwin008
2020-06-03 16:20:15 +08:00
adobe bridge 可以吗?我一个非计算机领域人的建议
matrix67
2020-06-03 16:22:01 +08:00
matrix67
2020-06-03 16:22:42 +08:00
@matrix67 #29 B 站生产就是用毛剑的 bfs 的。
cjq8z
2020-06-03 16:30:43 +08:00
windows server 系统有重复数据删除功能,能够解决你图片占用空间太多问题。再启用 ntfs 压缩功能,提高文件读取速度。
XiaoxiaoPu
2020-06-03 16:43:15 +08:00
楼上已经提到了 LevelDB,再加一个 RocksDB 吧,支持多线程访问,不支持多进程
tiedan
2020-06-03 17:26:34 +08:00
hdfs
ping2
2020-06-03 17:53:20 +08:00
其实看有多大了, 4K 大小的话, 直接放内存就好. 千万级也就是几十 GB 直接放内存 /dev/shm/ 就好.

成本其实还可以接受的.

落盘同步一下就好了. 根本不用开发, 性能超强, ... 唯一限制就是钱.

当然下一步是高性能 SSD, XFS 参数调一下其实也还可以接受的.

如果不接受这个成本, 还要追求性能, 建议是考虑 OSS, 内网调用的性能还可以的.

再追求更高的性价比才会需要考虑用专门的文件系统或者特定的数据库方案. 除非真的能省很多钱, 不然不建议. 装一台 64GB 的机器省也就是几千不超过一万. 真没有必要搞的太复杂. 专门的文件系统确实好, 但水也深.
stgmsa
2020-06-03 18:00:51 +08:00
负责千亿级图床源站的路过,每天源站流量大约 30 亿图片请求。存储是 cassandra,前面挡了一层 12TB 的 nginx file cache 。
但其实 hbase,甚至文件系统 都可以。
你要求的量级,可选更是多。

主要还是要看你有多大访问量(性能),存多久(存储扩展),有没有运维需求和 sla 要求(数据和服务可靠性)。
love
2020-06-03 18:44:38 +08:00
我几百万小图存在文件,感觉还行。之前用 ext4 空间没用完 inode 就耗尽了后来换了 inode 无限的 reiserfs 。
someonedeng
2020-06-03 18:48:31 +08:00
记得 b 站开源了个不错的 fs
akira
2020-06-03 19:09:15 +08:00
对象存储服务啊。。minio 试试看吧 最近在看这个
CODEWEA
2020-06-03 19:10:18 +08:00
数据库就不是 io 了? 而且数据库存储字节化的图片对 io 的操作只多不少。
ping2
2020-06-03 19:35:44 +08:00
@love ext4 inode 数量创建时可以设的, 默认的几百万文件就耗尽的话, 你可能只有 100GB 大小吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/678233

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX