找到问题的解决办法了么?

filebeat直接传数据到es,在es中加pipeline过滤某些字段,运行报错??

Aruen 回复了问题 • 3 人关注 • 3 个回复 • 5080 次浏览 • 2019-02-25 10:03 • 来自相关话题

创建索引有哪些建议

rochy 回复了问题 • 3 人关注 • 1 个回复 • 1226 次浏览 • 2019-02-24 09:56 • 来自相关话题

ES从1.5升级到6.3版本后性能反而降低很多

rochy 回复了问题 • 2 人关注 • 1 个回复 • 1666 次浏览 • 2019-02-23 18:48 • 来自相关话题

elasticsearch不能删除已有index中的字段吧?

rochy 回复了问题 • 4 人关注 • 2 个回复 • 6455 次浏览 • 2019-02-23 18:44 • 来自相关话题

es统计相关问题

cl1321 回复了问题 • 5 人关注 • 3 个回复 • 1689 次浏览 • 2019-02-22 17:01 • 来自相关话题

ELK 使用小技巧(第 5 期)

rochy 发表了文章 • 0 个评论 • 5449 次浏览 • 2019-02-22 12:24 • 来自相关话题

ELK Tips 主要介绍一些 ELK 使用过程中的小技巧,内容主要来源为 Elastic 中文社区。

一、Logstash

1、Logstash 性能调优主要参数

  • pipeline.workers:设置启动多少个线程执行 fliter 和 output;当 input 的内容出现堆积而 CPU 使用率还比较充足时,可以考虑增加该参数的大小;
  • pipeline.batch.size:设置单个工作线程在执行过滤器和输出之前收集的最大事件数,较大的批量大小通常更高效,但会增加内存开销。输出插件会将每个批处理作为一个输出单元。;例如,ES 输出会为收到的每个批次发出批量请求;调整 pipeline.batch.size 可调整发送到 ES 的批量请求(Bulk)的大小;
  • pipeline.batch.delay:设置 Logstash 管道的延迟时间, 管道批处理延迟是 Logstash 在当前管道工作线程中接收事件后等待新消息的最长时间(以毫秒为单位);简单来说,当 pipeline.batch.size 不满足时,会等待 pipeline.batch.delay 设置的时间,超时后便开始执行 filter 和 output 操作。

    2、'reader' unacceptable character ' ' (0x0)

    logstash 执行使用 Jdbc input plugin 后报错:
    <br /> [main]-pipeline-manager] ERROR logstash.agent - Pipeline aborted due to error {<br /> :exception=>#<Psych::SyntaxError: (): 'reader' unacceptable character ' ' (0x0) special characters are not allowed in "'reader'", <br /> position 0 at line 0 column 0>, :backtrace=>["org/jruby/ext/psych/PsychParser.java:232:in parse'"<br />

    解决方案:删除 $USER_HOME/.logstash_jdbc_last_run 文件即可。

    二、Elasticsearch

    1、TermsQuery 与多个 TermQuery 的区别

    当 terms 的个数较少的时候,TermsQuery 等效为 ConstantScoreQuery 内部包含多个 TermQuery:
    <br /> Query q1 = new TermInSetQuery(new Term("field", "foo"), new Term("field", "bar"));<br /> // 等效为下面的语句<br /> BooleanQuery bq = new BooleanQuery();<br /> bq.add(new TermQuery(new Term("field", "foo")), Occur.SHOULD);<br /> bq.add(new TermQuery(new Term("field", "bar")), Occur.SHOULD);<br /> Query q2 = new ConstantScoreQuery(bq);<br />

    当 terms 较多的时候,它将使用匹配的文档组合成一个位集,并在该位集上进行评分;此时查询效率比普通的 Bool 合并要更加高效。

    当 terms 的个数较多时,TermsQuery 比多个 TermQuery 组合的查询效率更高。

    2、ES 借助 nginx 配置域名

    <br /> upstream /data/ {<br /> server 192.168.187.xxx:9200;<br /> keepalive 300 ;<br /> }<br /> <br /> server {<br /> listen 80;<br /> server_name testelk.xx.com;<br /> keepalive_timeout 120s 120s;<br /> location /data {<br /> proxy_pass <a href="http://data/;" rel="nofollow" target="_blank">http://data/;</a><br /> proxy_http_version 1.1;<br /> proxy_set_header Connection "Keep-Alive";<br /> proxy_set_header Proxy-Connection "Keep-Alive";<br /> proxy_set_header X-Real-IP $remote_addr;<br /> proxy_pass_header remote_user <br /> proxy_set_header X-Forwarded-For $remote_addr;<br /> proxy_set_header Host $http_host;<br /> proxy_set_header X-Nginx-Proxy true;<br /> }<br /> }<br />

    3、ES Reindex 时如何不停止写入服务

    方案一:kennywu76

    ES 的 reindex 在索引有实时的 update/delete 的情况下,即使借助 alias,也没有办法实现真正的 zero down time。

    增加新文档比较好办,通过 alias 切换写入到新索引,同时 reindex 做旧->新索引的数据传输即可;但是 update/delete 操作针对的文档如果还未从旧索引传输过来,直接对新索引操作会导致两个索引数据不一致。

    我能够想到的(一个未经实际验证)的方案,前提是数据库里的文档有一个类似 last_update_time 字段记录文档最后更新的时间,用作写入 ES 文档的版本号,然后数据写入新索引的时候,url 里带上下面这样的参数:version_type=external_gt&version=xxxxxx

    其中 version_type=external_gt 表示写入文档的版本号大于已有的文档版本号,或者文档不存在,写入才会成功,否则会抛版本冲突的异常。另外 delete 操作都要转换成 index 操作,index 的内容可以是一个空文档

    这样实时数据写入新索引和 reindex 可以同时进行,实时写入的数据应该具有更高的版本,总是能够成功,reindex 如果遇到版本冲突,说明该文档被实时部分更新过了,已经过时,可以直接放弃跳过。

    该方案的缺陷:

  • 要求数据源里的数据具有版本信息,可能因为各种局限,不太容易更改;
  • delete 操作必须转化为写入一个空文档,delete 实际上是一个标记文档,并且本身也有版本信息。但是如果后端发生了 segment merge,delete 可能会被合并以后物理清除。这样 delete 和对应的版本信息丢失,之后 reindex 如果写入了旧版本的文档,仍然会有一致性问题;但是空文档会增加索引文件的大小,有额外的消耗,一个可能的缓解办法是在 reindex 全部做完以后,再做一次空文档的删除。

    改进方案:the_best

    重建索引步骤如下:

    1. 保证 delete 操作都要转换成 index 操作,index 的内容可以是一个空文档;
    2. 对老索引 old_index(业务上的别名还是挂在老索引上)进行重索引操作(version_type=external);
      <br /> curl -X POST 'http://<hostname>:9200/_reindex'<br /> {<br /> "conflicts": "proceed",<br /> "source": {<br /> "index": "old_index",<br /> "size": 1000<br /> },<br /> "dest": {<br /> "index": "new_index",<br /> "version_type": "external"<br /> }<br /> }<br />
    3. 将别名切到 newIndex;
    4. 将重索引时间段内 old_index 产生的热数据,再捞一次到 new_index 中(conflicts=proceed&version_type=external);
      <br /> curl -X POST /_reindex<br /> {<br /> "conflicts": "proceed",<br /> "source": {<br /> "index": "old_index"<br /> "query": {<br /> "constant_score" : {<br /> "filter" : {<br /> "range" : {<br /> "data_update_time" : {<br /> "gte" : <reindex开始时刻前的毫秒时间戳><br /> }<br /> }<br /> }<br /> }<br /> }<br /> },<br /> "dest": {<br /> "index": "new_index",<br /> "version_type": "external"<br /> }<br /> }<br />
    5. 手动做一次空文档的删除。

      这种方式取决于重索引期间产生的数据量大小(会影响步骤4的用时),不过我们可以视具体业务情况灵活操作。比如说数据量比较大重索引我们用了10个小时(这10个小时内新产生了200多万的数据),在切别名前,我们可以按步骤(4)的调用方式,把近10个小时的数据再捞一遍到新索引中,如此迭代个几次,直到别名切完后,我们能保证最后一次的步骤(4)可以在较短时间内完成。

      4、ES 节点通讯配置

      <br /> http.port: 9200<br /> http.bind_host: 127.0.0.1<br /> transport.tcp.port: 9300<br /> transport.bind_host: 127.0.0.1<br />

      5、把 Lucene 的原生 query 传给 ES

      <br /> SearchRequest searchRequest = new SearchRequest(indexName);<br /> searchRequest.types(typeName);<br /> SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();<br /> sourceBuilder.from(0);<br /> sourceBuilder.size(10);<br /> sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));<br /> <br /> //q为Lucene检索表达式, 直接输入关键词匹配_all或者*字段, 字段匹配user:kimchy, <br /> //多字段匹配user:kimchy AND message:Elasticsearch<br /> QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery(q); <br /> sourceBuilder.query(queryStringQueryBuilder);<br /> searchRequest.source(sourceBuilder);<br /> SearchResponse searchResponse = restHighLevelClient.search(searchRequest);<br /> SearchHits searchHits = searchResponse.getHits();<br />


      6、ES 文档字段个数限制

      ES 文档默认不允许文档字段超过 1000,超过 1000 会报如下错误:
      <br /> failed to put mappings on indices [[[nfvoemspm/srjL3cMMRUqa7DgOrYqX-A]]], type [log]<br /> java.lang.IllegalArgumentException: Limit of total fields [1000] in index [xxx] has been exceeded<br />

      可以通过修改索引配置来修改字段个数限制,不过还是推荐从业务上进行优化:
      <br /> 修改settings<br /> {<br /> "index.mapping.total_fields.limit": 2000<br /> }<br />

      7、将 DSL 字符串转换为 QueryBuilder

      ```

      wrapper 案例

      GET /_search
      {
      "query" : {
      "wrapper": {
      "query" : "eyJ0ZXJtIiA6IHsgInVzZXIiIDogIktpbWNoeSIgfX0="
      }
      }
      }

      RestClient

      QueryBuilders.wrapperQuery("{\"term\": {\"field\":\"value\"}}")
      ```

      8、ES 集群重启后 Slice Scroll 速度变慢

      重启机器之后,pagecache 都没有了,所有数据都要重新从磁盘加载。

      9、ES 开启索引新建删除日志

      <br /> PUT _cluster/settings<br /> {<br /> "persistent": {<br /> "logger.cluster.service": "DEBUG"<br /> }<br /> }<br />

      10、慢日志全局级别设定

    6. 对已经存在的索引可以通过 PUT _settings 做存量设置
    7. 对之后新增的索引,可以使用类似于下面的template
      <br /> PUT _template/global-slowlog_template<br /> {<br /> "order": -1,<br /> "version": 0,<br /> "template": "*",<br /> "settings": {<br /> "index.indexing.slowlog.threshold.index.debug" : "10ms",<br /> "index.indexing.slowlog.threshold.index.info" : "50ms",<br /> "index.indexing.slowlog.threshold.index.warn" : "100ms",<br /> "index.search.slowlog.threshold.fetch.debug" : "100ms",<br /> "index.search.slowlog.threshold.fetch.info" : "200ms",<br /> "index.search.slowlog.threshold.fetch.warn" : "500ms",<br /> "index.search.slowlog.threshold.query.debug" : "100ms",<br /> "index.search.slowlog.threshold.query.info" : "200ms",<br /> "index.search.slowlog.threshold.query.warn" : "1s"<br /> }<br /> }<br />

      11、TCP 设置多个端口的用途

      transport.tcp.port 这个参数不写,默认为 9300-9399,开放那么多 端口有用么?

  • 如果设置一个端口,假设这个端口占用了程序就无法正常启动;
  • 如果设置多个端口,一个端口占用会寻找下一个端口,直至找到可用端口。

    12、ES 临时重启,设置分片延迟分配策略

    <br /> PUT _all/_settings<br /> {<br /> "settings": {<br /> "index.unassigned.node_left.delayed_timeout": "5m"<br /> }<br /> }<br />

    三、Kibana

    1、kibana 图表自定义标注

    可以用 TSVB,支持标注。

    Kibana TSVB 注解的使用:https://elasticsearch.cn/article/701

    2、Kibana discover 导出 csv 文件

    请参考文章:[如何快速把 Kibana Discover 页的 Document Table 导出成 CSV](https://elasticsearch.cn//article/35)

    3、修改 kibana 的默认主页

    https://elasticsearch.cn/article/6335

    四、社区文章精选

  • [Elasticsearch 6.6 Index Lifecycle Management 尝鲜](https://mp.weixin.qq.com/s/Xj8J7FEO-TpOdE0fjirrOw)
  • [Hive 与 ElasticSearch 的数据交互](https://mp.weixin.qq.com/s/HR2lCtlcKpDQYmVDnZpeug)

    ---
    Any Code,Code Any!

    扫码关注『AnyCode』,编程路上,一起前行。

    ![](http://img.luooqi.com/FoE5jYLo6p4UVmGN8GPjCZz8Xete)

ElasticSearch pinyin搜索出来的中文不能高亮

回复

tenyears 发起了问题 • 3 人关注 • 0 个回复 • 2105 次浏览 • 2019-02-22 12:00 • 来自相关话题

es中,nested类型同字段2组不同的键值对查询问题

cl1321 回复了问题 • 3 人关注 • 2 个回复 • 5018 次浏览 • 2019-02-22 09:48 • 来自相关话题

es 使用短语查询的时候,如何检索a and(b OR c) 这种情况

rochy 回复了问题 • 2 人关注 • 1 个回复 • 3155 次浏览 • 2019-02-21 17:32 • 来自相关话题

elastic6.5.1(datatype join 实现关联查询)

gxguetcw 回复了问题 • 6 人关注 • 2 个回复 • 4512 次浏览 • 2019-02-21 15:30 • 来自相关话题

请教一下elsticsearch进程管控和索引管控的知识

zqc0512 回复了问题 • 3 人关注 • 1 个回复 • 1119 次浏览 • 2019-02-21 12:38 • 来自相关话题

为什么我的es那个docs只能容纳10000个,超过10000个会自动删掉一些

zqc0512 回复了问题 • 6 人关注 • 4 个回复 • 3751 次浏览 • 2019-02-21 12:36 • 来自相关话题

elasticsearch 批量删除 导致使用磁盘容量上升

laoyang360 回复了问题 • 5 人关注 • 4 个回复 • 5957 次浏览 • 2019-02-21 12:28 • 来自相关话题

Python执行update_by_query 报错.

elk123 回复了问题 • 6 人关注 • 4 个回复 • 6262 次浏览 • 2019-02-20 16:49 • 来自相关话题

在搜索数量不大于10000时,有必要用searchAfter吗?

rochy 回复了问题 • 2 人关注 • 1 个回复 • 1476 次浏览 • 2019-02-20 15:33 • 来自相关话题