“PostgreSQL支持压缩吗?”这是我们从客户里得到最多的问题,也很容易明白他们要为什么这么问。他们大部分都会生成和收集大量的日志和事件流数据,同时把它们用文本格式保存,如JSON或CSV。通常这些文件会接着用像gzip的工具压缩,压缩率有3x-4x也并不少见。这个问题其实是你牺牲这些存储来保存那些你一加载就存到不支持压缩数据库的数据。
不幸的是,这个问题并不能明确地用“是”或“不是”来回答。如果在某些满足PostgreSQL的存储层的条件下使用某些机制可明显地压缩可变长度类型,如常见的超大属性存储技术,或TOAST。问题是TOAST的压缩不会生效,除非行的大小超过了TOAST_TUPLE_THRESHOLD的值(在大部分系统设置为2KB),同时即使是在发生的时候TOAST智慧压缩包含在行里的可变长度类型。TOAST在满足它的既定目标上做得很好,这通过压缩一个行来让它适合PostgreSQL的8KB高速缓存页来避免行链接的开销和复杂性,但它不是通用的压缩目的的替代品。
在PostgreSQL数据库不支持通用压缩功能的情况下,我们想知道,是否可以利用文件系统的压缩功能,获得一些相同的裨益。在过去的十年中,已经有一些文件系统加入了透明的压缩功能。目前最成熟的选择是,Sun 公司最初设计的一个开源的文件系统 ZFS。除了压缩功能透明之外,内嵌的压缩功能还提供了几种压缩格式以供选择(gzip,LZJB 和 LZ4),ZFS 还支持一大堆其他强大的功能,包括软件RAID,虚拟存储池,快照,重复数据删除和加密。 ZFS 最大的局限性是它的 CDDL 许可证,导致它不能和Linux内核一起发行。最近,这种情况已显著改善,ZFS Linux 项目为许多主要的Linux发行版提供ZFS包。
在ZFS文件系统上运行CitusDB
为了验证我们的直觉:ZFS可以用来替换CitusDB数据库自身的压缩功能,我们决定测试运行在ZFS上的CitusDB性能和压缩功能,并且与默认使用ext3文件系统环境下的测试结果进行比较。
我们在两个使用c1.xlarge的实例的EC2上进行这个测试,并初始化安装为Ubuntu 12.04 LTS。我们在这两个节点上安装CitusDB2.0,然后以1:1管理者/工作者模式配置这两个节点。为了获得样本数据,我们从GithubArchive数据集提取了38GB的事件日志。我们使用了与GithubArchive项目里所提供的脚本相类似的脚本把样本数据从JSON格式转换为CSV格式,然后使用STAGE命令及GithubArchive模式把所得结果装载到CitusDB数据库。在装载操作完成以后,我们通过工作者节点的数据目录的大小来计算压缩率。
在被这些结果搞得我们晕头转向之前,我们需要量化压缩在性能方面的反作用。运行具有压缩功能的ZFS迫使文件系统在每次磁盘读写操作之上要做附加的工作。认为这对整体性能起到反作用是很有道理的,但我们真正需要回答的问题是是否这个性能的反作用是非常的巨大以致于它超过了获得的好处。 为了确定这个,我们设计了一个由七个查询语句组成的简单的基准测试,然后我们对前一步骤装载的38GB的数据集执行这个基准测试。注意到CitusDB工作者节点将并行处理表段是非常重要的,这隐含着我们也正在测试文件系统中或者内核中处理并发读请求的IO调度器。
当我们对这篇博客文章做背景研究的时候,我们也有机会研究ZFS与老的文件系统架构比如ext3之间除压缩之外的某些其他不同的特性。其中最大的一个不同是ZFS调度磁盘IO的方法。为了避免后续的请求对磁盘控制器请求队列的洪泛冲击,ZFS的磁盘调度使用了显式IO优先,IOP重新排序和时限调度。我们很想看看实际中这些技术是怎么良好运行的。为了明确这个问题,我们删除了旧的githubarchive表,并且装载新的拷贝,此时这个表被划分为23个表段而不是两个表段,每个查询所运行的总的目标数据量保持不变,不过现在CitusDB将把工作划分到23个进程上,而不是两个进程上。
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务