谈谈最近ES运维中遇到的几个有意思的问题<二>

2021-01-31 22:17:29 浏览数 (1)

一、Kibana 上无法正常Discovery 日志的问题

问题描述

客户同一个集群,同一个索引里的某些文档,用API能直接搜出来,但是在discovery上不能正常搜索,换另外一个id又能正常展示.

正常展示一正常展示一
异常展示二异常展示二
代码语言:javascript复制
GET wemeet-client-event-2021.01.29/_search
{
  "query": {
    "match": {
      "_id": "frmnTXcBk6fZ1AMtfKEH"
    }
  }
}       //能正常返回

解决办法

1,通过对比该索引里的不同文档具体属性可知,能在discovery界面正常返回的带时间戳字段,而不能返回的文档并不具备时间戳字段“@timestamp”,因此,不具备该字段的文档就无法正常在kibana返回,但是API确是可以正常搜索。

问题产生背景:

客户该索引的数据来自2部分,1个是filebeat产生的带时间戳的,一个是客户自己用代码自己手动写入的忘记带时间戳字段。

二、Reindex 复制索引数据报错导致复制失败

问题描述:

客户将存量索引通过reindex的方式拷贝到新生产的索引上,ES 集群版本为:6.4.3

代码语言:javascript复制
POST _reindex
{
"source": {
"index": "db_article_om_202011"
},
"dest": {
"index": "db_contentgram_test"
}
} 

报错信息如下:

代码语言:javascript复制
failures": [
{
"index": "db_contentgram_test",
"type": "t_article_om",
"id": "10_20201110A0C9XJ_0",
"cause": {
"type": "mapper_parsing_exception",
"reason": "failed to parse",
"caused_by": {
"type": "illegal_state_exception",
"reason": "Mixing up field types: class org.elasticsearch.index.mapper.KeywordFieldMapper$KeywordFieldType != class org.elasticsearch.index.mapper.TextFieldMapper$TextFieldType on field title"
}
}

通过排查:

按照信息提示可知,初步判定是title字段类型不一致导致,于是我们检查目标索引的title字段,发现并没异常。因为修改字段类型,而后再reindex是比较常用的手段。

再排查,发现新旧两个索引的的type不一致。而6.4.3低版本是可以支持多type的。于是删掉新索引的type,重新reindex就没有报错了。

附上方法:

代码语言:javascript复制
PUT /db_contentgram_test     //创建索引
{
    "settings": {
        "analysis": {
          "analyzer": {
            "ngram_analyzer": {
              "tokenizer": "ngram_tokenizer"
            }
          },
          "tokenizer": {
            "ngram_tokenizer": {
              "type": "ngram",
              "min_gram": 1,
              "max_gram": 2,
              "token_chars": [
                "letter",
                "digit"
              ]
            }
          }
        }
      }
代码语言:javascript复制
PUT db_contentgram_test/_mapping/t_article_om     //创建mapping
{
    "_source": {
          "enabled":true
       },
     "_all":{
          "enabled":false
     },
     "properties": {
         "abstract": {
           "type": "text",
            "analyzer": "ngram_analyzer"
         },
         "account": {
           "type": "keyword"
         },
         "accountname": {
           "type": "keyword"
         },
         "addtime": {
           "type": "integer"
         },
         "articleid": {
           "type": "keyword"
         },
         "businessid": {
           "type": "integer"
         }
         .........

然后再执行reindex就不报错了。

当然,上面的问题,我们可以指定源索引的特定type进行复制迁移,这样就不必要求2个索引type一致了。参数如下:

代码语言:javascript复制
POST _reindex?wait_for_completion=false
{
  "source": {
    "index": ["db_content_test"],
    "type": ["t_article"]                        //指定type
  },
  "dest": {
    "index": "db_contentgram_test1",
    "type":"t_article_om_server"                    //新索引type
}

以上,也能解决reindex报错的问题。

Reindex指定链接迁移 参考链接 :https://www.elastic.co/guide/en/elasticsearch/reference/6.4/docs-reindex.html

0 人点赞