首页 存档 技术 查看内容

【连载】一个简单算法帮助物联网、金融用户节约98%的数据存储成本

2018-3-30 13:00 |来自: 互联网 312 0

摘要: 来自PostgreSQL中国社区发起人之一,阿里数据库内核高级技术专家德歌在云栖社区个人博客的深度分享。 PostgreSQL简直是工业界和学术界的完美结合,怎么说呢?下面娓娓道来。 前段时间为大家分享了物联网行业分析以 ...

来自PostgreSQL中国社区发起人之一,阿里数据库内核高级技术专家德歌在云栖社区个人博客的深度分享。


PostgreSQL简直是工业界和学术界的完美结合,怎么说呢?下面娓娓道来。


前段时间为大家分享了物联网行业分析以及PostgreSQL 为物联网场景量身定制的特性介绍。(可参看今日微信推送第二篇文章)


今天再给大家分享一枚重磅炸弹,PostgreSQL 帮助物联网用户降低98%的存储成本。这是个什么概念呢?


举个例子,你原来要花100万买存储才能存下的数据,现在只需要花2万就能搞定。


下面我会给大家介绍一下是如何做到的。


在物联网和金融行业中,存在庞大的数据体量,以一个城市的电子眼为例,一个月存储的车牌信息就可能几百亿,一年可能达到几千亿甚至上万亿。这仅仅是物联网中某一项单一应用的数据量。


这么大的数据量,存入数据库会有多大呢?


我来模拟一些数据:


5个字段,随机生成一些数据,其中一个字符串,3个INT,1个时间类型。


digoal=# create table heap_test(c1 int, c2 text, c3 int, c4 int, c5 timestamp);digoal=#

insert into heap_test

select

random()*5000000,

repeat(md5(c::text),32),

c random()*50000000,

random()*1000000,

current_date (150000*random())::int

from

(select trunc(random()*100000) c from generate_series(1,50000000) t(id)) t;


并行执行10次,生成5亿数据。

传统的堆数据存储,5亿数据就达到500GB。


怎样能把500GB的数据压缩到5GB呢?


原理如下:

堆表行压缩

堆表块压缩

列存储原理

列存储块压缩

拿Greenplum来做一下验证,PostgreSQL的列存储可以外挂cstore, monetdb引擎。或者等阿里云AliCloudDB for PostgreSQL后期的版本开放这个功能。


使用列存储,开启压缩,可以将数据量压缩到 21GB。


digoal=# create table ao1_test(c1 int, c2 text, c3 int, c4 int, c5 timestamp) with (APPENDONLY=true,BLOCKSIZE=2097152,ORIENTATION=column,COMPRESSTYPE=zlib,CHECKSUM=false);digoal=# insert into ao1_test select * from heap_test ;digoal=# analyze ao1_test;ANALYZEdigoal=# select pg_size_pretty(pg_total_relation_size('ao1_test'));

pg_size_pretty

----------------21GB

(1 row)


压缩比达到了 这就完了吗?


显然还没,压缩比和数据存储关系是非常大的,为了进一步提升列存储的压缩比,我们必须找到一个非常合理的数据排序才能实现这一的目的。


为了达到这个目的,我们需要关注几个要素:

.1. 字段值的冗余度,冗余度越高的值,排序后的压缩比越高。

.2. 字段值的平均宽度,平均宽度大的值,压缩取得的绝对效果比宽度小的值好。

.3. 字段与字段间的线性相关性,线性关系好的字段,按其中一个A字段排序后线性关系也好,从而相关字段B的压缩效果也会比较好,从而达到双赢的目的。


以上三个要素都提到了统计学的知识, PostgreSQL数据库在这方面是非常强大的。


接下来会展示PostgreSQL利用窗口计算和统计分析,推算出最佳压缩比的字段排序组合。


第一个要素,字段值冗余度的计算方法:

case when n_distinct

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部