文章來源: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ù)量讹语?
如圖:當(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ù)。
執(zhí)行
curl -XGET '192.168.3.100:9200/log_test/_stats?total&pretty'
你會發(fā)現(xiàn):
強制做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/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://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 的功能:
用它實現(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 的功能:
用它實現(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
- IDEA里建好ES的工程腐魂,成功編譯和打包帐偎。
- 創(chuàng)建一個remote target
- 將 jdwp的參數(shù)拷貝到ES的啟動命令里,重啟ES
- 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"
加入知識星球稽荧,更短時間更快習(xí)得更多干貨橘茉!