【轉(zhuǎn)載】Elasticsearch中文社區(qū)-5月問題實戰(zhàn)精華篇

文章來源:https://github.com/laoyang360/deep_elasticsearch/blob/master/es_accumulate/201805_report.md

問題1、新的kafka集群監(jiān)控系統(tǒng)使用golang開發(fā)

monitoringkafkaGolang
開源地址:https://github.com/kppotato/kafka_monitor

項目使用:golang開發(fā),數(shù)據(jù)庫:prometheus 圖形:grafana

問題2俱尼、請教elasticsearch出現(xiàn)unassigned shards根本原因?

https://elasticsearch.cn/question/4136

medcl回復(fù):

原因肯定是有很多啊色冀,但是要看具體每一次是什么原因引起的续室,對照表格排查未免不太高效闯袒,怎么辦幔嗦?

es 早已幫你想好對策酿愧,使用? Cluster Allocation Explain
API,

會返回集群為什么不分配分片的詳細(xì)原因邀泉,你對照返回的結(jié)果嬉挡,就可以進行有針對性的解決了。
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/cluster-allocation-explain.html

銘毅天下實戰(zhàn):

GET /_cluster/allocation/explain
{
  "index": "test",
  "shard": 0,
  "primary": false,
  "current_state": "unassigned",
  "unassigned_info": {
    "reason": "CLUSTER_RECOVERED",
    "at": "2018-05-04T14:54:40.950Z",
    "last_allocation_status": "no_attempt"
  },
  "can_allocate": "no",
  "allocate_explanation": "cannot allocate because allocation is not permitted to any of the nodes",
  "node_allocation_decisions": [
    {
      "node_id": "ikKuXkFvRc-qFCqG99smGg",
      "node_name": "test",
      "transport_address": "127.0.0.1:9300",
      "node_decision": "no",
      "deciders": [
        {
          "decider": "same_shard",
          "decision": "NO",
          "explanation": "the shard cannot be allocated to the same node on which a copy of the shard already exists [[test][0], node[ikKuXkFvRc-qFCqG99smGg], [P], s[STARTED], a[id=bAWZVbRdQXCDfewvAbN85Q]]"
        }
      ]
    }
  ]
}

問題3:Elasticsearch寫入速度越來越慢

https://elasticsearch.cn/question/4112

用sparkstreaming并行寫入es汇恤,采用的是bulk接口棘伴,20s寫入一次,當(dāng)索引剛建立時速度挺快屁置,耗時大概8到12s,而當(dāng)大概運行半天后仁连,寫入速度下降很多蓝角,耗時變?yōu)?8s以上,有時候甚至超過40s饭冬,有大哥哥知道是什么問題嗎使鹅?

if(bulkRequest.numberOfActions()>0)
  {
    val bulkResponse = bulkRequest.get()
    if (bulkResponse.hasFailures) {
      println("failed processing bulk index requests " + bulkResponse.buildFailureMessage)
    }
  }

寫入變慢的原因可能有

1.隨著寫入索引數(shù)據(jù)增多,單個shard數(shù)據(jù)量太大(超過50GB)昌抠,導(dǎo)致寫入速度變慢

2.隨著數(shù)據(jù)寫入患朱,segment合并變得頻繁,es節(jié)點負(fù)載變高

問題4:ES更新某個字段的值

POST supp_dev/discovery/type/_update
{
  "script": "ctx._source.marked = count",
  "params": {
    "count": 0
  }
}

問題5:es中有自動創(chuàng)建了很多索引炊苫,怎么禁止裁厅?安裝了x-pack冰沙?

https://elasticsearch.cn/question/4097

方法1:安裝了x-pack,這些watcher開頭的索引是跟es里watcher監(jiān)控插件有關(guān)执虹。方法1是設(shè)置watcher索引保存時間

方法2:action.auto_create_index: false 關(guān)閉了自動創(chuàng)建索引拓挥。

方法3:禁用watcher功能就行了。
xpack.watcher.enabled: false

問題6:elasticsearch打開和關(guān)閉索引詳細(xì)過程是是什么樣子的袋励?

https://elasticsearch.cn/question/4069

打開

當(dāng)你打開一個索引時侥啤,首先會發(fā)生的事情是將主碎片分配給特定節(jié)點上存在的最新版本。

Lucene索引將被打開(可能需要時間)茬故,并且將重播事務(wù)日志盖灸。

然后,副本(如果有的話)將被分配并與原分片同步(重復(fù)使用具有相同數(shù)據(jù)的現(xiàn)有節(jié)點)磺芭。

那么赁炎,開放一個指數(shù)的成本是多少? 主要的成本是打分片的索引文件(Lucene)徘跪,并應(yīng)用事務(wù)日志甘邀。

您無法真正改變打開Lucene索引所需的時間(除非索引較少的數(shù)據(jù)/字段),但是您可以在關(guān)閉索引之前將flush發(fā)送到索引垮庐,因此不需要重放事務(wù)日志松邪。

關(guān)閉:

關(guān)閉索引時,除了磁盤大小外哨查,它們不會在群集上占用任何資源逗抑。

他們的數(shù)據(jù)保留在節(jié)點上,但是它們不可用于搜索或索引寒亥,也沒有資源(內(nèi)存邮府,文件句柄等)。
參考:http://t.cn/Ru3i3Fj

問題7:時間戳怎么在logstash里轉(zhuǎn)為date并替換@timestamp

日志里有個字段 "createTime": "1526402356365" 溉奕,把這個轉(zhuǎn)成時間替換到@timestamp褂傀,怎么寫filter啊

實現(xiàn):

date {
    match =>["time_local","dd/MMM/yyyy:HH:mm:ss","ISO8601"]
    target => "@timestamp"
  }

time_local 原始日志中的日期時間;后面是你日期格式加勤,可以查詢官網(wǎng)

問題8:logstash向es里面導(dǎo)入mysql數(shù)據(jù)仙辟,表字段名稱自動變成了小寫

用logstash向es里面導(dǎo)入mysql數(shù)據(jù)的時候,表字段按照駝峰式命名鳄梅,但是數(shù)據(jù)導(dǎo)進去之后叠国,字段名稱全都變成了小寫。哪位大神知道這個是什么情況啊戴尸,es是5.5.0版本

es中索引名稱不支持大寫粟焊,包含#,以_開頭。具體查看MetaDataCreateIndexService類的validateIndexName方法

public void validateIndexName(String index, ClusterState state) {
        if (state.routingTable().hasIndex(index)) {
            throw new IndexAlreadyExistsException(new Index(index));
        }
        if (state.metaData().hasIndex(index)) {
            throw new IndexAlreadyExistsException(new Index(index));
        }
        if (!Strings.validFileName(index)) {
            throw new InvalidIndexNameException(new Index(index), index, "must not contain the following characters " + Strings.INVALID_FILENAME_CHARS);
        }
        if (index.contains("#")) {
            throw new InvalidIndexNameException(new Index(index), index, "must not contain '#'");
        }
        if (index.charAt(0) == '_') {
            throw new InvalidIndexNameException(new Index(index), index, "must not start with '_'");
        }
        if (!index.toLowerCase(Locale.ROOT).equals(index)) {
            throw new InvalidIndexNameException(new Index(index), index, "must be lowercase");
        }
        int byteCount = 0;
        try {
            byteCount = index.getBytes("UTF-8").length;
        } catch (UnsupportedEncodingException e) {
            // UTF-8 should always be supported, but rethrow this if it is not for some reason
            throw new ElasticsearchException("Unable to determine length of index name", e);
        }
        if (byteCount > MAX_INDEX_NAME_BYTES) {
            throw new InvalidIndexNameException(new Index(index), index,
                    "index name is too long, (" + byteCount +
                    " > " + MAX_INDEX_NAME_BYTES + ")");
        }
        if (state.metaData().hasAlias(index)) {
            throw new InvalidIndexNameException(new Index(index), index, "already exists as alias");
        }
        if (index.equals(".") || index.equals("..")) {
            throw new InvalidIndexNameException(new Index(index), index, "must not be '.' or '..'");
        }
    }

https://elasticsearch.cn/question/4138

感謝各位的熱心幫助项棠,找到了問題的原因悲雳,我是使用logstash同步mysql數(shù)據(jù)的,

因為在jdbc.conf里面沒有添加 lowercase_column_names => "false"

這個屬性沾乘,所以logstash默認(rèn)把查詢結(jié)果的列明改為了小寫怜奖,同步進了es,所以就導(dǎo)致es里面看到的字段名稱全是小寫翅阵。

最后總結(jié):es是支持大寫字段名稱的歪玲,問題出在logstash沒用好,需要在同步配置中加上 lowercase_column_names => "false" 掷匠。

問題9:主節(jié)點的數(shù)據(jù)量滥崩,乘父節(jié)點數(shù),小于總數(shù)據(jù)量讹语?

image

如圖:當(dāng)前索引為一個副本钙皮,一個節(jié)點。
當(dāng)前節(jié)點為:1031多w顽决,按理說總數(shù)據(jù)量為2062w數(shù)據(jù)短条,但為何總數(shù)據(jù)量顯示為:2677多w,遠(yuǎn)遠(yuǎn)大于公式計算出來的數(shù)據(jù)才菠?

回答:
你的索引里發(fā)生過文檔刪除茸时,就可能會出現(xiàn)上面的情況

比如你往一個索引里插入了6條記錄赋访,刪除了其中的一條可都。那么使用/_count,你會得到結(jié)果5條蚓耽。
其實ES刪除文檔時不是真正刪除渠牲,而只是會做個標(biāo)記marker。所以索引里實際還存在6個文檔步悠。

什么時候真正刪除签杈?

ES用的是Luncene 管理索引。Luncene 會在滿足一定條件時進行merge操作鼎兽,其中會把所有標(biāo)記了delete的文檔真正的刪除并合并segment芹壕。

什么時候deleted不為0?

如果刪除了文檔接奈,但是還沒有merge,比如這個索引通孽,主本5條記錄序宦,實際18條數(shù)據(jù)。


image

執(zhí)行

curl -XGET '192.168.3.100:9200/log_test/_stats?total&pretty'

你會發(fā)現(xiàn):


image

強制做merge背苦,將文檔真正刪除
POST /log_test/_optimize?only_expunge_deletes=true&wait_for_completion=true

你會發(fā)現(xiàn)文檔數(shù)就變成了
5/15

參考源碼

public class DocsStats implements Streamable, ToXContent {

    long count = 0;
    long deleted = 0;

    public DocsStats() {

    }

    public DocsStats(long count, long deleted) {
        this.count = count;
        this.deleted = deleted;
    }
    ......
}

問題10:請問查詢?nèi)伺c人之間合作度互捌,這種聚合查詢怎么寫呢潘明?

請問,我想查詢出來秕噪,與 張三合作超過5本書的人 钳降,

我的數(shù)據(jù)結(jié)構(gòu)是:
======================
{
"書名":“abc”
“authors”:[
    {"作者":“張三”},
    {"作者":“李四”}腌巾,
    {"作者":“王五”}
]
}
=====================
{
"書名":“def”
“authors”:[
    {"作者":“張三”}遂填,
    {"作者":“李四”}
]
}
{
    "order": 10,
    "template": "fetch_example*",
    "settings": {
      "index": {
        "number_of_shards": "1"
      }
    },
    "mappings": {
      "type": {
        "_all": {
          "enabled": false
        },
        "properties": {
          "書名":{
            "type":"string",
            "index": "not_analyzed"
          },
          "作者":{
            "type":"string",
            "index": "not_analyzed"
          },
          "authors":{  
            "type":"nested",
            "properties":{  
               "作者":{ "type":"string",
            "index": "not_analyzed"}
               
            }
         }
        }
      }
    },
    "aliases": {}
  }

{
  "size": 0,
  "query": {
    "nested": {
      "path": "authors",
      "query": {
        "term": {
          "authors.作者": {
            "value": "張三"
          }
        }
      }
    }
  },
  "aggs": {
    "1": {
      "nested": {
        "path": "authors"
      },
      "aggs": {
        "2": {
          "terms": {
            "field": "authors.作者",
            "size": 10
          },
          "aggs": {
            "filter": {
              "bucket_selector": {
                "buckets_path": {
                  "the_doc_count": "_count"
                },
                "script": "the_doc_count > 2"
              }
            }
          }
        }
      }
    }
  }
}

問題11:ES聚合如何實現(xiàn)SQL中的having語句

像SQL里面的HAVING語句來過濾聚合結(jié)果(例如根據(jù)color聚合avg price,要求avg price要大于4000)
采用post_filter好像實現(xiàn)不了

https://elasticsearch.cn/question/4214

回復(fù):

post_filter 是對原始數(shù)據(jù)做過濾的澈蝙,不會對聚合起作用吓坚,它存在的意義是先做全局的聚合,然后再過濾詳細(xì)數(shù)據(jù)灯荧,比如一次性獲取所有分類的聚合信息和某個分類下的詳細(xì)數(shù)據(jù)礁击。可以看官方的示例逗载。

你的需求用 pipeline aggregation 中的 bucket selector 可以實現(xiàn)哆窿,看下官方的例子好了

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-bucket-selector-aggregation.html

https://www.elastic.co/guide/cn/elasticsearch/guide/current/_post_filter.html

GET cars/_search
{
  "size": 0,
  "aggs": {
    "colors": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        },
        "bucket_filter": {
          "bucket_selector": {
            "buckets_path": {
              "avgPrice": "avg_price"
            },
            "script": "params.avgPrice>4000"
          }
        }
      }
    }
  }
}

問題12:用logstash讀取kafka里的數(shù)據(jù)怎么能從頭開始

https://elasticsearch.cn/question/4209

kafka {
bootstrap_servers => "localhost:9092"
topics => "test"
group_id => "logstash"
auto_offset_reset => "earliest"

}

我的配置是這樣,我想要重新啟動logstash的時候厉斟,能重新消費kafka挚躯,或者是能接著把沒有消費完的數(shù)據(jù)進行消費,需要每次修改group_id嗎

是的捏膨,offset commit 只有一次機會秧均,一旦運行過了就記錄了,此時你要重新從頭消費的話号涯,要么你手動去 zk 把 offset 改了目胡,要么改 group,此時當(dāng)然是改 group id方便了链快。

至于重啟的時候繼續(xù)消費惜辑,默認(rèn)就是這樣的運行方式,不需要再改 group栗恩。

問題13:logstash導(dǎo)入mysql上億級別數(shù)據(jù)的效率問題

https://elasticsearch.cn/question/2891

請教各位:
當(dāng)mysql表中數(shù)據(jù)存在上億條時凛剥,使用logstash同步表中數(shù)據(jù)到ES,而且使用jdbc_paging_enabled分頁時霉祸,其是直接將原sql語句作為子查詢筑累,拼接offset和limit來實現(xiàn)。當(dāng)查詢出的結(jié)果集較大時存在深度分頁瓶頸丝蹭。

可以看到一次查詢花費幾千秒慢宗。

當(dāng)查詢出的結(jié)果集較小時,比如幾百萬時,則只要花費幾十秒镜沽。

請問各位敏晤,有什么好辦法提高logstash在數(shù)據(jù)量較大情況下的查詢效率嗎,

現(xiàn)在測試表中生成了一億條左右數(shù)據(jù)缅茉,但是當(dāng)logstash從mysql中查詢數(shù)據(jù)實在是太慢了嘴脾,幾千秒才能查出一次數(shù)據(jù),請問有什么好的方式增加速度嗎蔬墩?

或者有沒有大神做過類似場景的測試译打,請大神指教。

實現(xiàn)方法:
我也遇到你同樣問題筹我,可以這么解決:
1.給updated_ts時間字段加上索引扶平。
2.分批處理原則
(1)你的SQL:每批處理100000個
SELECT a.party_id AS id ,a.* FROM PARTY_ALL_1 a WHERE a.updated_ts > '2011-11-17 13:23:58' order by a.updated_ts asc LIMIT 100000;

(2)logstash分頁的時候每次處理50000個
SELECT * FROM (SELECT a.party_id AS id ,a.* FROM PARTY_ALL_1 a WHERE a.updated_ts > '2011-11-17 13:23:58' order by a.updated_ts asc LIMIT 100000) AS t1 LIMIT 50000 OFFSET 0;

SELECT * FROM (SELECT a.party_id AS id ,a.* FROM PARTY_ALL_1 a WHERE a.updated_ts > '2011-11-17 13:23:58' order by a.updated_ts asc LIMIT 100000) AS t1 LIMIT 50000 OFFSET 50000;

(3)處理兩次就寫一個最后一條記錄的updated_ts時間到指定文件。下一個定時任務(wù)啟動的時候進行循環(huán)處理就行蔬蕊,因為每批處理updated_ts都會改變

問題14 :Grok Debugger官網(wǎng)的在線調(diào)試地址:

http://grokdebug.herokuapp.com/

Grok Debugger中文站:

http://grok.qiexun.net/

自己本地搭建:

http://blog.51cto.com/fengwan/1758845

問題15 es查詢結(jié)果數(shù)量在兩個數(shù)之間切換

集群有三個節(jié)點结澄,5個主分片1個副本分片。
同一個條件(或者直接match_all)連續(xù)兩次查詢出來hits['total']也就是總數(shù)不一樣岸夯,在兩個數(shù)之間切換
請問下有人知道是什么原因嗎麻献?

回復(fù):

你 es 版本是?你用 preference 參數(shù)限制下主副分片猜扮,看下是否是主副分片問題勉吻。不過按理應(yīng)該不會這樣才對。
另外你 restart 一下集群旅赢,看是否會變正常齿桃。

6.0版本 用preference看了確實有一個值是主分片 另一個值是副本分片

問題16 ES數(shù)據(jù)不能實時更新

es 數(shù)據(jù)在被修改之后 再發(fā)起查詢還是會查到未修改前的數(shù)據(jù)
es服務(wù)版本 5.3.3,
es pom版本2.1.0煮盼,jest版本2.3短纵,

我使用的是jest httpclient方式,就是前端每次調(diào)一個修改數(shù)據(jù)的接口之后然后回調(diào)查詢接口僵控,結(jié)果就是會查到老數(shù)據(jù)(就是查到的那條數(shù)據(jù)是沒有被修改的樣子)香到,后來嘗試了在回調(diào)查詢的時候增加了一點延時(500ms),效果提升了一點报破,可以成功查到修改后數(shù)據(jù)的樣子了悠就,但是不太穩(wěn)定,時而成功時而失敗充易,被這個問題困惑了好久梗脾,求解決!

回復(fù):
1)refresh時間盹靴,默認(rèn)1s

2)默認(rèn)是1秒可見炸茧。如果你的需求一定要寫完就可見帆疟,那在寫的時候增加refresh參數(shù),強制刷新即可宇立。但強烈建議不這么干,因為這樣會把整個集群拖垮自赔。

問題17 elasticsearch如何查詢所有index妈嘹?

https://elasticsearch.cn/question/4263

GET _cat/indices

詳細(xì)參考:
https://stackoverflow.com/questions/17426521/list-all-indexes-on-elasticsearch-server

curl 'localhost:9200/_cat/indices?v'

問題18:在6.2版本中提到了一個Bucket Script Aggregation 的功能:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-bucket-selector-aggregation.html

用它實現(xiàn)了如下SQL
select company_id, count(1) from xxx_table where company_id between A and B group by company_id having count(1) > 1;

{
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "company_id": {
            "gte": A,
            "lte": B
          }
        }
      }
    }
  },
  "aggs": {
    "count_by_company_id": {
      "terms": {
        "field": "company_id"
      },
      "aggs": {
        "distinct_id": {
          "cardinality": {
            "field": "company_id"
          }
        },
        "id_bucket_filter": {
          "bucket_selector": {
            "buckets_path": {
              "value": "distinct_id"
            },
            "script": "params.value> 1"
          }
        }
      }
    }
  }
}

問題19:Filter中term和range不能同時用么?

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "name": "kevin"
          }
        },
        {
          "range": {
            "age": {
              "gte": 20,
              "lte": 30
            }
          }
        }
      ]
    }
  }
}

問題20:跨集群數(shù)據(jù)同步方案討論

https://elasticsearch.cn/question/4294
雖然ES本身就是一個分布式系統(tǒng)绍妨,但在生產(chǎn)實踐中润脸,往往還是讓所有ES節(jié)點落在單機房內(nèi),各個數(shù)據(jù)中心之間他去,采用其他方式來同步數(shù)據(jù)毙驯。那么如何來做數(shù)據(jù)同步,以及如何確保數(shù)據(jù)一致性灾测,就成了不得不面對的問題”郏現(xiàn)提出我知道的方案,供大家討論媳搪,也希望大家伙能分享自己的方案~~~

方案一铭段,雙寫
在數(shù)據(jù)寫入ES時,通過MQ或者其他方式實現(xiàn)數(shù)據(jù)雙寫或者多寫秦爆,目前很多MQ都有數(shù)據(jù)持久化功能序愚,可以保障數(shù)據(jù)不丟;再結(jié)合ES各種狀態(tài)碼來處理數(shù)據(jù)重復(fù)問題等限,即可實現(xiàn)多中心數(shù)據(jù)的最終一致爸吮。

方案二,第三方數(shù)據(jù)同步
例如使用mysql的主從同步功能望门,在不同數(shù)據(jù)中心之間形娇,從本機房的mysql同步數(shù)據(jù)到ES,依托mysql數(shù)據(jù)一致性來保障ES數(shù)據(jù)一致怒允。datax,StreamSet均提供了類似功能埂软。

方案三,基于ES translog同步
讀取translog纫事,同步并重放勘畔,類似于mysql binlog方式±龌蹋看起來這種方式最干凈利落炫七,但涉及到ES底層代碼修改,成本也較高钾唬,目前已有的實踐:万哪。[/url]
拋磚引玉~~~

關(guān)于方案1侠驯,有興趣試試我的這個小工具么,目前支持多集群多寫了奕巍,自帶本地磁盤隊列吟策,支持?jǐn)U展外部 MessageQueue,如 Kafka的止,RabbitMQ檩坚。地址: https://github.com/medcl/elasticsearch-proxy?

方案2最復(fù)雜,需要從原始數(shù)據(jù)開始進行處理诅福,需要從 MySQL 到 ES 的文檔轉(zhuǎn)換匾委,MySQL 的數(shù)據(jù)表達方式往往不夠直觀,使用起來不是很方便氓润。

方案3赂乐,目前 ES 的 Translog 不能直接讀取,修改底層代碼產(chǎn)生新的分支咖气,不具實際可行性挨措。

還有方案么,有的:

方案4采章,ES 正在實現(xiàn)新的 CCR运嗜,cross cluster replication, 基于底層 sequence id 機制,實現(xiàn)的 Changes API悯舟,一個集群可被另外一個集群或是本集群“訂閱”担租,從而可以實現(xiàn)數(shù)據(jù)復(fù)制,進行同步抵怎,可以是跨數(shù)據(jù)中心集群也可以本地集群的數(shù)據(jù)同步奋救。

問題21:logstash同步亂碼

https://elasticsearch.cn/question/4325

mysql 中的數(shù)據(jù) logstash-input-jdbc 導(dǎo)入es mysql列名是中文,導(dǎo)入es后,字段名成了亂碼反惕,求解

處理中文亂碼問題

codec => plain { charset => "UTF-8"}

在input中 你加這個了么

問題22:Elasticsearch 使用IK分詞尝艘,如何配置同義詞?

參考鏈接:https://elasticsearch.cn/question/29

問題23:ElasticSearch如何先聚合后過濾姿染?

https://elasticsearch.cn/question/656
場景:按日期緯度一個數(shù)據(jù)報表背亥,字段有date_str, shop_code, new_user_count, active_count。字段分別含義:日期(精確到日)悬赏、車商id狡汉、 新增用戶、活躍用戶數(shù)闽颇;
先需先按照時間范圍查詢盾戴,車商id分組,new_user_count字段取sum兵多。然后在聚合后過濾new_user_count字段sum結(jié)果>30的所有車商id尖啡,以及sum結(jié)果橄仆。

類似sql:select shop_code, sum(new_user_count) from A where date_str >= ? and date_str <= ? group by shop_code having sum(new_user_count) > 30;

ps:不知道es有沒有實現(xiàn)先聚合然后過濾的功能。希望大神們能解惑衅斩,謝了盆顾。

在6.2版本中提到了一個Bucket Script Aggregation 的功能:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-bucket-selector-aggregation.html

用它實現(xiàn)了如下SQL

select company_id, count(1) from xxx_table where company_id between A and B group by company_id having count(1) > 1;
 
{
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "company_id": {
            "gte": A,
            "lte": B
          }
        }
      }
    }
  },
  "aggs": {
    "count_by_company_id": {
      "terms": {
        "field": "company_id"
      },
      "aggs": {
        "distinct_id": {
          "cardinality": {
            "field": "company_id"
          }
        },
        "id_bucket_filter": {
          "bucket_selector": {
            "buckets_path": {
              "value": "distinct_id"
            },
            "script": "params.value> 1"
          }
        }
      }
    }
  }
}

問題24:es升級后分片不分配

https://elasticsearch.cn/question/4271
按照官網(wǎng)說的平滑升級,從5.3版本升級到5.4版本畏梆,升級之前禁用分片分配

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "none"
  }
}
升級好后打開了分片分配
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "all"
  }
}

但是今天早上過來一看 發(fā)現(xiàn)今天的分片都沒分配
請各位大佬幫忙解答下這是什么情況椎扬,我是參考著這篇文檔來做的:
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/restart-upgrade.html

思路1:如果確認(rèn)集群的allocation已經(jīng)打開,可以用

GET /_cluster/allocation/explain

得到分片無法分配的原因具温,然后據(jù)此排查問題。

思路2:看一下集群的設(shè)置筐赔。 另外查一下master結(jié)點的日志铣猩,看看有報什么異常。

GET /_cluster/settings 

根本原因:原來是因為我還沒等到集群狀態(tài)變成green就操作下一個節(jié)點了茴丰。

問題25:自動生成不同索引达皿,不同索引不同配置參數(shù)

https://elasticsearch.cn/question/4330
需求:
1、es自動生成2個不同的索引:logstash-和fangzhen-贿肩,logstash-索引是logstash默認(rèn)生成的峦椰,fangzhen-是logstash output elasticsearch配置index生成的。

2汰规、2個不同的索引配置不同的參數(shù)汤功。

問題:
請問各位es大神,這樣可否實現(xiàn)溜哮?

目前想到的解決方案:
1滔金、生成不同索引都以logstash開頭,配置參數(shù)是template指定logstash-*
2茂嗓、手動生成索引餐茵,并附帶settings參數(shù)。

解決方案:用 template 匹配不同的 index述吸,然后應(yīng)用不同的配置

問題26:那一個分片下面一遍多少個文檔合適呢忿族?有沒有好的計算方法!

參考實現(xiàn):https://blog.csdn.net/laoyang360/article/details/78080602

問題27:ES節(jié)點都在蝌矛,也是green狀態(tài)道批,出現(xiàn)大量的pending_tasks,應(yīng)該如何進行處理朴读,有沒有處理路程

https://elasticsearch.cn/question/4333
ES集群10多個節(jié)點屹徘,接連出現(xiàn)兩次存在大量的pendin_tasks任務(wù),任務(wù)等級為HIGH衅金,導(dǎo)致不行新建索引噪伊,備份等操作

步驟1:
先要看看這些pending_tasks是什么才好進一步分析簿煌。
如果集群狀態(tài)為green,沒有數(shù)據(jù)shard在recovery鉴吹,比較容易產(chǎn)生pending_tasks的是put_mappings這類操作姨伟。
特別是如果用了動態(tài)mapping的情況下,比較容易因為新字段的寫入產(chǎn)生mapping更新任務(wù)豆励。

步驟2:
動態(tài)mapping非常容易引起性能問題夺荒,特別是集群比較大的情況下,容易因為大量的mapping更新任務(wù)會導(dǎo)致master過載良蒸。
并且動態(tài)mapping也容易因為臟數(shù)據(jù)的寫入產(chǎn)生錯誤的字段類型技扼。 我們的做法是完全禁用動態(tài)mapping,在索引的mapping設(shè)置中增加"dynamic": "false" 這個選項即可嫩痰。
集群的索引字段類型都需要預(yù)先設(shè)計好剿吻,數(shù)據(jù)必須嚴(yán)格按照設(shè)計的類型寫入,否則會被reject串纺。

注意:貌似 false 的話好像是不自動生成字段丽旅, strict 好像才會 reject

步驟3:
:去看ES服務(wù)端的日志,應(yīng)該會顯示put mapping是在哪個索引的哪個字段

其他方法:

GET /_cat/pending_tasks?v

查看一下究竟是哪些線程忙不過來纺棺,再進一步分析榄笙。

問題28 mysql 中的數(shù)據(jù) logstash-input-jdbc 導(dǎo)入es mysql列名是中文,導(dǎo)入es后,字段名成了亂碼祷蝌,求解

處理中文亂碼問題

codec => plain { charset => "UTF-8"}

在input中 你加這個了么茅撞?

問題29 “通過profile查看,發(fā)現(xiàn)耗時主要在status字段的build_scorer這個階段” profile 是個什么工具啊巨朦。謝謝

https://elasticsearch.cn/article/573
不是什么外部工具乡翅,就是ES的Query DSL那你有一個可選的參數(shù) "profile": true,
開啟以后罪郊,查詢結(jié)果會打印底層Luene查詢執(zhí)行的步驟和耗時蠕蚜。

問題30:在Elasticsearch 6.1.3版本中,發(fā)現(xiàn)translog文件過多導(dǎo)致異常悔橄?

Wood大叔回復(fù):

我感覺這個bug和6.x引入的translog retention策略有關(guān)系靶累。

為了加速熱索引的recovery, 6.x開始對于translog不再是flush以后立即清除癣疟,而是保留一定的大小挣柬,由以下兩個參數(shù)控制:

index.translog.retention.size    #默認(rèn)512mb
index.translog.retention.age    #默認(rèn)12h

保留一定量的translog的目的,是為了出現(xiàn)熱索引recovery情況的時候睛挚,借助保留的translog和seqno (也是6.x引入的邪蛔,記錄已經(jīng)提交到lucene的文檔序列號), 可以免去跨結(jié)點的shard文件拷貝消耗扎狱,直接從translog快速恢復(fù)數(shù)據(jù)侧到。

由于保留了一定時間的translog不清除勃教,那么判斷是否需要flush,以及flush的時候清除哪些文件的的條件就復(fù)雜了一些匠抗。需要比較哪些translog里的doc已經(jīng)全部提交故源,哪些還未提交或者部分提交。 這些判斷是通過比較translog里保留的seqno和local checkpoint記錄的seqno來做出的汞贸。

但是這個特性實現(xiàn)上看起來有些bug绳军,在一些極端場景造成了flush死循環(huán)。 官方嘗試在6.1.3/6.2.0修復(fù)這個問題( pull/28350 )矢腻, 但問題并未真正解決门驾。

在用戶報告問題以后,官方又發(fā)布了6.2.4 (pull/29125)多柑, 經(jīng)過我們生產(chǎn)集群的驗證猎唁,升級到6.2.4以后再未遇到類似的問題。

問題31:求教 如何在indea中調(diào)試elasticsearch源碼

這幾天想自己調(diào)試一些es顷蟆,看看大概工作流程,請教一下如何調(diào)試 es版本為6.2
https://elasticsearch.cn/question/4354

  1. IDEA里建好ES的工程腐魂,成功編譯和打包帐偎。
  2. 創(chuàng)建一個remote target
  3. 將 jdwp的參數(shù)拷貝到ES的啟動命令里,重啟ES
  4. IDEA里設(shè)好斷點蛔屹,啟動remote target

問題32:如何同時根據(jù) 銷量和瀏覽人數(shù)進行相關(guān)度提升

https://elasticsearch.cn/question/4345
針對商品削樊,例如有
銷量 瀏覽人數(shù)
A 10 10
B 20 20
C 30 30
想要有一個提升相關(guān)度的計算,同時針對銷量和瀏覽人數(shù)
例如oldScore*(銷量+瀏覽人數(shù))

field_value_factor好像只能支持單個field
求大神解答

function_score 評分查詢支持多個函數(shù)兔毒,同時針對銷量和瀏覽人數(shù)可以很簡單的實現(xiàn)漫贞,結(jié)構(gòu)類是:

{
  "query": {
      "function_score": {
          "query": {}, 
           "functions": []  //這里支持多個函數(shù)
       }
 }
}

最終:使用script score解決了問題

問題33 logstash-filter-elasticsearch的簡易安裝

https://elasticsearch.cn/article/643

不同版本的logstash集成的插件不一樣,在5.6版本就未集成logstash-filter-elasticsearch插件育叁,所以需要自己安裝迅脐。

官方提供的方法因為需要聯(lián)網(wǎng),并且需要調(diào)整插件管理源豪嗽,比較麻煩谴蔑,針對logstash-filter-elasticsearch插件,使用下面這種方式安裝龟梦。

logstash-filter-elasticsearch插件安裝

1隐锭、在git上下載logstash-filter-elasticsearch壓縮包,logstash-filter-elasticsearch.zip计贰,

2钦睡、在logstash的目錄下新建plugins目錄,解壓logstash-filter-elasticsearch.zip到此目錄下躁倒。

3荞怒、在logstash目錄下的Gemfile中添加一行:
gem "logstash-filter-elasticsearch", :path => "./plugins/logstash-filter-elasticsearch"

4洒琢、重啟logstash即可。

此方法適用logstash-filter-elasticsearch挣输,但不適用全部logstash插件纬凤。

問題34:elasticsearch如何保證成功

https://elasticsearch.cn/question/4365
如何保證一個正確的插入文檔請求
一定成功

在主分片上面執(zhí)行請求。如果成功了撩嚼,它將請求并行轉(zhuǎn)發(fā)到其他節(jié)點的副本分片上停士。
一旦所有的副本分片都報告成功, 主分片所在的節(jié)點將向協(xié)調(diào)節(jié)點報告成功,協(xié)調(diào)節(jié)點向客戶端報告成功完丽。
es數(shù)據(jù)寫入采用的是同步方式恋技。官網(wǎng)寫的很清楚

官網(wǎng)的原話:
The index operation only returns after all active shards within the replication group have indexed the document (sync replication).

問題35:某個節(jié)點線程池爆了,導(dǎo)致整個服務(wù)響應(yīng)很慢

https://elasticsearch.cn/question/4350

如標(biāo)題:
我們有個節(jié)點的search線程池爆了逻族,導(dǎo)致整個搜索服務(wù)響應(yīng)很慢蜻底,不知道大家有沒碰到過這種情況:有個疑問是:
1,這種情況下聘鳞,集群不會把這臺機器給剔除掉么薄辅?或者有什么自動恢復(fù)機制么?
2抠璃,對應(yīng)用層面站楚,能做哪些優(yōu)化么?

回復(fù):
1不掛的話應(yīng)該不會走剔除
2線程池和隊列大小做下配置優(yōu)化搏嗡。

順著樓上大牛的思路窿春,現(xiàn)有業(yè)務(wù)場景下,評估一下你的線程池模型是否合理

舉個例子:
一個節(jié)點假設(shè)配置search線程池為16采盒,隊列長度為1000旧乞, 一個線程處理一個搜索請求處理耗時是20ms,那么一個線程一秒可以處理50個請求磅氨。
那么理論上16個線程一秒可以處理900個請求尺栖,1000+16的線程隊列大小是能夠容納qps為900的業(yè)務(wù)的(當(dāng)然這是理論上,沒有考慮的線程上下文切換烦租,網(wǎng)絡(luò)原因决瞳,內(nèi)存GC導(dǎo)致stw等等,所以實際值肯定比這個低)左权。

線程數(shù)我覺得就核數(shù)兩倍好了皮胡,最多2.5倍,太多了cpu上來反而影響效率(這個看實際情況赏迟,假設(shè)寫少讀多可以適當(dāng)平衡這些線程數(shù))

我認(rèn)為可以參照如下公式得出

queueSize < thread(1s1000/cost)

然后我提出我的思考方式屡贺,我覺得你應(yīng)該優(yōu)化一下你的查詢。是不是存在耗時很高的查詢請求。
如上面分析的甩栈,假設(shè)你一個查詢耗時200ms泻仙,那么你16個線程的處理能力瞬間變成 < 90 req/s,如果還有耗時更高的耗時呢量没,
可以先優(yōu)化線程模型玉转,順便捕捉下慢查詢。

問題36:elasticsearch安裝x-pack之后殴蹄,filebeat直接傳數(shù)據(jù)到es究抓,報錯,提示鏈接不上袭灯,請問這個怎么解決刺下?

6.2版本
https://elasticsearch.cn/question/4397

已經(jīng)找到解決辦法了,
創(chuàng)建一個角色

POST _xpack/security/role/filebeat_writer{  "cluster": ["manage_index_templates", "monitor"],  "indices": [    {      "names": [ "filebeat-*" ],       "privileges": ["write","create_index"]    }  ]}

創(chuàng)建一個用戶

POST /_xpack/security/user/filebeat_internal{  "password" : "x-pack-test-password",  "roles" : [ "filebeat_writer"],  "full_name" : "Internal Filebeat User"}

filebeat中添加對應(yīng)的配置

output.elasticsearch:    hosts: ["localhost:9200"]    index: "filebeat"    username: "filebeat_internal"    password: "x-pack-test-password"
image

加入知識星球稽荧,更短時間更快習(xí)得更多干貨橘茉!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市姨丈,隨后出現(xiàn)的幾起案子畅卓,更是在濱河造成了極大的恐慌,老刑警劉巖蟋恬,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翁潘,死亡現(xiàn)場離奇詭異,居然都是意外死亡筋现,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門箱歧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矾飞,“玉大人,你說我怎么就攤上這事呀邢∪髀伲” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵价淌,是天一觀的道長申眼。 經(jīng)常有香客問我,道長蝉衣,這世上最難降的妖魔是什么括尸? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮病毡,結(jié)果婚禮上濒翻,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好有送,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布淌喻。 她就那樣靜靜地躺著,像睡著了一般雀摘。 火紅的嫁衣襯著肌膚如雪裸删。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天阵赠,我揣著相機與錄音涯塔,去河邊找鬼。 笑死豌注,一個胖子當(dāng)著我的面吹牛伤塌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轧铁,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼每聪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了齿风?” 一聲冷哼從身側(cè)響起药薯,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎救斑,沒想到半個月后童本,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡脸候,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年穷娱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片运沦。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡泵额,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出携添,到底是詐尸還是另有隱情嫁盲,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布烈掠,位于F島的核電站羞秤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏左敌。R本人自食惡果不足惜瘾蛋,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望矫限。 院中可真熱鬧瘦黑,春花似錦京革、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至甲葬,卻和暖如春廊勃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背经窖。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工坡垫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人画侣。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓冰悠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親配乱。 傳聞我的和親對象是個殘疾皇子溉卓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容