es 存储key value es 存储过大数据_存储系统


我们知道,原始数据的数据量太大了,能存下来就很不容易了,这个数据是没法直接来给业务系统查询和分析的。有两个原因,

  • 一是数据量太大了
  • 二是也没有很好的数据结构和查询能力,来支持业务系统查询。

一般的做法是,用流计算或者是批计算,把原始数据再进行一次或者多次的过滤、汇聚和计算,把计算结果落到另外一个存储系统中去,由这个存储再给业务系统提供查询支持。这里的“流计算”,指的是 Flink、Storm 这类的实时计算,批计算是 Map-Reduce 或者 Spark 这类的非实时计算。

分析类系统应该如何选择存储?

择什么样的存储系统、使用什么样的数据结构来存储数据,直接决定了数据查询、聚合和分析的性能。

分析类系统对存储的需求一般是这样的:

  1. 一般用于分析的数据量都会比在线业务大出几个数量级,这需要存储系统能保存海量数据;
  2. 能在海量的数据上做快速的聚合、分析和查询。注意这里面所说的“快速”,前提是处理 GB、TB 甚至 PB 级别的海量数据,在这么大的数据量上做分析,几十秒甚至几分钟都算很快了,和在线业务要求的毫秒级速度是不一样的;
  3. 由于数据大多数情况下都是异步写入,对于写入性能和响应时延,一般要求不高;
  4. 分析类系统不直接支撑前端业务,所以也不要求高并发。

哪些可供选择的存储产品:

  • 如果你的系统的数据量在 GB 量级以下,MySQL 仍然是可以考虑的,因为它的查询能力足以应付大部分分析系统的业务需求。并且可以和在线业务系统合用一个数据库,不用做 ETL(数据抽取),省事儿并且实时性好。这里还是要提醒你,最好给分析系统配置单独的 MySQL 实例,避免影响线上业务。
  • 如果数据量级已经超过 MySQL 极限,可以选择一些列式数据库,比如:HBase、Cassandra、ClickHouse,这些产品对海量数据,都有非常好的查询性能,在正确使用的前提下,10GB 量级的数据查询基本上可以做到秒级返回。高性能的代价是功能上的缩水,这些数据库对数据的组织方式都有一些限制,查询方式上也没有 MySQL 那么灵活。大多都需要你非常了解这些产品的脾气秉性,按照预定的姿势使用,才能达到预期的性能。
  • Elasticsearch(ES),ES 本来是一个为了搜索而生的存储产品,但是也支持结构化数据的存储和查询。由于它的数据都存储在内存中,并且也支持类似于 Map-Reduce 方式的分布式并行查询,所以对海量结构化数据的查询性能也非常好。

转变思想:根据查询来选择存储系统存储系统没有银弹,不要指望简单地更换一种数据库,就可以解决数据量大,查询慢的问题。

在特定的场景下,通过一些优化方法,把查询性能提升几十倍甚至几百倍,这个都是有可能的。这里面有个很重要的思想就是,根据查询来选择存储系统和数据结构。

那用什么样的存储系统保存这些物流数据,才能满足这些查询需求呢?显然,任何一种存储系统,都满足不了这么多种查询需求。我们需要根据每一种需求,去专门选择合适的存储系统,定义适合的数据结构,各自解决各自的问题。而不是用一种数据结构,一个数据库去解决所有的问题。

  • 按照时间分片是对查询最友好的分片方式

总结

对于海量数据来说,选择存储系统没有银弹,重要的是转变思想,根据业务对数据的查询方式,反推数据应该使用什么存储系统、如何分片,以及如何组织。即使是同样一份数据,也要根据不同的查询需求,组织成不同的数据结构,存放在适合的存储系统中,才能在每一种业务中都达到理想的查询性能。