(一)数据库发展史
数据库自上个世纪60年代开始兴起以来,发展到今天已经有了80年的历史。在2020年的今天,数据库产品都有哪一些,他们的使用场景分别是什么,本文将从不同的纬度做简要的介绍。
数据库从使用场景,分为OLTP数据库和OLAP数据库。
而从数据存储结构,分为关系型数据库与非关系型数据库(NoSQL)的区别。
(二)关系型数据库与NoSQL区别
关系型数据库:指采用了关系模型来组织数据的数据库。
关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
非关系型数据库:指非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。
关系型数据库的优点:
1.容易理解:二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解2.使用方便:通用的SQL语言使得操作关系型数据库非常方便3.易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率。
关系型数据库事务必须具备ACID特性,ACID分别是Atomic原子性,Consistency一致性,Isolation隔离性,Durability持久性。
当今十大主流的关系型数据库
Oracle,Microsoft SQL Server,MySQL,PostgreSQL,DB2,Microsoft Access,SQLite,Teradata,MariaDB(MySQL的一个分支),SAP。
非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。
优点
1.用户可以根据需要去添加自己需要的字段,为了获取用户的不同信息,不像关系型数据库中,要对多表进行关联查询。仅需要根据id取出相应的value就可以完成查询。2.适用于SNS(Social Networking Services)中,例如facebook,微博。系统的升级,功能的增加,往往意味着数据结构巨大变动,这一点关系型数据库难以应付,需要新的结构化数据存储。由于不可能用一种数据结构化存储应付所有的新的需求,因此,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
不足:
只适合存储一些较为简单的数据,对于需要进行较复杂查询的数据,关系型数据库显的更为合适。不适合持久存储海量数据
非关系型数据库的分类
非关系型数据库都是针对某些特定的应用需求出现的,因此,对于该类应用,具有极高的性能。依据结构化方法以及应用场合的不同,主要分为以下几类:
面向高性能并发读写的key-value数据库:
key-value数据库的主要特点是具有极高的并发读写性能Key-value数据库是一种以键值对存储数据的一种数据库,类似Java中的map。可以将整个数据库理解为一个大的map,每个键都会对应一个唯一的值。主流代表为Redis,Amazon DynamoDB,Memcached,Microsoft Azure Cosmos DB和Hazelcast
面向海量数据访问的面向文档数据库:
这类数据库的主要特点是在海量的数据中可以快速的查询数据文档存储通常使用内部表示法,可以直接在应用程序中处理,主要是JSON。JSON文档也可以作为纯文本存储在键值存储或关系数据库系统中。主流代表为MongoDB,Amazon DynamoDB,Couchbase,Microsoft Azure Cosmos DB和CouchDB
面向搜索数据内容的搜索引擎:
搜索引擎是专门用于搜索数据内容的NoSQL数据库管理系统。主要是用于对海量数据进行近实时的处理和分析处理,可用于机器学习和数据挖掘。主流代表为Elasticsearch,Splunk,Solr,MarkLogic和Sphinx
面向可扩展性的分布式数据库:主流代表为Cassandra,HBase,Microsoft Azure Cosmos DB,Datastax Enterprise和Accumulo
NoSQL的基本需求就是支持分布式存储,严格一致性与可用性需要互相取舍CAP理论:一个分布式系统不可能同时满足C(一致性)、A(可用性)、P(分区容错性)三个基本需求,并且最多只能满足其中的两项。对于一个分布式系统来说,分区容错是基本需求,否则不能称之为分布式系统,因此需要在C和A之间寻求平衡C(Consistency)一致性一致性是指更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。与ACID的C完全不同A(Availability)可用性可用性是指服务一直可用,而且是正常响应时间。P(Partition tolerance)分区容错性分区容错性是指分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
关系型与非关系型数据库的比较
1.成本:Nosql数据库简单易部署,基本都是开源软件,不需要像使用Oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。2.查询速度:Nosql数据库将数据存储于缓存之中,而且不需要经过SQL层的解析,关系型数据库将数据存储在硬盘中,自然查询速度远不及Nosql数据库。3.存储数据的格式:Nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。4.扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。Nosql基于键值对,数据之间没有耦合性,所以非常容易水平扩展。5.持久存储:Nosql不使用于持久存储,海量数据的持久存储,还是需要关系型数据库6.数据一致性:非关系型数据库一般强调的是数据最终一致性,不像关系型数据库一样强调数据的强一致性,从非关系型数据库中读到的有可能还是处于一个中间态的数据,Nosql不提供对事务的处理。
最近的数据库排名
(三)NewSQL横空出世
从2000 年后,互联网应用如雨后春笋般出现,这些应用对各种资源的要求都远超传统的软件服务。互联网应用需要支持大量用户的并发访问,且对可用性要求极高,最好永远在线。在实践中,数据库开始成为互联网应用的瓶颈。许多厂商尝试纵向扩容,提高单机硬件性能,但这种方式换来的提升十分有限,表现出明显的边际收益递减。而且纵向扩容通常很不平滑,将数据从一台机器移动到另一台机器需要长时间下线服务,这对于互联网用户来说无法接受。为了解决这个问题,一些公司定制化开发中间件(middleware),将数据分片到多个普通单机 DBMS 上:
显然这违背了“应用程序逻辑与数据操作逻辑应该分离“ 的理念,将数据操作逻辑重新暴露给应用开发者。
在21 世纪 00 年代中,出现了许多数据仓库系统 (如 Vertica,Greeplum 和 Aster Data),这些以处理 OLAP 请求为设计目标的系统并不在本文定义的 NewSQL 范围内。
NewSQL 数据库设计针对的读写事务有以下特点:
1.耗时短
2.使用索引查询,涉及少量数据(非全表扫描或者大型分布式 Join)
3.重复度高,通常使用相同的查询语句和不同的查询参数
所有这些NewSQL数据库系统都是基于shared-nothing 的分布式架构,同时包含以下模块:
多节点并发控制(multi-node concurrency control)
多副本数据复制(replication)
流量控制(flow control)
分布式查询处理(distributed query processing)
常见的产品有Clustrix、MemSQL、TiDB,选择兼容 MySQL 的通信协议;又如 CockroachDB 选择兼容 PostgreSQL 通信协议。
想要了解Cockroachdb可以参考百度翻译的官方手册,版本比较久但不影响学习使用,后续文章我也会针对Cockroachdb展开来写一些内容。
(四)时序数据库产品
随着物联网的发展,时序数据库的需求越来越多,比如水文监控、工厂的设备监控、国家安全相关的数据监控、通讯监控、金融行业指标数据、传感器数据等。
时序数据有几个特点
1. 基本上都是插入,没有更新的需求。
2. 数据基本上都有时间属性,随着时间的推移不断产生新的数据,旧的数据不需要保存太久。
业务方对时序数据通常有几个查询需求
1. 获取最新状态,查询最近的数据(例如传感器最新的状态)
2. 展示区间统计,指定时间范围,查询统计信息,例如平均值,最大值,最小值,计数等。。。
3. 获取异常数据,根据指定条件,筛选异常数据
时序数据库应该具备的特点
1. 压缩能力
通常用得上时序数据库的业务,传感器产生的数据量都是非常庞大的,数据压缩可以降低存储成本。
2. 自动rotate
时序数据通常对历史数据的保留时间间隔是有规定的,例如一个线上时序数据业务,可能只需要保留最近1周的数据。
为了方便使用,时序数据库必须有数据自动rotate的能力。
3. 支持分片,水平扩展
因为涉及的传感器可能很多,单个节点可能比较容易成为瓶颈,所以时序数据库应该具备水平扩展的能力,例如分表应该支持水平分区。
4. 自动扩展分区,
业务对时序数据的查询,往往都会带上对时间区间进行过滤,因此时序数据通常在分区时,一定会有一个时间分区的概念。时序数据库务必能够支持自动扩展分区,减少用户的管理量,不需要人为的干预自动扩展分区。例如1月份月末,自动创建2月份的分区。
5. 插入性能
时序数据,插入是一个强需求。对于插入性能要求较高。
6. 分区可删除
分区可以被删除,例如保留1个月的数据,1个月以前的分区都可以删除掉。
7. 易用性(SQL接口)
SQL是目前最通用的数据库访问语言,如果时序数据库能支持SQL是最好的。
8. 类型丰富
物联网的终端各异,会有越来越多的非标准类型的支持需求。例如采集图像的传感器,数据库中至少要能够存取图像的特征值。而对于其他垂直行业也是如此,为了最大程度的诠释业务,必须要有精准的数据类型来支撑。
9. 索引接口
支持索引,毫无疑问是为了加速查询而引入的。
10. 高效分析能力
时序数据,除了单条的查询,更多的是报表分析或者其他的分析类需求。这对时序数据库的统计能力也是一个挑战。
11. 其他特色
11.1 支持丰富的数据类型,数组、范围类型、JSON类型、K-V类型、GIS类型、图类型等。满足更多的工业化需求,例如传感器的位置信息、传感器上传的数据值的范围,批量以数组或JSON的形式上传,传感器甚至可能上传图片特征值,便于图片的分析。(例如国家安全相关),轨迹数据的上层则带有GIS属性。
每个时序点结构如下:
timestamp: 数据点的时间,表示数据发生的时间。
metric: 指标名,当前数据的标识,有些系统中也称为name。
value: 值,数据的数值,一般为double类型,如cpu使用率,访问量等数值,有些系统一个数据点只能有一个value,多个value就是多条时间序列。有些系统可以有多个value值,用不同的key表示
目前市面上常见的时序数据库产品有:
TimescaleDB,一个基于传统关系型数据库postgresql改造的时间序列数据库。
InfluxDB是业界比较流行的一个时间序列数据库,特别是在IOT和监控领域十分常见。其使用go语言开发,突出特点是性能。
OpenTSDB运行在Hadoop和HBase上,其充分利用HBase的特性。通过独立的Time Series Demon(TSD)提供服务,所以它可以通过增减服务节点来轻松扩缩容。
Druid是一个实时在线分析系统(LOAP)。其架构融合了实时在线数据分析,全文检索系统和时间序列系统的特点,使其可以满足不同使用场景的数据存储需求。
Elasticsearch是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。
(五)列式数据库
列存储不同于传统的关系型数据库,其数据在表中是按行存储的,列方式所带来的重要好处之一就是,由于查询中的选择规则是通过列来定义的,因此整个数据库是自动索引化的。按列存储每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量,一个字段的数据聚集存储,那就更容易为这种聚集存储设计更好的压缩/解压算法。
主要产品有:
1、华为的Carbondata
2、百度研发给内部使用的palo。
3、腾讯Hermes
4、Druid:广告分析,互联网广告系统监控、度量和网络监控。开源免费。
5、俄罗斯的yandex公司为自己内部统计需要研发的clickhouse。yandex为俄罗斯的"百度"、"百度统计"业务。2016年6月份才开源发布出来。这个文档全,对php语言支持好。性能不弱于百度的palo。
(六)结束语
以上内容大部分从收集互联网上收集整理,后续本人会针对自己了解的MySQL、CockroachDB、InfluxDB、Clickhouse等使用过的产品详细写一些文章,刚兴趣的可以持续关注本号“道听真说”,谢谢!