`
flylynne
  • 浏览: 380222 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MySQL、HBase、ES的特点和区别

 
阅读更多

MySQL:关系型数据库,主要面向OLTP,支持事务,支持二级索引,支持sql,支持主从、Group Replication架构模型(本文全部以Innodb为例,不涉及别的存储引擎)。

HBase:基于HDFS,支持海量数据读写(尤其是写),支持上亿行、上百万列的,面向列的分布式NoSql数据库。天然分布式,主从架构,不支持事务,不支持二级索引,不支持sql。

ElasticSearch:ES是一款分布式的全文检索框架,底层基于Lucene实现,虽然ES也提供存储,检索功能,但我一直不认为ES是一款数据库,但是随着ES功能越来越强大,与数据库的界限也越来越模糊。天然分布式,p2p架构,不支持事务,采用倒排索引提供全文检索。

 

ES是一个搜索引擎,是基于Lucene的。它是一个提供了基于RESTful 的web接口,能够达到实时,稳定,可靠,快速的搜索引擎。Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。Elasticsearch的性能是solr的50倍。

elasticsearch能做什么

Elasticsearch不仅仅是Lucene和全文搜索,其他特点还包括:

  • 分布式的实时文件存储,每个字段都被索引并可被搜索
  • 分布式的实时分析搜索引擎
  • 可以扩展到上百台服务器,处理PB级结构化或非结构化数据

而且,所有的这些功能被集成到一个服务里面,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。
总结一句话:ES是一个功能强大,使用简单的分布式的全文搜索引擎。

elasticsearch文档的概念

在Elasticsearch中,数据是以文档(document)形式存在的,归属于一种类型(type),而这些类型存在于索引(index)。和关系型数据库中的概念对比:

SQL database table row column
** elasticsearch** index type document field

 

HBase + ElasticSearch

需求分析

HBase的查询实现只提供两种方式:
1、按指定RowKey获取唯一一条记录,get方法(org.apache.hadoop.hbase.client.Get)
2、按指定的条件获取一批记录,scan方法(org.apache.hadoop.hbase.client.Scan)
用好HBase的第一步是要将rowkey设计好。大数据量查询最好从rowkey入手,ColumnValueFilter的速度是很慢的,HBase查询速度还是要依靠rowkey,所以根据业务逻辑把rowkey设计好,之后所有的查询都通过rowkey,是会非常快。 批量查询最好是用 scan的startkey endkey来做查询条件。
HBase在0.92之后引入了coprocessors,提供了一系列的钩子,让我们能够轻易实现访问控制和二级索引的特性。
当前平台内没有对HBase + ES的解决方案,需要给出一个能够指导用户使用HBase和ES组件的解决方案。
目前可能的需求场景如下:

批量索引:HBase上已有大量数据,需要在ES上建立索引;
增量索引:HBase上已有大量数据,提供HBase的rowkey,实现对ES的增量索引;
实时索引:HBase表持续进入数据,该表的数据要与ES的索引实时更新;

FI支持安全模式和普通模式,读取模式配置参数,安全模式则采用认证方式,普通模式则不需要认证。

 

对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正式因为如此,所以一个表最多只能有一个聚簇索引。

索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。

解决方案

HBase的工具HBase-SEP可以监测行变化事件
方案1:
如果是对写入数据性能要求高的业务场景,那么一份数据先写到HBase,然后再写到ES中,两个写入流程独立,这样可以达到性能最大

缺点:可能存在数据的不一致性。

方案2:
这也是目前网上比较流行的方案,使用HBase的协处理监听数据在HBase中的变动,实时的更新ES中的索引,
缺点:协处理器会影响HBase的性能

由于山不清楚添加协处理器具体思路是把RowKey作为索引文档的ID,并把要进行查询的Column索引到ES。
用户输入Column值作为搜索条件,通过ES查询到该Column对应的RowKey值,再根据RowKey到HBase中查询完整的数据。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics