Heka 的参数配置跟Elasticsearch的参数没有关系,Heka只负责按照配置发送数据,所以索引的优化主要在 Elaticsearch端来完成。

下面是Elasticsearch的一些相关概念和知识点:

一些概念

在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以画一些简单的对比图来类比传统关系型数据库:

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

你可能已经注意到索引(index)这个词在Elasticsearch中有着不同的含义,所以有必要在此做一下区分:

索引(名词) 如上文所述,一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices 或indexes。
索引(动词) 「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像SQL中的INSERT关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档。
倒排索引 传统数据库为特定列增加一个索引,例如B-Tree索引来加速检索。Elasticsearch和Lucene使用一种叫做倒排索引(inverted index)的数据结构来达到相同目的。

参考: http://es.xiaoleilu.com/010_Intro/25_Tutorial_Indexing.html 

 

动态更新Lucene索引的流程

lucene的存储结构,如下图:

lucene 在存储它的全文索引结构时,是有层次结构的,这涉及到5个层次:索引(Index);段(Segment);文档(Document);域(Field);词(Term)

参考:
http://blog.csdn.net/ghj1976/article/details/5586329 

http://hushi55.github.io/2015/07/29/lucene-index-file-format/

有关segment的描述如下:

Lucene中索引总体上是这样进行,索引 现写到内存,触发一定限制条件后写入硬盘,生成一个独立的子索引-lucene中叫Segment。一般来说这些子索引需要合并成一个索引,也就是 optimize(),否则会影响检索速度,而且也可能导致open too many files。

 

下面内容来自: http://kibana.logstash.es/content/elasticsearch/principle/realtime.html

1、当前索引有 3 个 segment 可用。索引状态如下图:

2、新接收的数据进入内存 buffer。索引状态如下图:

3、内存 buffer 刷到磁盘,生成一个新的 segment,如下图:

4、commit 文件同步更新。索引状态如下图:

 

大家可能注意到了,前面一段内容,一直写的是"Lucene 索引"。这个区别在于,ES 为了完成分布式系统,对一些名词概念作了变动。索引成为了整个集群级别的命名,而在单个主机上的Lucene 索引,则被命名为分片(shard)。

这一步刷到文件系统缓存的步骤,在 ES 中,是默认设置为 1 秒间隔的,对于大多数应用来说,几乎就相当于是实时可搜索了。ES 也提供了单独的 /_refresh 接口,用户如果对 1 秒间隔还不满意的,可以主动调用该接口来保证搜索可见。

不过对于 ELK 索引日志的场景来说,恰恰相反,我们并不需要如此高的实时性,而是需要更快的写入性能。

 

在设置前

http://10.30.0.32:9200/nginx-2016.01.19/_settings

返回的数据没有 index.refresh_interval 的设置,这时候使用的是默认设置 1s

{
    "nginx-2016.01.19": {
        "settings": {
            "index": {
                "creation_date": "1453281866086",
                "number_of_shards": "5",
                "number_of_replicas": "1",
                "uuid": "VcmLVa7LQOyQB3ctMJ4Z9w",
                "version": {
                    "created": "2010199"
                }
            }
        }
    }
}

index.refresh_interval
How often to perform a refresh operation, which makes recent changes to the index visible to search. Defaults to 1s. Can be set to -1 to disable refresh.

设置,如果是导入历史数据的场合,先完全关闭掉是非常合适的。

curl -XPUT 'http://10.30.0.32:9200/nginx-2016.01.19/_settings' -d '
{
    "index" : {
        "refresh_interval" : -1
    }
}'

再次读取参数:

http://10.30.0.32:9200/nginx-2016.01.19/_settings

{
    "nginx-2016.01.19": {
        "settings": {
            "index": {
                "creation_date": "1453281866086",
                "refresh_interval": "-1",
                "number_of_shards": "5",
                "number_of_replicas": "1",
                "uuid": "VcmLVa7LQOyQB3ctMJ4Z9w",
                "version": {
                    "created": "2010199"
                }
            }
        }
    }
}

强制更新

http://10.30.0.32:9200/nginx-2016.01.19/_refresh

 

修复成默认值

curl -XPUT 'http://10.30.0.32:9200/nginx-2016.01.19/_settings' -d '
{
    "index" : {
        "refresh_interval" :"1s"  
    }
}'

参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-update-settings.html

 

优化前,同样的服务器配置, 一天可以导入 80多万行日志,优化完成后, 一天导入了600万行日志, 增加了7-8倍。

参考:

Elasticsearch Refresh Interval vs Indexing Performance
http://blog.sematext.com/2013/07/08/elasticsearch-refresh-interval-vs-indexing-performance/

http://stackoverflow.com/questions/17450084/setting-refresh-interval-in-elasticsearch-to-improve-io-wait

https://groups.google.com/forum/#!msg/elasticsearch/APbMvt9WFK4/vtl80jXo2xoJ

Heka–>Elasticsearch 索引数据过程的优化的更多相关文章

  1. elasticsearch 索引数据多了怎么办,如何调优,部署 ?

    面试官:想了解大数据量的运维能力. 解答:索引数据的规划,应在前期做好规划,正所谓"设计先行,编码在后", 这样才能有效的避免突如其来的数据激增导致集群处理能力不足引发的线上客户 ...

  2. elasticsearch 索引数据多了怎么办,如何调优,部署 ?

    解答:索引数据的规划,应在前期做好规划,正所谓"设计先行,编码在后", 这样才能有效的避免突如其来的数据激增导致集群处理能力不足引发的线上客户 检索或者其他业务受到影响. 如何调优 ...

  3. elasticsearch(lucene)索引数据过程

    倒排索引存储-分段存储(lucene的功能)在lucene中:lucene index包含了若干个segment在elasticsearch中:index包含了若干主从shard,shard包干了若干 ...

  4. java代码实现搜索elasticsearch索引数据

    1.关于获取客户端以及增删改操作请看上一篇文章,文章中有详细的讲解 2.本篇文章讲述关于elasticsearch搜索匹配方式,主要有 match.match_phrase.term.regexp.w ...

  5. 使用SQL语句查询Elasticsearch索引数据

    Elasticsearch 的官方查询语言是 Query DSL,存在毕竟有存在的道理,存在即合理.SQL 作为一个数据库查询语言,它语法简洁,书写方便而且大部分服务端程序员都清楚了解和熟知它的写法. ...

  6. elasticsearch 索引优化

    ES索引优化篇主要从两个方面解决问题,一是索引数据过程:二是检索过程.  索引数据过程我在上面几篇文章中有提到怎么创建索引和导入数据,但是大家可能会遇到索引数据比较慢的过程.其实明白索引的原理就可以有 ...

  7. 【分布式搜索引擎】Elasticsearch写入和读取数据过程

    一.Elasticsearch写人数据的过程 1)客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)2)coordinating node,对docum ...

  8. 第六篇 elasticsearch express 删除索引数据

    express 框架删除elasticsearch索引数据 1.在elasticsearch.js文件下添加 function deleteDocument(id) { return elasticC ...

  9. ES 18 - (底层原理) Elasticsearch写入索引数据的过程 以及优化写入过程

    目录 1 Lucene操作document的流程 1.1 添加document的流程 1.2 删除document的流程 2 优化写入流程 - 实现近实时搜索 2.1 流程的改进思路 2.2 设置re ...

随机推荐

  1. c#, 输出二进制

    int x=-17; string str= Convert.ToString(x,2);Debug.Log(str); 输出结果: 11111111111111111111111111101111 ...

  2. CSS之background属性

    css背景是个很有意思的东西,可设置 背景色:background-color 背景图:backgoround-image 背景图显示相对位置:background-position,正数图片往右下移 ...

  3. Storyboard 跳转 和 传值

    因为苹果推 Storyboard 而且 目前来看, Apple Watch 也是用 Storyboard 就知道, 明天应用估计都是 Storyboard 的天下了. (水平有限, 不对之处在所难免, ...

  4. nginx设置不使用缓存 add_header Cache-Control no-cache

    nginx设置不使用缓存 server { listen 443; #域名 server_name www.dev.163.com; #字符集 charset utf-8; ssl on; ssl_c ...

  5. 使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins)

    使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins) Note 这一章节的内容是基于 Scott Gonzalez 一篇博客 Building ...

  6. ASP.NET 4.0的ClientIDMode属性

    时光流逝,我们心爱的ASP.NET也步入了4.0的时代,微软在ASP.NET 4.0中对很多特性做了修改.比如我将要讨论的控件ID机制就是其中之一. 在ASP.NET 4.0之前我们总是要为控件的Cl ...

  7. mybatis——动态sql

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) ...

  8. PHP中使用CURL实现get和post请求(总结)

    一.什么是curl curl是利用url语法在命令行方式下工作的开源文件传输工具. 二.PHP curl函数

  9. 微软为Visual Studio开发助手拓展C++支持

    近日,微软宣布了一项 Visual Studio“开发助手”(Developer Assistant)插件的重大更新,其现已支持“基于 C++ 的情境感知 web 解决方案”.开发助手能够嵌入 Vis ...

  10. Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示的原因及解决办法

    某天,Android 启动模拟器是出现“Failed to allocate memory: 8”错误,模拟器无法启动,如下图: 原因:设置了不正确AVD显示屏模式,4.0版默认的模式为WVGA800 ...