NoSQL数据库概况梳理
NoSQL数据库概况梳理
目录
一、NoSQL概述
二、NoSQL数据库分类
三、NoSQL数据特点
四、NoSQL数据库适用场景
五、常用NoSQL数据库软件产品
1、Redis
2、HBase
3、MongoDb
4、Neo4J
5、Cassandra
6、Elasticsearch
7、Tokyo Cabinet
8、CouchDB
9、memcached
10、InfluxDB
11、TDengine
一、NoSQL数据库概述
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。
NoSQL最常见的解释是“non-relational”, “Not Only SQL”也被很多人接受。NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。NoSQL是一项全新的数据库革命性运动,其拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
NoSQL有如下优点:易扩展,NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间也在架构的层面上带来了可扩展的能力。大数据量,高性能,NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。
二、NoSQL数据库分类
1、键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果数据库管理员(DBA)只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort,Oracle BDB。
2、列存储数据库
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase,Riak.
3、文档型数据库
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值,在处理网页等复杂数据时,文档型数据库比传统键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。
4、图形(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J,InfoGrid, Infinite Graph。
不同分类特点对比
分类 | Examples举例 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
键值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDb | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
此外,时序数据库(Times Series,第5类)也可以算作NoSQL数据库,典型的产品如:InfluxDB、Prometheus及TDengine。
三、NoSQL数据特点
对于NoSQL数据库并没有一个明确的范围和定义,但是他们都普遍存在下面一些共同特征:
易扩展
NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间,在架构的层面上带来了可扩展的能力。 [2]
大数据量,高性能
NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache。NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说性能就要高很多。
灵活的数据模型
NoSQL无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是——个噩梦。这点在大数据量的Web 2.0时代尤其明显。
高可用
NoSQL在不太影响性能的情况,就可以方便地实现高可用的架构。比如Cassandra、HBase模型,通过复制模型也能实现高可用。
四、NoSQL数据库适用场景
NoSQL数据库在以下的这几种情况下比较适用:
1、数据模型比较简单;
2、需要灵活性更强的IT系统;
3、对数据库性能要求较高;
4、不需要高度的数据一致性;
5、对于给定key,比较容易映射复杂值的环境。
五、常用NoSQL数据库软件产品
1、Redis
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis 是一个内存型键值数据库,常用于需要快速响应的应用,如缓存、会话管理和排行榜。
发布日期/公司: 2009年,由 Salvatore Sanfilippo 开发
GitHub: https://github.com/redis/redis
官网: redis.io
适用场景: 实时数据处理、缓存
优点: 极快的读写速度,支持多种数据结构
缺点: 内存依赖性强,需适应大数据量的磁盘存储
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
redis的官网地址,非常好记,是redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地),Vmware在资助着redis项目的开发和维护。
从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
Redis的作者,叫Salvatore Sanfilippo,来自意大利的西西里岛,居住在卡塔尼亚。目前供职于Pivotal公司。他使用的网名是antirez。
2、HBase
HBase是一个分布式的、面向列的开源数据库。它主要用来存储非结构化和半结构化的松散数据,是基于列而非行进行数据存储的。HBase建立在HDFS之上,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务,可以通过Hive支持来实现多表join等复杂操作。它还可以横向扩展,增加廉价的商用服务器来提高HBase的计算和存储能力。
相较于传统的数据表,HBase中的数据表一般有这样一些特点:
(1)大表,一个表可以有上亿行,上百万列;
(2)面向列(族)的存储和权限控制,列(族)独立检索;
(3)稀疏表结构,对于为空(null)的列,并不占用存储空间。
HBase的数据表中的所有行都按照行键的字典序排列。在存储时,Table在行的方向上分割为多个HRegion。HRegion是按大小分割的,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,Hregion就会等分为两个新的HRegion。 当Table中的行不断增多,就会有越来越多的HRegion。
HRegion是HBase中分布式存储和负载均衡的最小单元,不同的HRegion可分布在不同的HRegion server上,但一个HRegion是不会拆分到多个Server上的。一个HRegion由一个或者多个Store组成,每个Store保存一个columns family。每个Strore又由一个MemStore和0~多个StoreFile组成。StoreFile以HFile格式保存在HDFS上。
HBase 是基于 Google Bigtable 构建的宽列存储数据库,擅长处理大规模数据流或传感器数据。
发布日期/公司: 2010年,由 Elastic N.V. 发布
GitHub: https://github.com/elastic/elasticsearch
官网: elastic.co
适用场景: 全文搜索、日志分析
优点: 搜索速度快,支持大规模数据集分析
缺点: 索引存储需求高,数据更新复杂
————————————————
3、MongoDb
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似Json的Bjson格式,因此可以存储比较复杂的数据类型。MongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,还支持为数据建立索引。它的特点是高性能、易部署、易使用、存储数据非常方便。
主要功能特性:
1)面向集合存储,易存储对象类型的数据。
“面向集合”( Collenction-oriented),意思是数据被分组,存储在数据集中,被称为一个集合。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库里的表,不同的是它不需要定义任何模式( Schema)。
2)模式自由。
模式自由,意味着对于存储在Mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。
MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品。MongoDB查询语言功能非常强大,可以实现类似关系数据库单表查询的绝大部分功能,同时支持数据索引。
对于数据查询:MongoDB支持动态查询,支持丰富的查询表达式。支持完全索引,可以在任意属性上建立索引,包含内部对象。MongoDB还提供创建基于地理空间索引的能力。MongoDB的查询优化器会分析表达式,并生成一个高效的查询计划,并且包含一个监视工具用于分析数据库操作的性能。
提供强大的聚合工具:如Count、Group等,支持使用MapReduce完成复杂的聚合任务。同时支持复制和故障恢复,MongoDB支持主从复制机制,可以实现数据备份、故障恢复、读扩展等功能。而基于副本集的复制机制提供了自动故障恢复的功能,确保了集群数据不会丢失。
对于数据存储:MongoDB采用高效的传统存储方式,文件存储格式为BSON(JSON的一种扩展)。BSON是对二进制格式的JSON的简称,BSON支持文档和数组的嵌套。支持二进制数据及大型对象。 同时,MongoDB采用自动分片功能,自动处理碎片,以支持云计算层次的扩展性,可动态添加额外的机器。MongoDB对数据进行分片可以使集群存储更多的数据,实现更大的负载,也能保证存储的负载均衡。
提供了多种语言的接口:支持Python、PHP、Ruby、Java、C、C#、Javascript、Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。开发人员使用任何一种主流开发语言都可以轻松编程,实现访问MongoDB数据库。
针对MongoDB的特点和提供的功能,MongoDB不适合处理传统的商业智能应用和那些要求高度事务性的系统以及复杂的跨文档(表)级联查询。
MongoDB非常适合在以下应用环境中使用:
(1)网站数据:MongoDB非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
(2)缓存:由于性能很高,MongoDB也适合作为信息基础设施的缓存层。在系统重启之后,由MongoDB搭建的持久化缓存层可以避免下层的数据源过载。
(3)大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候往往会选择传统的文件进行存储。
(4)高伸缩性的场景:MongoDB非常适合由数十或数百台服务器组成的数据库。MongoDB的路线图中已经包含对MapReduce引擎的内置支持。
(5)用于对象及JSON数据的存储:MongoDB的BSON数据格式非常适合文档化格式的存储及查询。
MongoDB 是最知名的文档存储数据库,支持 BSON 格式,具有无模式设计和水平扩展能力,常用于大规模非结构化数据的存储。
发布日期/公司: 2009年,由 MongoDB Inc. 发布
GitHub: https://github.com/mongodb/mongo
官网: mongodb.com
适用场景: 大数据分析、CMS、移动应用
优点: 灵活性高、支持水平扩展
缺点: 内存占用大,复杂查询性能欠佳
4、Neo4J
知识图谱是结构化的语义知识库,用于以符号形式描述物理世界中的概念及其相互关系,其基本组成单位是“实体-关系-实体”三元组,以及实体及其相关“属性-值”对,实体之间通过关系相互连接,构成网状的知识结构。
在知识图谱的数据层,知识以事实(Fact)为单位存储在图数据库。如果以“实体-关系-实体”或者“实体-属性-值”三元组作为事实的基本表达方式,则存储在图数据库中的所有数据将构成庞大的实体关系网络,形成知识的图谱。
Neo4j是一个将结构化数据存储在图(网络)而不是表中的NoSQL图数据库,它可以被看作是一个嵌入式的、基于磁盘的、具备完全事务特性的高性能Java持久化图引擎,该引擎具有成熟数据库的所有特性。
Neo4j重点解决了拥有大量连接的传统RDBMS在查询时出现的性能衰退问题。围绕图进行数据建模后,Neo4j会以相同的速度遍历节点与边,其遍历速度与构成图的数据规模没有关系。此外,Neo4j还提供了非常快的图算法、推荐系统和OLAP风格的分析。
遍历是图数据库数据检索的一个基本操作,也是图模型中所特有的操作。遍历的重要概念是其本身的局域化,遍历查询数据时仅使用必需的数据,而不是像关系数据库中使用join操作那样对所有的数据集实施代价昂贵的分组操作。
Neo4j在开始添加数据之前,不需要定义表和关系,一个节点可以具有任何属性,任何节点都可以与其他任何节点建立关系。Neo4j数据库中的数据模型隐含在它存储的数据中,而不是明确地将数据模型定义为数据库本身的一个部分,它是对存入数据的一个描述,而不是数据库的一系列方法来限制将要存储的内容。
Neo4j本身是用Java语言实现的,它也提供了Java API帮助用户来实现相关的数据库操作。同时Neo4j提供Cypher声明式图谱查询语言,用来可视化查询展示图谱里面的节点和关系。Cypher围绕图谱查询提供了可读性好和容易使用,功能强大的众多优点,并且是跨平台的,包括Java、Shell等其他所有平台。
Neo4j 专注于图形数据存储,支持复杂的节点和关系查询,非常适合社交网络和欺诈检测等复杂场景。
发布日期/公司: 2007年,由 Neo4j, Inc. 发布
GitHub: https://github.com/neo4j/neo4j
官网: neo4j.com
适用场景: 社交网络、实时推荐系统
优点: 图形查询能力强,支持 ACID事务
缺点: 大规模数据集的扩展性有限
介绍
Neo4j是一个嵌入式,基于磁盘的,支持完整事务的Java持久化引擎,它在图像中而不是表中存储数据。Neo4j提供了大规模可扩展性,在一台机器上可以处理数十亿节点/关系/属性的图像,可以扩展到多台机器并行运行。相对于关系数据库来说,图形数据库善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询——在关系数据库中,这些查询会导致大量的表连接,因此会产生性能上的问题。Neo4j重点解决了拥有大量连接的传统RDBMS在查询时出现的性能衰退问题。通过围绕图形进行数据建模,Neo4j会以相同的速度遍历节点与边,其遍历速度与构成图形的数据量没有任何关系。此外,Neo4j还提供了非常快的图形算法、推荐系统和OLAP风格的分析,而这一切在目前的RDBMS系统中都是无法实现的。
Neo是一个网络——面向网络的数据库——也就是说,它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络上而不是表中。网络(从数学角度叫做图)是一个灵活的数据结构,可以应用更加敏捷和快速的开发模式。
你可以把Neo看作是一个高性能的图引擎,该引擎具有成熟和健壮的数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
由于使用了“面向网络的数据库”,人们对Neo充满了好奇。在该模型中,以“节点空间”来表达领域数据——相对于传统的模型表、行和列来说,节点空间是很多节点、关系和属性(键值对)构成的网络。关系是第一级对象,可以由属性来注解,而属性则表明了节点交互的上下文。网络模型完美的匹配了本质上就是继承关系的问题域,例如语义Web应用。Neo的创建者发现继承和结构化数据并不适合传统的关系数据库模型:
1.对象关系的不匹配使得把面向对象的“圆的对象”挤到面向关系的“方的表”中是那么的困难和费劲,而这一切是可以避免的。
2.关系模型静态、刚性、不灵活的本质使得改变schemas以满足不断变化的业务需求是非常困难的。由于同样的原因,当开发小组想应用敏捷软件开发时,数据库经常拖后腿。
3.关系模型很不适合表达半结构化的数据——而业界的分析家和研究者都认为半结构化数据是信息管理中的下一个重头戏。
4.网络是一种非常高效的数据存储结构。人脑是一个巨大的网络,万维网也同样构造成网状,这些都不是巧合。关系模型可以表达面向网络的数据,但是在遍历网络并抽取信息的能力上关系模型是非常弱的。
虽然Neo是一个比较新的开源项目,但它已经在具有1亿多个节点、关系和属性的产品中得到了应用,并且能满足企业的健壮性和性能的需求:
完全支持JTA和JTS、2PC分布式ACID事务、可配置的隔离级别和大规模、可测试的事务恢复。这些不仅仅是口头上的承诺:Neo已经应用在高请求的24/7环境下超过3年了。它是成熟、健壮的,完全达到了部署的门槛。
特性
Neo4j是一个用Java实现、完全兼容ACID的图形数据库。数据以一种针对图形网络进行过优化的格式保存在磁盘上。Neo4j的内核是一种极快的图形引擎,具有数据库产品期望的所有特性,如恢复、两阶段提交、符合XA等。
Neo4j既可作为无需任何管理开销的内嵌数据库使用;也可以作为单独的服务器使用,在这种使用场景下,它提供了广泛使用的REST接口,能够方便地集成到基于PHP、.NET和JavaScript的环境里。但本文的重点主要在于讨论Neo4j的直接使用。
Neo4j的典型数据特征:
?数据结构不是必须的,甚至可以完全没有,这可以简化模式变更和延迟数据迁移。
?可以方便建模常见的复杂领域数据集,如CMS里的访问控制可被建模成细粒度的访问控制表,类对象数据库的用例、TripleStores以及其他例子。
?典型使用的领域如语义网和RDF、LinkedData、GIS、基因分析、社交网络数据建模、深度推荐算法以及其他领域。
围绕内核,Neo4j提供了一组可选的组件。其中有支持通过元模型构造图形结构、SAIL - 一种SparQL兼容的RDF TripleStore实现或一组公共图形算法的实现。
高性能?
要给出确切的性能基准数据很难,因为它们跟底层的硬件、使用的数据集和其他因素关联很大。自适应规模的Neo4j无需任何额外的工作便可以处理包含数十亿节点、关系和属性的图。它的读性能可以很轻松地实现每毫秒(大约每秒1-2百万遍历步骤)遍历2000关系,这完全是事务性的,每个线程都有热缓存。使用最短路径计算,Neo4j在处理包含数千个节点的小型图时,甚至比MySQL快1000倍,随着图规模的增加,差距也越来越大。
这其中的原因在于,在Neo4j里,图遍历执行的速度是常数,跟图的规模大小无关。不象在RDBMS里常见的联结操作那样,这里不涉及降低性能的集合操作。Neo4j以一种延迟风格遍历图 - 节点和关系只有在结果迭代器需要访问它们的时候才会被遍历并返回,对于大规模深度遍历而言,这极大地提高了性能。
写速度跟文件系统的查找时间和硬件有很大关系。Ext3文件系统和SSD磁盘是不错的组合,这会导致每秒大约100,000写事务操作。
官方网站
http://neo4j.org/
5、Cassandra
Cassandra 是高可用性、高可扩展性的分布式 NoSQL 数据库,支持时间序列数据和推荐引擎的管理。
发布日期/公司: 2008年,由 Facebook 开发
GitHub: https://github.com/apache/cassandra
官网: cassandra.apache.org
适用场景: 时间序列数据管理、物联网
优点: 高可用性、无单点故障
缺点: 配置复杂,写入延迟较高
介绍
Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynomite(分布式的Key-Value存储系统)更丰富,但支持度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库的。支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。)Cassandra最初由Facebook开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以Amazon专有的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模型。P2P去中心化的存储。很多方面都可以称之为Dynamo 2.0。
特性
和其他数据库比较,有几个突出特点:
模式灵活 :使用Cassandra,像文档存储,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。这是一个惊人的效率提升,特别是在大型部 署上。
真正的可扩展性 :Cassandra是纯粹意义上的水平扩展。为给集群添加更多容量,可以指向另一台电脑。你不必重启任何进程,改变应用查询,或手动迁移任何数据。
多数据中心识别 :你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。
一些使Cassandra提高竞争力的其他功能:
范围查询 :如果你不喜欢全部的键值查询,则可以设置键的范围来查询。
列表数据结构 :在混合模式可以将超级列添加到5维。对于每个用户的索引,这是非常方便的。
分布式写操作 :有可以在任何地方任何时间集中读或写任何数据。并且不会有任何单点失败。
官方网站
Apache Cassandra | Apache Cassandra Documentation
6、Elasticsearch
Elasticsearch 是一个强大的文档存储与搜索引擎,常用于全文检索、日志和事件数据分析等场景。
发布日期/公司: 2010年,由 Elastic N.V. 发布
GitHub: Elasticsearch GitHub
官网: elastic.co
适用场景: 全文搜索、日志分析
优点: 搜索速度快,支持大规模数据集分析
缺点: 索引存储需求高,数据更新复杂
7、Tokyo Cabinet
Tokyo Cabinet是一个Kay/Value型数据库,每个Key和Value的长度都可以不同,Kay和Value既可以是二进制数据,也可以是字符串,无数据表和数据类型的概念,记录是以哈希表、B+树和固定长度数组形式组织的。Tokyo Cabinet具有以下优点:
空间利用率高 – 数据文件尺寸更小;
执行效率高 – 更快的处理速度;
并发性能好 – 在多线程环境性能更好;
改善的可用性 – 简化的API;
改善的可靠性 – 即使在发生灾难的情况下,数据文件也不会损坏;
支持64位架构 – 支持海量的存储空间和巨型数据库文件。
Tokyo Cabinet是用C语言编写的,为C,Perl,Ruby,Java和Lua提供了API。
8、CouchDB
CouchDB是一个开源的面向文档的数据库管理系统,可以通过 RESTful JavaScript Object Notation (JSON) API 访问。术语 “Couch” 是 “Cluster Of Unreliable Commodity Hardware” 的首字母缩写,它反映了 CouchDB 的目标具有高度可伸缩性,提供了高可用性和高可靠性,即使运行在容易出现故障的硬件上也是如此。CouchDB 最初是用 C++ 编写的,但在 2008 年 4 月,这个项目转移到 Erlang OTP 平台进行容错测试
CouchDB是用Erlang开发的面向文档的数据库系统,2010年7月14日发布了1.0版本。CouchDB不是一个传统的关系数据库,而是面向文档的数据库,其数据存储方式有点类似lucene的index文件格式,CouchDB最大的意义在于它是一个面向web应用的新一代存储系统,事实上,CouchDB的口号就是:下一代的Web应用存储系统。
CouchDB 可以安装在大部分POSIX 系统上,包括 Linux? 和 Mac OS X。Version 2.2.0开始正式支持Windows (x64)。CouchDB 可以从源文件安装,也可以使用包管理器安装(比如在 Mac OS X 上使用 MacPorts)。
CouchDB 是一个顶级Apache Software Foundation 开源项目,根据 Apache 许可 V2.0 发布。这个开源许可允许在其他软件中使用这些源代码,并根据需要进行修改,但前提是遵从版权需知和免责声明。与许多其他开源许可一样,这个许可允许用户根据需求使用、修改和分发该软件。不一定由同一个许可包含所有修改,因为我们仅维护一个 Apache 代码使用许可需知。
数据特点
1)、CouchDB是分布式的数据库,他可以把存储系统分布到n台物理的节点上面,并且很好的协调和同步节点之间的数据读写一致性。这当然也得靠Erlang无与伦比的并发特性才能做到。对于基于web的大规模应用文档应用,分布式可以让它不必像传统的关系数据库那样分库拆表,在应用代码层进行大量的改动。
2)、CouchDB是面向文档的数据库,存储半结构化的数据,比较类似lucene的index结构,特别适合存储文档,因此很适合CMS,电话本,地址本等应用,在这些应用场合,文档数据库要比关系数据库更加方便,性能更好。
3)、CouchDB支持REST API,可以让用户使用JavaScript来操作CouchDB数据库,也可以用JavaScript编写查询语句,我们可以想像一下,用AJAX技术结合CouchDB开发出来的CMS系统会是多么的简单和方便。
其实CouchDB只是Erlang应用的冰山一角,在最近几年,基于Erlang的应用也得到的蓬勃的发展,特别是在基于web的大规模,分布式应用领域,几乎都是Erlang的优势项目。
工作原理
CouchDB 构建在强大的 B-树储存引擎之上。这种引擎负责对 CouchDB 中的数据进行排序,并提供一种能够在对数均摊时间内执行搜索、插入和删除操作的机制。CouchDB 将这个引擎用于所有内部数据、文档和视图。
因为 CouchDB 数据库的结构独立于模式,所以它依赖于使用视图创建文档之间的任意关系,以及提供聚合和报告特性。使用 Map/Reduce 计算这些视图的结果,Map/Reduce 是一种使用分布式计算来处理和生成大型数据集的模型。Map/Reduce 模型由 Google 引入,可分为 Map 和 Reduce 两个步骤。在Map 步骤中,由主节点接收文档并将问题划分为多个子问题。然后将这些子问题发布给工作节点,由它处理后再将结果返回给主节点。在 Reduce 步骤,主节点接收来自工作节点的结果并合并它们,以获得能够解决最初问题的总体结果和答案。
CouchDB 中的Map/Reduce 特性生成键/值对,CouchDB 将它们插入到 B-树引擎中并根据它们的键进行排序。这就能通过键进行高效查找,并且提高 B-树中的操作的性能。此外,这还意味着可以在多个节点上对数据进行分区,而不需要单独查询每个节点。
传统的关系数据库管理系统有时使用锁来管理并发性,从而防止其他客户机访问某个客户机正在更新的数据。这就防止多个客户机同时更改相同的数据,但对于多个客户机同时使用一个系统的情况,数据库在确定哪个客户机应该接收锁并维护锁队列的次序时会遇到困难,这很常见。在 CouchDB 中没有锁机制,它使用的是多版本并发性控制(Multiversion concurrency controlMVCC)— 它向每个客户机提供数据库的最新版本的快照。这意味着在提交事务之前,其他用户不能看到更改。许多现代数据库开始从锁机制前移到 MVCC,包括 Oracle(V7 之后)和 Microsoft? SQL Server 2005 及更新版本。
9、memcached
memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但被许多网站使用。这是一套开放源代码软件,以BSD license授权发布。
memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。
memcached的API使用三十二比特的循环冗余校验(CRC-32)计算键值后,将数据分散在不同的机器上。当表格满了以后,接下来新增的数据会以LRU机制替换掉。由于memcached通常只是当作缓存系统使用,所以使用memcached的应用程序在写回较慢的系统时(像是后端的数据库)需要额外的代码更新memcached内的数据。
memcached是一套分布式的快取系统,与redis相似,当初是Danga Interactive为了LiveJournal所发展的,但被许多软件(如MediaWiki)所使用。这是一套开放源代码软件,以BSD license授权协议发布。
memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。
memcached的API使用32位元的循环冗余校验(CRC-32)计算键值后,将资料分散在不同的机器上。当表格满了以后,接下来新增的资料会以LRU机制替换掉。由于memcached通常只是当作快取系统使用,所以使用memcached的应用程式在写回较慢的系统时(像是后端的数据库)需要额外的程式码更新memcached内的资料
memcached 是以LiveJournal旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。
这时就该memcached大显身手了。memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
Memcached 的守护进程(daemon)是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目);当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。
Memcached由Danga Interactive开发,其最新版本发布于2010年,作者为Anatoly Vorobey和Brad Fitzpatrick。用于提升LiveJournal . com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。
事件处理
libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。关于事件处理这里就不再详细介绍,可以参考Dan Kegel的The C10K Problem。
存储方式
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
通信分布式
memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。本文也将介绍memcached的分布式。
10、InfluxDB
InfluxDB是一个时间序列数据库,用于处理海量写入与负载查询。InfluxDB旨在用作涉及大量时间戳数据的任何用例(包括DevOps监控,应用程序指标,物联网传感器数据和实时分析)的后端存储。
特点
- 为时间序列数据专门编写的自定义高性能数据存储。 TSM引擎具有高性能的写入和数据压缩
- Golang编写,没有其它的依赖
- 提供简单、高性能的写入、查询 http api
- 插件支持其它数据写入协议,例如 graphite、collectd、OpenTSDB
- 支持类sql查询语句
- tags可以索引序列化,提供快速有效的查询
- Retention policies自动处理过期数据
- Continuous queries自动聚合,提高查询效率
设计理念
- 同一时间点多次写入同样的数据被认为是重复写入
- 极少出现删除数据的情况,删除数据基本都是清理过期数据
- 极少更新已有数据且不会出现有争议的更新,时间序列数据总是新数据
- 绝大多数写入是针对最新时间戳的数据,并且数据按时间升序添加
- 数据的规模会非常大,必须能够处理大量的读写操作
- 能够写入和查询数据会比强一致性更重要
- 很多time series非常短暂的存在,所以time series 数量比较大
- 没有哪个point是过于重要的
11、TDengine
TDengine是一款开源、云原生的时序数据库,专为物联网、工业互联网、金融、IT 运维监控等场景设计并优化。它能让大量设备、数据采集器每天产生的高达 TB 甚至 PB 级的数据得到高效实时的处理,对业务的运行状态进行实时的监测、预警,从大数据中挖掘出商业价值。
TDengine 社区版是一开源版本,采用的是 AGPL 许可证,它具备高效处理时序数据所需要的所有功能,包括:
SQL 写入、无模式写入和通过第三方工具写入
S标准 SQL 查询、时序数据特色查询以及自定义函数(UDF)
S缓存每个时间序列的最新数据
S连续查询以及事件驱动流计算
S类 Kafka 数据订阅,加以过滤功能
S与 Grafana、Google Data Studio 可视化工具的无缝集成
S集群、高可用、高可靠
S主流编程语言的连接器
S命令行以及监控、数据导出、数据导入等多种工具
TDengine 提供了丰富的应用程序开发接口,为了便于用户快速开发自己的应用,TDengine 支持了多种编程语言的连接器,其中官方连接器包括支持 C/C++、Java、Python、Go、Node.js、C# 和 Rust 的连接器。这些连接器支持使用原生接口(taosc)和 REST 接口(部分语言暂不支持)连接 TDengine 集群。社区开发者也贡献了多个非官方连接器,例如 ADO.NET 连接器、Lua 连接器和 PHP 连接器。
taospy 是 TDengine 的官方 Python 连接器。taospy 提供了丰富的 API, 使得 Python 应用可以很方便地使用 TDengine。taospy 对TDengine 的原生接口和 REST 接口都进行了封装, 分别对应 taospy 包的 taos 模块 和taosrest 模块。 除了对原生接口和 REST 接口的封装,taospy 还提供了符合 Python 数据访问规范(PEP 249) 的编程接口。这使得 taospy 和很多第三方工具集成变得简单,比如 SQLAlchemy 和 pandas。
?