【IT168 评论】用于存储大数据的解决方案是当今面临的巨大技术挑战。当然,有很多不同的选择,如RDBMS,NoSQL,时间序列数据库等,本文分析了五个数据存储解决方案,这些方案是为不同目的而创建的,但所有方案都可用于保存基于时间的日志。
数据存储仅将事件保存到数据库是不够的,每个数据存储库都必须有一个接口以实时搜索,并具有良好的性能,每天至少能够存储40GB的数据,总数据大小至少约为20TB,搜索日志消息应该实时完成,搜索查询的响应时间小于10秒。
1.ClickHouse
主要特征:高可靠、跨数据中心复制、SQL支持、性能超过DBMS。
ClickHouse(以下简称CH)是一个开源的面向列的数据库管理系统,允许实时生成数据分析报告。由Yandex开发人员因内部目的而创建的,它已演变成一个开源工具。它目前支持Yandex.Metrica,这是世界第二大网络分析平台,拥有超过13万亿数据库记录,每天有超过200亿事件。CH可直接从非聚合数据即时生成自定义报告。
CH支持SQL语法,很容易使用。很多表引擎都是由CH提供的,我们将使用MergeTree。MergeTree引擎通过主键和日期支持索引,并可实时更新数据。MergeTree类型表必须有包含日期的单独列。日期列的类型必须为“Data”(而不是“DateTime”)。如果Event结构中没有这种类型,将需要额外添加。
CREATE TABLE语句如下所示:
在示例中,数据插入是一个非常频繁的操作,它可能每秒有上千请求。要提高性能,我们建议并行执行多个INSERT查询,性能将线性增加:
现在,让我们select一些数据:
注意:ClickHouse有一个Golang连接器。
此外,CH支持复制,这对于大量数据和日志管理是必要的。INSERT和ALTER查询可以发送到任何可用的服务器。数据插入到此服务器上,然后发送到其他服务器。由于它是异步的,因此最近插入的数据会在其他副本上出现一些延迟。如果副本不可用,则数据会在可用时写入。如果副本可用,则延迟是通过网络传输压缩数据块所花费的时间量。
2.PrestoDB
主要特征:连接器架构是Hadoop友好的、支持ANSI SQL、ODBC和JDBC支持、支持地图数据类型。
Presto是一个开源分布式SQL查询引擎,用于针对从千兆字节到PB级大小的数据源运行交互式分析查询。Presto交互式分析的速度接近商业数据仓库。Presto被社区的许多成员称为数据库。它默认提供不同的Apache Hive连接器,PrestoDB使用SQL语法。
CREATE TABLE语句如下所示:
PrestoDB可部署在不同机器上。节点属性文件etc/node.properties包含特定于每个节点的配置。节点是机器上单个已安装Presto实例。此文件通常在Presto首次安装时创建。INSERT和SELECT函数与ClickHouse或MySQL相同。此外,PrestoDB有一个由Facebook提供的Golang库。
3.InfluxDB
主要特征:支持每秒数十万次写入,以时间为中心的函数和易于使用的类SQL查询语言,数据可以被标记,查询灵活,支持多种高可用集群方案。
InfluxDB是一个由Go编写的开源数据库,专门用于处理具有高可用和高性能要求的时间序列数据。InfluxDB可以在几分钟内安装,无需外部依赖,具有灵活性和可扩展性,足以支持复杂部署。
全新安装的InfluxDB没有数据库(除了system _internal),因此创建数据库是第一个任务。可以使用CREATE DATABASE语句创建。
InfluxDB是一个时间序列数据库,InfluxDB中的所有数据都有列。时间存储显示与特定数据相关联的日期和时间(在RFC3339 UTC中)的时间戳。
InfluxDB使用点来写入数据。将多个点同时发布到多个系列,以这种批处理的方式提高性能。GO客户端具有发布点或批处理的功能:
4.Apache HBase
所有Apache HBase数据都可以进行简单的SQL查询。InfluxDB可以每秒处理数十万数据点。在一段时间内处理这么多数据可能会引起存储问题。自然的解决方案是对数据进行采样,仅在有限时间内保持高精度原始数据,并长时间或永远存储较低精度,汇总数据。
主要特征:近实时速度,Hadoop可扩展,可调复制,存储任何类型的数据。
Apache HBase是Hadoop数据库。它也是一个分布式,可扩展的大数据存储库。它存储日志非常方便,并可以实时读/写访问数据。该项目的目标是托管非常大的表——数十亿行、数百万列。
HBase使用与Bigtable相似的数据模型。用户将数据行存储在带标签的表中。数据行具有可排序和任意数量的列。该表是稀疏存储的,因此,如果用户喜欢,同一个表中的行可变化列。
以下是使用Golang客户端自动创建表格:
下面的代码将Mutate一行:
HBase提供了一种集群复制机制,允许使用源集群的预写日志(WAL)来更改,从而使一个集群的状态与另一个集群的状态保持同步。
5.Tarantool
注意:Tarantool是一个基于内存的数据库,但它真的很快并具有聚类功能,所以在云中,我们可以选择使用它作为临时日志的前端存储。
主要特征:ACID事务,异步主从复制和主主复制,服务器端脚本和存储过程。
Tarantool很容易安装。当用Tarantool存储数据时,至少有一个空间,每个空间都有唯一数字标识符,可以由用户指定,但它通常由Tarantool自动分配。空间始终包含一个元组集和至少一个索引。为了使元组集有用,空间中至少有一个索引。
Tarantool Go连接器允许将Lua代码发送到Tarantool,因此可自动创建空间和索引:
对于写入和查询数据,Tarantool具有插入/查询功能。有一个单独的线程--WAL writer捕获所有可更改数据库的请求,例如box.schema.create或box.space.insert。
结语
如果日志用于长期归档目的且不需要立即分析,则S3,AWS Glacier或磁带备份可能是合适的选项,因为它们以相对低的成本为大量数据提供服务。如果只需要存储几天或几个月的日志,那么存储在分布式存储系统(如HDFS,Cassandra,MongoDB或ElasticSearch)上最好。如果只需要保留几个小时用于实时分析,Redis也不错。
一些存储解决方案不适合实时甚至批处理分析。AWS Glacier或磁带备份可能需要几个小时才能加载文件。如果计划进行交互式数据分析,在ElasticSearch或HDFS中存储日志数据可以更有效地使用原始数据。有时,日志数据太大,只能在批处理框架中进行分析。在这种情况下,Apache Hadoop以及HDFS是很棒的推荐。