Skip to content

Instantly share code, notes, and snippets.

@kehao95
Created June 29, 2018 05:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kehao95/155b7b2362e145c69b0fd20323cde812 to your computer and use it in GitHub Desktop.
Save kehao95/155b7b2362e145c69b0fd20323cde812 to your computer and use it in GitHub Desktop.
利用AWS spot instance创建离线数据仓库

背景

实际生产中,公司使用了CitusCloud作为生产数据库。但是维护高性能数据库同时若存储大量数据成本也会升高。 由于数据量非常庞大,我们数据线上保留策略为90天,每日将90天前的数据Dump到S3然后从库中删除。 但有的时候,客户想知道整个history中某个事件的历史,虽然数据库中已不存在这些记录,但客户就是上帝,我们需要想办法满足。

Why not Athena

AWS提供了Athena工具,就是为了解决海量离线数据的分析查询。 它的大致原理就是将S3中存储的结构化文本对象(例如datadump、CSV等)直接视作数据表,然后用户可以在Athena控制台直接执行SQL语句来查询数据。 收费则是按扫描量收费——($5 per TB of data scanned)虽然看起来不算贵,但实际使用中还是有不少弊端的:

  1. 语法兼容性 根据文档 "Athena supports a subset of DDL statements and ANSI SQL functions and operators." Athena语法仅为ANSI SQL standard的一个子集,不论是DataType还是Syntax可能都与实际生产所使用的不同。 例如我们使用的Citus(Postgresql)支持JSONB格式,我们的数据表设计以及产品逻辑大量依赖使用JSONB存储的数据。 然而导入到Athena中只能以String方式存储,查询更没法解决。

  2. 没有索引 对,Athena中没有索引!毕竟它是stateless的,使用时你只能简单定义DDL,所有的数据它是不会做任何处理的。 这一方面看似十分方便,你可以随心所欲写query不用考虑index,甚至用一堆LIKE都没有问题。 毕竟这些与最终的计价、性能没有一点点的关系,Athena只会单纯地将文件读入然后从头扫到尾…… 这就意味着最坏情况只是执行select * from foo where id='xxx'就可能需要扫描所有数据……

  3. 价格昂贵 ($5 per TB)

  4. 兼容性不足

毕竟这些与最终的计价、性能没有一点点的关系,Athena只会单纯地将文件读入然后从头扫到尾……

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment