分布式对象存储原理架构Go实现之数据压缩

本章讨论的是在对象存储服务端实现数据压缩的功能。
在开始讨论数据压缩之前,我们不得不承认一个很尴尬的事实,那就是在整个云
存储系统中,对象存储服务端并不是最适合做数据压缩的地方。最适合做数据压缩的
地方是客户端。一个高性能的客户端不仅可以将大量小对象打包成大对象提高存储和
传输的效率,也可以在客户机本地进行数据压缩,进一步节省网络带宽和存储空间。
所以如果你的云存储系统在设计最初就包含了专门的客户端,那么别犹豫,一定要将
数据压缩功能放在客户端,而不是服务端。
数据压缩的效率和使用的压缩算法以及待压缩数据的特征密切相关,存放随机数
据的二进制文件的压缩比惨不忍睹,文本文件的压缩比会好很多。所以如果你的云存
储系统中没有一个专门的客户端,或者用户更倾向使用通用的客户端比如浏览器,且
用户上传的对象大多数都是一些适合数据压缩的文档,那么你可以考虑在服务端实现
数据压缩功能,将客户上传的对象压缩起来再进行存储。
可以应用数据压缩功能的不仅仅在数据存储这一块,数据的传输也一样可以进行
压缩。对于对象的上传来说,由于没有一个专门的客户端,我们没办法限定客户上传
的数据。但是对于对象的下载,服务端可以提供一种选择,只要客户端支持,我们的
接口服务就可以传输压缩后的数据给客户端。
l.8.1版本的Go语言原生支持的压缩算法包有bzip2、fate、gzip、lzw和zib这5种。
170·分布式对象存储一原理、架构及G0语言实现
lzw是Lempel–Ziv-Welch压缩算法的简写。这个算法的实现非常简单,甚至可以
实现在硬件上,以获得非常高的压缩速度。UNX下被广泛使用的文件压缩工具
compress使用的就是这个算法,GF图像格式使用的压缩算法也是它。
zlib是一个软件库,实现了RFC1950中介绍的压缩数据格式规范。它包括Linux、
Mac OS X以及iOS在内的很多平台的关键组件,PS4、WiU、Xbox One等游戏主机
也使用它。它是后续DEFLATE和gzp等压缩算法的一个抽象。
fate是RFC1951中介绍的DEFLATE压缩数据格式规范,也是zip文件使用的压
缩算法。它使用了LZ77算法移除重复的字符串,并用Huffman编码进一步压缩比特。
DEFLATE的产生是为了代替Izw以及其他受专利所限的数据压缩算法。
g妒是RFC1952中介绍的压缩数据格式规范,也是gz文件使用的压缩算法。它
基于DEFLATE算法,但是因为gZip可以将一个打包文件中的所有文件串联起来进行
压缩,所以可以获得比DEFLATE更高的压缩比。

小结

数据的压缩应该尽可能在客户端实现。只有在客户端不受我们控制且大多数对象的数据类型适合压缩的情况下,才建议在服务端实现数据压缩。随机数据不适合压缩,而文本数据则比较适合,用gzip压缩比大约能有2:1(我们在功能测试中达到夸张的1000:1压缩比是因为特意选择了内容全0的文件)。

本书使用的数据压缩算法是gzip,对压缩的速度和压缩比有需求的读者可自行选择合适的算法。

数据压缩可以用于节省存储空间。数据服务节点本地磁盘上的对象文件存储的是
压缩后的数据。数据在临时对象转正时压缩,并在对象读取时解压。

数据压缩还可以用于节省网络带宽。客户端可以在GET对象时设置Accept-Encoding请求头部告诉接口服务将对象的数据进行压缩。如果接口服务收到这样的请求,则需要设置Content-Encoding响应头部。

在下一章,我们将介绍对象存储服务常用的数据维护工作。

分布式对象存储原理架构Go实现之数据压缩

https://blog.jiejaitt.top/posts/592f28b4.html

作者

JIeJaitt

发布于

2022-03-07

更新于

2024-03-07

许可协议

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×