這也許是你看到過(guò)的最通俗易懂的ElasticSearch文章了(理論篇)

本周在數(shù)據(jù)庫(kù)研發(fā)和運(yùn)營(yíng)組做了關(guān)于ELK的分享凤瘦,這個(gè)分享主要是居于ES部分做的相關(guān)理論和測(cè)試的結(jié)論。下面是對(duì)此次分享的文字版整理,希望對(duì)研究學(xué)習(xí)ElasticSearch的朋友們有幫助。

分享的主要內(nèi)容如下:

先來(lái)說(shuō)一下去調(diào)研ES的初衷,是為了確認(rèn)ElasticSearch是否能比較好地解決目前監(jiān)控DB遇到的幾個(gè)問(wèn)題烫饼,如下圖所示:

監(jiān)控DB目前面臨的三個(gè)問(wèn)題分別是:

容量瓶頸

監(jiān)控DB的數(shù)據(jù)量越來(lái)越大,單個(gè)表壓縮后有的已經(jīng)接近100G(一天的數(shù)據(jù))试读,目前采用的是MySQL來(lái)存儲(chǔ)杠纵,使用的TokuDB引擎。MySQL的擴(kuò)容型并不好钩骇,因此無(wú)法快速的進(jìn)行數(shù)據(jù)的擴(kuò)容比藻,目前的做法更多的是對(duì)過(guò)期的歷史數(shù)據(jù)進(jìn)行清理。但是需要保留月初伊履、月末以及節(jié)假日的數(shù)據(jù)韩容。

性能瓶頸

監(jiān)控有很多聚合的查詢,在單表特別大的情況下唐瀑,一個(gè)聚合SQL需要很長(zhǎng)時(shí)間才能查詢出結(jié)果群凶。無(wú)法很好展現(xiàn)監(jiān)控的實(shí)時(shí)效果。給業(yè)務(wù)的體驗(yàn)也很糟糕哄辣。

穩(wěn)定性

如果監(jiān)控DB出現(xiàn)問(wèn)題请梢,會(huì)導(dǎo)致線上監(jiān)控曲線掉底,業(yè)務(wù)側(cè)會(huì)以為是自己線上出現(xiàn)了問(wèn)題力穗,這會(huì)給業(yè)務(wù)帶來(lái)很大的困擾毅弧,因此對(duì)監(jiān)控DB的穩(wěn)定性要求很高〉贝埃坑隊(duì)友的事情監(jiān)控DB還是盡量少干够坐。

下面就來(lái)單獨(dú)介紹各個(gè)部分的內(nèi)容:

一、ELK簡(jiǎn)介

(一)ELK的涵義

ELK其實(shí)是由三個(gè)組建組成崖面,分別是ElasticSearch元咙、Logstash以及Kibana。

1巫员、E代表ElasticSearch庶香,如下圖所示:

正上圖說(shuō)的那樣,ELasticSearch是整個(gè)ELK的心臟简识,它負(fù)責(zé)索引的創(chuàng)建赶掖、搜索感猛、分析以及數(shù)據(jù)的存儲(chǔ)等工作,這個(gè)組將在后面做詳細(xì)介紹奢赂。

2陪白、L代表Logstash,如下圖所示:

Logstash是用來(lái)做數(shù)據(jù)采集呈驶、接收拷泽、處理和轉(zhuǎn)發(fā)的工具,它講采集來(lái)的數(shù)據(jù)經(jīng)過(guò)分析和處理以后袖瞻,將數(shù)據(jù)發(fā)送到ElasticSearch存儲(chǔ)。它本身支持非常多的數(shù)據(jù)源拆吆。

3聋迎、K代表Kibana,如下圖所示:

Kibana的主要功能是負(fù)責(zé)將ES中數(shù)據(jù)進(jìn)行炫酷的展示枣耀。

整理概括一下整個(gè)ELK就是:

Logstash負(fù)責(zé)數(shù)據(jù)采集霉晕、分析和處理,然后將數(shù)據(jù)發(fā)送給ElasticSearch做進(jìn)一步的存儲(chǔ)捞奕、分析和搜索牺堰,最后Kibana講ElasticSearch中的數(shù)據(jù)炫酷地展示出來(lái)。

(二)ELk常用架構(gòu)

ELK的常用架構(gòu)如下圖所示(偷懶盜個(gè)圖):

使用Logstash Shipper來(lái)在機(jī)器上采集相關(guān)的數(shù)據(jù)或者日志颅围,你可以理解為logstash的一個(gè)agent

中間使用redis做隊(duì)列伟葫,也有很多的公司使用kafka來(lái)代替redis。

(三)ELK在業(yè)界的使用情況

目前ELK比較活院促,社區(qū)也很活躍筏养,有很業(yè)務(wù)都在使用,主要分為三類(lèi)應(yīng)用:

1常拓、全文檢索

比如github和維基百科

2渐溶、日志監(jiān)控類(lèi)

比如騰訊云監(jiān)控、斗魚(yú)日志分析平臺(tái)

3弄抬、數(shù)據(jù)分析和查詢

比如:DELL茎辐,sprint

此外國(guó)外還有一些公司用ES來(lái)存儲(chǔ)地理位置數(shù)據(jù),比如Foursquare公司掂恕,結(jié)合搜索和地理位置兩者提供更優(yōu)質(zhì)的服務(wù)拖陆。

二、ES技術(shù)細(xì)節(jié)

ES技術(shù)細(xì)節(jié)部分主要介紹如下幾個(gè)方面:

(一)竹海、ES的特性

1慕蔚、Base on Apache Lucense

Lucense是高性能的搜索引擎庫(kù),提供了查詢引擎斋配、搜索引擎和文本分析引擎孔飒。但是使用Lucense成本很高灌闺,需要掌握很多關(guān)于搜索的知識(shí)。而ES使用Lucense作為底層架構(gòu)坏瞄,在其上做了大量的易用性桂对、擴(kuò)展性、容災(zāi)以及性能方面的工作鸠匀,使得用戶經(jīng)過(guò)很少的配置就可以快速ES進(jìn)行數(shù)據(jù)存儲(chǔ)和檢索蕉斜。

2、Distributed and horizontally scalable

ES是分布式的缀棍,可以水平擴(kuò)展宅此,比如添加節(jié)點(diǎn)的時(shí)候能自動(dòng)均衡數(shù)據(jù)。

3爬范、Full-text search and powerful search

ES支持前文支持全文索引父腕,并且搜索功能非常強(qiáng)大。

4青瀑、Document & Json

ES是基于文檔的強(qiáng)大組件璧亮,交互數(shù)據(jù)全部采用Json標(biāo)準(zhǔn)格式。

5斥难、Restful API

6枝嘶、Open Source

7、Query DSL

ES提供了基于JSON的query DSL查詢語(yǔ)言哑诊,傳統(tǒng)的SQL語(yǔ)句很容易轉(zhuǎn)化成query DSL群扶。后面做的關(guān)于MySQL和ES的性能比對(duì)也是將標(biāo)準(zhǔn)SQL改寫(xiě)成query DSL實(shí)現(xiàn)的。

(二)搭儒、ES集群組成和名詞解析

1穷当、名稱解析

a、Cluster

ES由個(gè)data節(jié)點(diǎn)和1個(gè)master節(jié)點(diǎn)構(gòu)成ES 集群淹禾,ES集群具有容災(zāi)能力馁菜,官方建議的也是使用ES集群的方式來(lái)運(yùn)維ES。

b铃岔、Node

Node是ES的節(jié)點(diǎn)汪疮,一般集群會(huì)有1個(gè)master節(jié)點(diǎn),多個(gè)data節(jié)點(diǎn)毁习,ES節(jié)點(diǎn)有如下幾種類(lèi)型:

master節(jié)點(diǎn)

master的功能是維護(hù)ES集群的元數(shù)據(jù)智嚷,比如創(chuàng)建刪除索引;監(jiān)控其他的節(jié)點(diǎn)纺且,比如對(duì)故障節(jié)點(diǎn)進(jìn)行剔除和協(xié)調(diào)故障恢復(fù)工作盏道;此外master節(jié)點(diǎn)還負(fù)責(zé)分片具體分配給哪些節(jié)點(diǎn)。因此在擴(kuò)容和這故障的時(shí)候载碌,分片遷移到哪臺(tái)機(jī)器上也需要master來(lái)協(xié)調(diào)猜嘱。

需要注意的是所有的涉及到路由變化的操作都必須master來(lái)做衅枫。

建議:master非常重要,比較大的集群建議講master獨(dú)立部署

data節(jié)點(diǎn)

data節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和檢索朗伶。

Coordinating節(jié)點(diǎn)

Coordinating節(jié)點(diǎn)不負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)弦撩,只負(fù)責(zé)請(qǐng)求的轉(zhuǎn)發(fā),有點(diǎn)類(lèi)似于負(fù)載均衡器

Tribal節(jié)點(diǎn)

tribal節(jié)點(diǎn)成為部落節(jié)點(diǎn)论皆,通過(guò)它能夠查詢不通集群的ES數(shù)據(jù)益楼,有點(diǎn)類(lèi)似于spider的功能。

c点晴、Shard

Shard是分片的意思感凤,一般一個(gè)很大的表為了保證其擴(kuò)展能力都會(huì)水平切分為多個(gè)分片,類(lèi)似于mysql的水平分表的概念觉鼻。每個(gè)分片只存儲(chǔ)自己那部分的數(shù)據(jù)和索引信息俊扭,全部的分片數(shù)據(jù)的集合就是全量的數(shù)據(jù)。

因?yàn)榉制⒁院笞钩拢绻竺嬉黾臃制枰繉?dǎo)入數(shù)據(jù)捐康,因此分片必須在創(chuàng)建索引之前就規(guī)劃好仇矾。具體的可以從索引的數(shù)據(jù)量、集群節(jié)點(diǎn)的個(gè)數(shù)和預(yù)計(jì)集群的規(guī)模等方面進(jìn)行合理的評(píng)估解总。

d贮匕、Replica

Replica副本,ES官方建議至少1副本花枫,否則容易出現(xiàn)數(shù)據(jù)丟失的風(fēng)險(xiǎn)刻盐。在ES中副本主要有2個(gè)作用:

其一是提供數(shù)據(jù)安全性保障,其二副本也能夠分擔(dān)讀的請(qǐng)求劳翰,提高ES的性能敦锌。

e、Index

Index是索引的意思佳簸,和關(guān)系型數(shù)據(jù)庫(kù)中的索引很不一樣乙墙。ES中Index的概念類(lèi)似于關(guān)系型數(shù)據(jù)庫(kù)中的database。

f生均、Type

Type是分類(lèi)的意思听想,和關(guān)系型數(shù)據(jù)庫(kù)中table的概念比較類(lèi)似。為提高性能马胧,建議最好是一個(gè)Index就存儲(chǔ)一個(gè)Type的數(shù)據(jù)就好汉买。

g、Mapping

Mapping的概念和關(guān)系型數(shù)據(jù)庫(kù)中的字段類(lèi)型比較類(lèi)似佩脊,如下ES中定義的Type字段類(lèi)型:

h蛙粘、Document

ES是文檔型的組建垫卤,Document類(lèi)似于關(guān)系型數(shù)據(jù)庫(kù)的一行。在ES中就是一個(gè)文檔组题。

2葫男、集群組成

從上圖中可以看到,ES集群是由多個(gè)節(jié)點(diǎn)組成崔列,上圖中有1個(gè)master節(jié)點(diǎn)和2個(gè)data節(jié)點(diǎn)組成梢褐,并且創(chuàng)建了1個(gè)索引,索引有4個(gè)數(shù)據(jù)分片和1個(gè)副本組成赵讯。Translog為ES提供高性能以及數(shù)據(jù)安全保障盈咳。

(三)、ES的寫(xiě)邏輯

ES的寫(xiě)入簡(jiǎn)圖如下:

ES的寫(xiě)操作分為兩類(lèi)边翼,一類(lèi)是涉及到路由變更的索引創(chuàng)建和刪除(簡(jiǎn)稱為索引的寫(xiě)入)鱼响,另一類(lèi)是基于文檔的創(chuàng)建、更新和刪除(簡(jiǎn)稱為文檔的寫(xiě)入)组底。

下面單獨(dú)來(lái)進(jìn)行介紹:

1丈积、索引的寫(xiě)入

無(wú)論是索引的創(chuàng)建還是刪除,都必須在master上進(jìn)行债鸡。因此江滨,如果寫(xiě)入的請(qǐng)求是發(fā)到了非master節(jié)點(diǎn),該節(jié)點(diǎn)會(huì)講對(duì)應(yīng)的創(chuàng)建或者刪除的請(qǐng)求轉(zhuǎn)發(fā)給master厌均,master會(huì)創(chuàng)建并修改元數(shù)據(jù)和路由信息唬滑,并將對(duì)應(yīng)的修改同步到其他的候選的master機(jī)器上,至少需要需要一半以上的候選master返回后才算寫(xiě)入成功棺弊。

2晶密、文檔的寫(xiě)入

文檔的寫(xiě)入的前提是所有的寫(xiě)入都必須先發(fā)送到主分片上,大致的步驟為:

a模她、文檔寫(xiě)入請(qǐng)求發(fā)送到任意的一個(gè)節(jié)點(diǎn)

b稻艰、節(jié)點(diǎn)根據(jù)shard = hash(routing) % number_of_primary_shards確定數(shù)據(jù)所在的分片以及根據(jù)元數(shù)據(jù)確認(rèn)主分片是在哪臺(tái)機(jī)器

c、在主分片上執(zhí)行寫(xiě)入操作和translog寫(xiě)入操作缝驳,并且將請(qǐng)求發(fā)送到副本上進(jìn)行寫(xiě)入和translog寫(xiě)入

d连锯、默認(rèn)是同步操作,必須主分片和副本分片都些成功財(cái)返回結(jié)果用狱,也可以人為調(diào)整為異步操作运怖,不過(guò)會(huì)有數(shù)據(jù)安全性問(wèn)題。

注意:默認(rèn)ES提供近實(shí)時(shí)的搜索夏伊,也就是說(shuō)文檔寫(xiě)入或者更新后不是馬上就能搜索出最新的變更摇展,默認(rèn)需要過(guò)1秒reflush后才能看到,如果業(yè)務(wù)對(duì)實(shí)時(shí)性要求非常高溺忧,也可以將reflush的相關(guān)的參數(shù)設(shè)置為request咏连,即有新的請(qǐng)求就執(zhí)行reflush的操作盯孙,這種方式性能會(huì)比較差。此外你還可以調(diào)用reflush的API手動(dòng)進(jìn)行reflush的操作祟滴。

(四)振惰、ES的讀邏輯

ES的讀邏輯如下圖所示:

ES查詢的時(shí)候如果指定了routing相關(guān)的值,就會(huì)只掃描確定的1個(gè)或者少數(shù)文檔垄懂,如果沒(méi)有指定routing相關(guān)的值就需要掃描所有的分片骑晶。因此還會(huì)涉及到查詢的拆分和合并的步驟。詳情如下:

a草慧、查詢請(qǐng)求發(fā)送到任意一個(gè)節(jié)點(diǎn)

b桶蛔、如果指定了routing的相關(guān)值,根據(jù)shard = hash(routing) % number_of_primary_shards公式就能直接計(jì)算出請(qǐng)求的數(shù)據(jù)所在的分片漫谷,然后將請(qǐng)求發(fā)送到對(duì)應(yīng)的分片就OK仔雷。如果指定routing的相關(guān)值,那么會(huì)發(fā)送到對(duì)應(yīng)查詢涉及到的所有分片(這就是請(qǐng)求拆分)舔示。

c碟婆、如果查詢只涉及到1個(gè)分片,查詢的分片所在的機(jī)器返回查詢結(jié)果到初始請(qǐng)求的節(jié)點(diǎn)惕稻,初始請(qǐng)求節(jié)點(diǎn)再將數(shù)據(jù)返回給業(yè)務(wù)脑融。而如果查詢涉及到多個(gè)分片,初始節(jié)點(diǎn)就會(huì)將請(qǐng)發(fā)送給多個(gè)分片并發(fā)查詢缩宜,此時(shí)查詢的分片所在的機(jī)器返回查詢結(jié)果到初始請(qǐng)求的節(jié)點(diǎn)后,初始節(jié)點(diǎn)還需要再進(jìn)行結(jié)果的合并甥温。初始節(jié)點(diǎn)將合并后的數(shù)據(jù)返回個(gè)業(yè)務(wù)锻煌。

(五)、ES的容災(zāi)

ES有很完善的容災(zāi)機(jī)制姻蚓,候選master一般有多個(gè)宋梧,data節(jié)點(diǎn)也有多個(gè),因此節(jié)點(diǎn)異常的時(shí)候通過(guò)將訪問(wèn)切換到別的節(jié)點(diǎn)來(lái)容災(zāi)狰挡。具體流程包含如下幾個(gè)流程:

1捂龄、故障發(fā)現(xiàn)

故障發(fā)現(xiàn)如下圖所示:

從上圖中可以看出,Master會(huì)去ping各個(gè)其他的節(jié)點(diǎn)加叁,圖中只畫(huà)了datanode節(jié)點(diǎn)倦沧。而其他的節(jié)點(diǎn)也會(huì)去ping master節(jié)點(diǎn),確認(rèn)master節(jié)點(diǎn)是否正常它匕。默認(rèn)ping規(guī)則如下:

Discovery.zen.fd.ping_interval=1s ?默認(rèn)每隔1秒探測(cè)1次

Discovery.zen.fd.ping_timeout=30s 默認(rèn)ping探測(cè)的超時(shí)時(shí)間為30秒

Discovery.zen.fd.ping_retry=3 ?默認(rèn)重試3次

#備注展融,以上參數(shù)可以根據(jù)自己的網(wǎng)絡(luò)情況和業(yè)務(wù)需求進(jìn)行調(diào)整。

2豫柬、節(jié)點(diǎn)切換

master節(jié)點(diǎn)切換

當(dāng)其他節(jié)點(diǎn)探測(cè)到master異常并達(dá)到重試次數(shù)后告希,候選節(jié)點(diǎn)會(huì)進(jìn)行競(jìng)爭(zhēng)扑浸,選master的具體規(guī)則如下:

a、每次選舉每個(gè)節(jié)點(diǎn)會(huì)把自己所知道的候選master節(jié)點(diǎn)根據(jù)nodeid進(jìn)行一次排序燕偶,然后選出第1個(gè)節(jié)點(diǎn)喝噪,暫且人為它是master節(jié)點(diǎn);

b指么、如果對(duì)某個(gè)節(jié)點(diǎn)的投票數(shù)達(dá)到 候選master數(shù)/2+1 個(gè)并且該節(jié)點(diǎn)也選舉自己為master酝惧,那么這個(gè)節(jié)點(diǎn)即為master。否則重新選舉涧尿;

備注:之所以節(jié)點(diǎn)的投票數(shù)需要達(dá)到候選master數(shù)/2+1系奉,是為了防止腦裂的問(wèn)題發(fā)生。

data節(jié)點(diǎn)切換

當(dāng)master節(jié)點(diǎn)檢測(cè)到某個(gè)data節(jié)點(diǎn)有異常的時(shí)候姑廉,做的操作大致如下:

a缺亮、master剔除該data節(jié)點(diǎn),如果ES數(shù)據(jù)配置了1份副本保存桥言,此時(shí)不存在數(shù)據(jù)丟失的風(fēng)險(xiǎn)萌踱,集群狀態(tài)為yelllow。如果數(shù)據(jù)沒(méi)有配置副本保存号阿,則存在數(shù)據(jù)丟失并鸵,集群狀態(tài)為red。

b扔涧、master對(duì)找出異常的data節(jié)點(diǎn)對(duì)應(yīng)的所有的數(shù)據(jù)分片园担,如果是主分片,則將其他節(jié)點(diǎn)上的副本分片提升為主分片枯夜,全部主分片恢復(fù)后弯汰,異常data節(jié)點(diǎn)涉及的數(shù)據(jù)讀寫(xiě)都恢復(fù)正常。

c湖雹、業(yè)務(wù)恢復(fù)正常以后咏闪,master會(huì)將異常節(jié)點(diǎn)的數(shù)據(jù)遷移到正常的節(jié)點(diǎn)

d、全部數(shù)據(jù)遷移完成后摔吏,集群狀態(tài)恢復(fù)為green

(六)鸽嫂、ES的擴(kuò)容

ES設(shè)計(jì)成能讓你靈活地?cái)U(kuò)縮容模型,當(dāng)你添加或者減少data節(jié)點(diǎn)的時(shí)候征讲,ES會(huì)自動(dòng)的對(duì)數(shù)據(jù)進(jìn)行均衡据某。如下幾個(gè)簡(jiǎn)圖能讓你幾秒鐘了解ES的擴(kuò)容問(wèn)題,下面幾個(gè)圖的索引設(shè)置為number_of_shards=3 &&?number_of_replicas=1稳诚,即索引為3個(gè)分片并且每個(gè)分片有1個(gè)副本哗脖。

1、一個(gè)節(jié)點(diǎn)的ES Cluster

從上圖中可以看到雖然設(shè)置了1個(gè)副本,但是datanode1只分配了3個(gè)主分片才避。這是因?yàn)镋S認(rèn)為如果副本和主分片在1臺(tái)機(jī)器上和沒(méi)有副本的效果一樣橱夭,當(dāng)那臺(tái)機(jī)器異常的時(shí)候,數(shù)據(jù)一樣丟失桑逝。因此ES沒(méi)有在那臺(tái)機(jī)器上分配副本分片棘劣。

2、擴(kuò)容一個(gè)節(jié)點(diǎn)后的ES Cluster

從上圖中楞遏,可以看到添加1個(gè)節(jié)點(diǎn)后茬暇,data節(jié)點(diǎn)2分配了2個(gè)副本。

3寡喝、再擴(kuò)容一個(gè)節(jié)點(diǎn)后的ES Cluster

從上圖中可以看到糙俗,data節(jié)點(diǎn)1上的P1被移動(dòng)到了data節(jié)點(diǎn)3,data節(jié)點(diǎn)2上的R3被移動(dòng)到了data節(jié)點(diǎn)3预鬓,這是因?yàn)樘砑庸?jié)點(diǎn)后巧骚,ES會(huì)自動(dòng)均衡數(shù)據(jù)。

三格二、ES讓人驚喜的功能

做為一個(gè)運(yùn)維人員劈彪,在學(xué)習(xí)ES的時(shí)候,遇到了很多讓人驚喜的功能顶猜,整理出來(lái)和大家共享:

(一)沧奴、ES的GROUP功能

ES的group功能和HBase的group功能類(lèi)似,可以將某些節(jié)點(diǎn)放到某一個(gè)GROUP中长窄,從而實(shí)現(xiàn)業(yè)務(wù)之間的隔離滔吠。比如想講重點(diǎn)業(yè)務(wù)和普通業(yè)務(wù)隔離開(kāi)來(lái),就可以將重點(diǎn)業(yè)務(wù)放到指定的某個(gè)組挠日,這個(gè)組不存在過(guò)保的設(shè)備屠凶,負(fù)載也比較低。而將普通業(yè)務(wù)放到普通的組中肆资,這各組的設(shè)備由于比較老,故障率會(huì)比較搞灶芝,組內(nèi)的機(jī)器負(fù)載也會(huì)高一些郑原。如下圖所示:

圖中有兩個(gè)組,分別是GroupA和GroupB夜涕,其中GroupA中保存這某些索引犯犁,GroupB中也保存著某些分片。ES有專門(mén)的參數(shù)控制索引可以存儲(chǔ)在某個(gè)Group或則節(jié)點(diǎn)女器,具體的參數(shù)如下:

cluster.routing.allocation.awareness.attributes

cluster.routing.allocation.include

cluster.routing.allocation.require

cluster.routing.allocation.exclude

(二)酸役、ES部落節(jié)點(diǎn)功能

ES從1.0版本開(kāi)始支持使用部落節(jié)點(diǎn)(tribe node),所謂的部落節(jié)點(diǎn),就是作為聯(lián)合客戶端提供訪問(wèn)多個(gè)ElasticSearch集群的能力涣澡。業(yè)務(wù)只需要訪問(wèn)部落節(jié)點(diǎn)贱呐,就可以獲取多個(gè)ES集群的數(shù)據(jù)。并且可以通過(guò)部落節(jié)點(diǎn)寫(xiě)入數(shù)據(jù)入桂,寫(xiě)入數(shù)據(jù)的時(shí)候部落節(jié)點(diǎn)會(huì)將寫(xiě)入請(qǐng)求轉(zhuǎn)發(fā)到后端的集群節(jié)點(diǎn)進(jìn)行數(shù)據(jù)寫(xiě)入奄薇。但是不支持創(chuàng)建索引的操作。注意:如果部落節(jié)點(diǎn)對(duì)應(yīng)后端的ES集群含有相同的索引名稱就會(huì)出現(xiàn)莫名其妙的問(wèn)題抗愁,因?yàn)镋S的默認(rèn)行為是從中選擇一個(gè)馁蒂。也就是說(shuō)如果后端2個(gè)集群含有相同的索引名字,那么知會(huì)有一個(gè)索引會(huì)被訪問(wèn)到蜘腌。部落節(jié)點(diǎn)的圖解如下:

(三)沫屡、ES的IO流控功能

ES還有個(gè)比較好的功能就是IO流控的功能,這個(gè)功能對(duì)于分布式存儲(chǔ)是非常必要的撮珠,比如可以限制文件合并的時(shí)候的IO沮脖,從而使系統(tǒng)更平穩(wěn)地運(yùn)行。ES主要有節(jié)點(diǎn)級(jí)和索引級(jí)兩個(gè)限流機(jī)制劫瞳。分別介紹如下:

節(jié)點(diǎn)級(jí)別限流

Indices.store.throttle.type(none/merge/all)

可以選擇為none/merge/all三個(gè)值倘潜,意義分別如下:

none為不流控

merge為對(duì)合并做IO流控

all為對(duì)所有的操作做IO流控

Indices.store.throttle.max_bytes_per_sec

索引級(jí)別限流

Index.store.throttle.type(none/merge/all/node)

Index.store.throttle.max_bytes_per_sec

(四)、ES的慢日志功能

ES有類(lèi)似于MySql的慢查詢功能志于,可以記錄下慢的操作涮因,從而讓運(yùn)維人員能通過(guò)慢的操作找到問(wèn)題所在。默認(rèn)情況下伺绽,慢日志是不開(kāi)啟的养泡,有三種動(dòng)作可以定義,分別是query奈应、fetch澜掩、index三類(lèi),如下是一個(gè)query的慢日志定義:

PUT /my_index/_settings

{

"index.search.slowlog.threshold.query.warn" : "10s",

"index.search.slowlog.threshold.fetch.debug": "500ms",

"index.indexing.slowlog.threshold.index.info": "5s"

}

上面設(shè)置的意思如下:

查詢慢于 10 秒輸出一個(gè) WARN 日志杖挣。

獲取慢于 500 毫秒輸出一個(gè) DEBUG 日志肩榕。

索引慢于 5 秒輸出一個(gè) INFO 日志。

(五)惩妇、ES的發(fā)現(xiàn)熱點(diǎn)功能

ES有個(gè)查詢集群熱點(diǎn)線程的功能株汉,這個(gè)功能在集群突然變慢的場(chǎng)景下特別有用,它將幫助你找到消耗資源最多的線程歌殃。熱點(diǎn)線程的使用方法如下:

curl 'http://localhost:9200/_nodes/hot_threads'

返回的結(jié)果中含有線程所在的節(jié)點(diǎn)信息乔妈、線程消耗資源的情況、線程名稱以及相關(guān)的堆棧信息氓皱,如下圖所示:

四路召、ES的性能

ES的性能主要從兩個(gè)維度來(lái)評(píng)估

(一)勃刨、ES VS InfluxDB

1、單節(jié)點(diǎn)ES和InfluxDB寫(xiě)入性能對(duì)比(數(shù)據(jù)來(lái)自:http://km.oa.com/articles/show/334237?kmref=search&from_page=1&no=1

結(jié)論:ES單節(jié)點(diǎn)寫(xiě)入性能最高在19w股淡,InfluxDB在15w身隐。在并發(fā)數(shù)超過(guò)20時(shí),ES與InfluxDB的寫(xiě)入性能均呈現(xiàn)出下降趨勢(shì)揣非。

2抡医、單節(jié)點(diǎn)ES和InfluxDB讀性能對(duì)比(數(shù)據(jù)來(lái)自:http://km.oa.com/articles/show/334237?kmref=search&from_page=1&no=1

結(jié)論:ES查詢性能整體比InfluxDB好很多,當(dāng)并發(fā)數(shù)較高時(shí)(40)早敬,ES查詢性能比InfluxDB高出近4倍忌傻,在2w左右。在并發(fā)線程數(shù)達(dá)到50時(shí)搞监,InfluxDB出現(xiàn)鏈接錯(cuò)誤水孩,拒絕查詢請(qǐng)求。

備注:測(cè)試結(jié)果只所以和influxDB官方測(cè)試數(shù)據(jù)比較大琐驴,我因?yàn)門(mén)EG側(cè)對(duì)es本身和influx的測(cè)試工具都做了很多優(yōu)化俘种,主要的優(yōu)化如下:

es優(yōu)化:關(guān)閉不必要的字段,routing绝淡,調(diào)整刷盤(pán)策略宙刘、shard數(shù)量等

influxDB測(cè)試工具優(yōu)化:支持routing、在保證查詢結(jié)果一致的情況下盡量?jī)?yōu)化查詢語(yǔ)句

(二)牢酵、ES VS MySQL

這部分的測(cè)試是采用人工寫(xiě)的SQL以及線上慢的SQL像結(jié)合的方式悬包,測(cè)試結(jié)果如下:

備注:MySQL測(cè)試數(shù)據(jù)采用的是innodb引擎,并采用50%的壓縮比馍乙。

從性能來(lái)看ES要比MySQL要好布近,尤其在聚合的場(chǎng)景下。

五丝格、ES替代監(jiān)控DB評(píng)估

1撑瞧、性能評(píng)估

從線上實(shí)際SQL評(píng)估,ES的性能要比MySQL的性能好100倍以上显蝌,性能方面應(yīng)該不是瓶頸预伺。

2、容量評(píng)估

優(yōu)化前ES實(shí)際占用容量和MySQL差不多曼尊,優(yōu)化后ES占用的容量為MySQL的40%左右扭屁。

3、可用性評(píng)估

ES本身有很好的伸縮機(jī)制和容災(zāi)機(jī)制涩禀,從目前的容災(zāi)測(cè)試來(lái)看,可用性能達(dá)到要求然眼。

4艾船、成本評(píng)估

目前監(jiān)控DB的瓶頸主要是在容量瓶頸,因此存儲(chǔ)量下降50%的情況下,設(shè)備量能下降到原來(lái)的50%屿岂,即成本下降50%践宴。

5、研發(fā)評(píng)估

ES目前無(wú)權(quán)限認(rèn)證(TEG已經(jīng)添加了ES的權(quán)限認(rèn)證功能)

不支持事務(wù)目前監(jiān)控側(cè)也暫時(shí)沒(méi)問(wèn)題爷怀。此外還有很大的部分需要研發(fā)側(cè)的評(píng)估阻肩,因?yàn)椴捎肊S后如下兩個(gè)地方會(huì)有很大的變動(dòng):

數(shù)據(jù)上報(bào)部分需要改寫(xiě)

查詢部分SQL以及格式處理需要改寫(xiě)

六、感謝

特別感謝TEG同事@johngqjiang的指點(diǎn)运授,順便廣告一下烤惊,TEG基于ES上開(kāi)發(fā)的時(shí)序數(shù)據(jù)庫(kù)CTSDB已經(jīng)開(kāi)始大規(guī)模試用,需要試用的同事可以找johngqjiang進(jìn)一步溝通吁朦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柒室,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逗宜,更是在濱河造成了極大的恐慌雄右,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纺讲,死亡現(xiàn)場(chǎng)離奇詭異擂仍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)熬甚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)逢渔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人则涯,你說(shuō)我怎么就攤上這事复局。” “怎么了粟判?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵亿昏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我档礁,道長(zhǎng)角钩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任呻澜,我火速辦了婚禮递礼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羹幸。我一直安慰自己脊髓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布栅受。 她就那樣靜靜地躺著将硝,像睡著了一般恭朗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上依疼,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天痰腮,我揣著相機(jī)與錄音,去河邊找鬼律罢。 笑死膀值,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的误辑。 我是一名探鬼主播沧踏,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼稀余!你這毒婦竟也來(lái)了悦冀?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤睛琳,失蹤者是張志新(化名)和其女友劉穎盒蟆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體师骗,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡历等,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辟癌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寒屯。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖黍少,靈堂內(nèi)的尸體忽然破棺而出寡夹,到底是詐尸還是另有隱情,我是刑警寧澤厂置,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布菩掏,位于F島的核電站,受9級(jí)特大地震影響昵济,放射性物質(zhì)發(fā)生泄漏智绸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一访忿、第九天 我趴在偏房一處隱蔽的房頂上張望瞧栗。 院中可真熱鬧,春花似錦海铆、人聲如沸迹恐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)殴边。三九已至通熄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間找都,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工廊酣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留能耻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓亡驰,卻偏偏與公主長(zhǎng)得像晓猛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凡辱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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