億級規模的Elasticsearch優化實戰
本次分享主要包含兩個方面的實戰經驗:索引效能和查詢效能。
一. 索引效能(Index Performance)
首先要考慮的是,索引效能是否有必要做優化?
索引速度提高與否?主要是看瓶頸在什麼地方,若是 Read DB(產生DOC)的速度比較慢,那瓶頸不在 ElasticSearch 時,優化就沒那麼大的動力。實際上 Elasticsearch 的索引速度還是非常快的。
我們有一次遇到 Elasticsearch 升級後索引速度很慢,查下來是新版 IK 分詞的問題,修改分詞外掛後得到解決。
如果需要優化,應該如何優化?
SSD 是經濟壓力能承受情況下的不二選擇。減少碎片也可以提高索引速度,每天進行優化還是很有必要的。在初次索引的時候,把 replica 設定為 0,也能提高索引速度。
bulk 是不是一定需要呢?
若是 Elasticsearch 普通索引已經導致高企的 LA,IO 壓力已經見頂,這時候 bulk 也無法提供幫助,SSD 應該是很好的選擇。
在 create doc 速度能跟上的時候,bulk 是可以提高速度的。
記得 threadpool.index.queue_size ++,不然會出現索引時佇列不夠用的情況。
indices.memory.index_buffer_size:10% 這個引數可以進行適當調整。
調整如下引數也可以提高索引速度:index.translog.flush_threshold_ops:50000 和 refresh_interval。
二. 查詢效能(Query Perofrmance)
王道是什麼?routing,routing,還是 routing。
我們為了提高查詢速度,減少慢查詢,結合自己的業務實踐,使用多個叢集,每個叢集使用不同的 routing。比如,使用者是一個routing維度。
在實踐中,這個routing 非常重要。
我們碰到一種情況,想把此維度的查詢(即使用者查詢)引到非使用者routing 的叢集,結果叢集完全頂不住!
在大型的本地分類網站中,城市、類目也是一個不錯的維度。我們使用這種維度進行各種搭配。然後在前端分析查詢,把各個不同查詢分別引入合適的叢集。這樣做以後,每個叢集只需要很少的機器,而且保持很小的 CPU Usage 和 LA。從而查詢速度夠快,慢查詢幾乎消滅。
分合?
分別(索引和routing)查詢和合並(索引和routing)查詢,即此分合的意思。
索引越來越大,單個 shard 也很巨大,查詢速度也越來越慢。這時候,是選擇分索引還是更多的shards?
在實踐過程中,更多的 shards 會帶來額外的索引壓力,即 IO 壓力。
我們選擇了分索引。比如按照每個大分類一個索引,或者主要的大城市一個索引。然後將他們進行合併查詢。如:http://cluster1:9200/shanghai,beijing/_search?routing=fang,自動將查詢中城市屬性且值為上海或北京的查詢,且是房類目的,引入叢集 cluster1,並且routing等於fang。
http://cluster1:9200/other/_search?routing=jinan,linyi。小城市的索引,我們使用城市做 routing,如本例中同時查詢濟南和臨沂城市。
http://cluster1:9200/_all/_search,全部城市查詢。
再如: http://cluster2:9200/fang,che/_search?routing=shanghai_qiche,shanghai_zufang,beijing_qiche,beijing_zufang。查詢上海和北京在小分類汽車、整租的資訊,那我們進行如上合併查詢。並將其引入叢集 cluster2。
使用更多的 shards?
除了有 IO 壓力,而且不能進行全部城市或全部類目查詢,因為完全頂不住。
Elastic 官方文件建議:一個 Node 最好不要多於三個 shards。
若是 "more shards”,除了增加更多的機器,是沒辦法做到這一點的。
分索引,雖然一個 Node 總的shards 還是挺多的,但是一個索引可以保持3個以內的shards。
我們使用分索引時,全量查詢是可以頂住的,雖然壓力有點兒高。
索引越來越大,資源使用也越來越多。若是要進行更細的叢集分配,大索引使用的資源成倍增加。
有什麼辦法能減小索引?顯然,建立 doc 時,把不需要的 field 去掉是一個辦法;但是,這需要對業務非常熟悉。
有啥立竿見影的辦法?
根據我們資訊的特點,內容(field:description)佔了索引的一大半,那我們就不把 description 索引進 ES,doc 小了一倍,叢集也小了一倍,所用的資源(Memory, HD or SSD, Host, snapshot儲存,還有時間)大大節省,查詢速度自然也更快。
那要查 description 怎麼辦?
上面的例項中,我們可以把查詢引入不同叢集,自然我們也可以把 description 查詢引入一個非實時(也可以實時)叢集,這主要是我們業務特點決定的,因為description查詢所佔比例非常小,使得我們可以這樣做。
被哪些查詢搞過?第一位是 Range 查詢,這貨的效能真不敢恭維。在最熱的查詢中,若是有這貨,肯定是非常痛苦的,網頁變慢,查詢速度變慢,叢集 LA 高企,嚴重的時候會導致叢集 shard 自動下線。所以,建議在最熱的查詢中避免使用 Range 查詢。
Facet 查詢,在後續版本這個被 aggregations 替代,我們大多數時候讓它在後端進行運算。
三. 其他
1)執行緒池
執行緒池我們預設使用 fixed,使用 cached 有可能控制不好。主要是比較大的分片 relocation時,會導致分片自動下線,叢集可能處於危險狀態。在叢集高壓時,若是 cached ,分片也可能自動下線。自 1.4 版本後,我們就一直 fixed,至於新版是否還存在這個問題,就沒再試驗了。
兩個原因:一是 routing王道帶來的改善,使得叢集一直低壓執行;二是使用fixed 後,已經極少遇到自動下線shard了。
我們前面說過,user 是一個非常好的維度。這個維度很重要,routing 效果非常明顯。其他維度,需要根據業務特點,進行組合。
所以我們的叢集一直是低壓執行,就很少再去關注新版本的 使用 cached 配置問題。
hreadpool.search.queue_size 這個配置是很重要的,一般預設是夠用了,可以嘗試提高。
2)優化
每天優化是有好處的,可以大大改善查詢效能。max_num_segments 建議配置為1。雖然優化時間會變長,但是在高峰期前能完成的話,會對查詢效能有很大好處。
3) JVM GC的選擇:選擇 G1還是 CMS?
應該大多數人還是選擇了 CMS,我們使用的經驗是 G1 和 CMS 比較接近;但和 CMS 相比,還是有一點距離,至少在我們使用經驗中是如此。
JVM 32G 現象?
128G記憶體的機器配置一個 JVM,然後是巨大的 heapsize (如64G)?
還是配多個 JVM instance,較小的 heapsize(如32G)?
我的建議是後者。實際使用中,後者也能幫助我們節省不少資源,並提供不錯的效能。具體請參閱 “Don’t Cross 32 GB!" (https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.html#compressed_oops)
跨 32G 時,有一個現象,使用更多的記憶體,比如 40G,效果還不如31G!
這篇文件值得大家仔細閱讀。
JVM 還有一個配置 bootstrap.mlockall: true,比較重要。這是讓 JVM 啟動的時候就 鎖定 heap 記憶體。
有沒有用過 較小的 heapsize,加上SSD?我聽說有人使用過,效果還不錯,當然,我們自己還沒試過。
4)外掛工具
推薦 kopf,是一個挺不錯的工具,更新及時,功能完備,可以讓你忘掉很多 API :)。
索引,查詢,和一些重要的配置,是今天分享的重點。
Q&A
Q1:您建議生產環境JVM採用什麼樣的引數設定?FULL GC頻率和時間如何?
CMS 標準配置。
ES_HEAP_NEWSIZE=?G
JAVA_OPTS="$JAVA_OPTS -XX:+UseCondCardMark"
JAVA_OPTS="$JAVA_OPTS -XX:CMSWaitDuration=250"
JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC"
JAVA_OPTS="$JAVA_OPTS -XX:CMSInitiatingOccupancyFraction=75"
JAVA_OPTS="$JAVA_OPTS -XX:+UseCMSInitiatingOccupancyOnly"
Full GC 很少去care 它了。我們使用 Elasticsearch 在JVM上花的時間很少。
Q2:生產環境伺服器如何配置價效比較高?單機CPU核數、主頻?記憶體容量?磁碟容量?
記憶體大一些,CPU 多核是必要的,JVM 和 Elasticsearch 會充分使用記憶體和多核的。 關於記憶體容量的問題,很多是 JVM Tunning 的問題。 磁碟容量沒啥要求。
Q3: 分組統計(Facet 查詢或 aggregations )大多數時候讓它在後端進行運算,怎麼實現?應用如果需要實時進行統計而且併發量較大,如何優化?
因為我們是網站系統,所以對於 Facet 請求,引導到後端慢慢計算,前端初始的時候可能沒資料,但是此後就會有了。
如果是精確要求的話,那就只能從 提高 facet 查詢效能去下手,比如 routing、filter、cache、更多的記憶體...
Q4:存進Elasticsearch的資料,timestamp是UTC時間,Elasticsearch叢集會在UTC 0點,也就是北京時間早上8點自動執行優化?如何改引數設定這個時間?
我們沒有使用Elasticsearch的自動優化設定。自己控制優化時間。
Q5:我的Java程式,log4j2 Flume appender,然後機器上的Flume agent ,直接Elasticsearch 的sink avro到 es節點上,多少個agent 連在單個Elasticsearch節點比較合適 ?
ElasticSearch本身是一個分散式計算叢集,所以,請求平均分配到每個 node 即可。
Q6:我程式碼裡直接用 Java API 生成Flume appender 格式,Flume agent 裡interceptor去拆分幾個欄位,這樣是不是太累了?比較推薦的做法是不是還是各業務點自己控制欄位,呼叫Elasticsearch API 生成索引內容?
業務點自己控制生成的文件吧?如果需要產生不同routing,並且分了索引,這些其實是業務相關的。routing和不同索引,都是根據業務情況哪些查詢比較集中而進行處理的。
Q7:您見過或管理過的生產環境的Elasticsearch資料量多大?
我們使用 Elasticsearch 進行某些業務處理,資料量過億。
Q8:SSD效能提升多少?
SSD 對索引幫助非常大,效果噹噹的,提高几十倍應該是沒問題。不過,我們沒有試過完全使用SSD頂查詢,而是使用記憶體,記憶體價效比還是不錯的。
Q9:我們現在有256個shard,用uid做routing,所有查詢都是走routing。每個shard有30多G,每次擴容很慢,有什麼建議?
可以考慮使用分合查詢嗎? 或者使用更多的維度? 256個 shard 確實比較難以控制。但是如果是分索引和查詢,比more shards(256) 效果應該會好不少。
Q10:Elasticsearch排序等聚合類的操作需要用到fielddata,查詢時很慢。新版本中doc values聚合查詢操作效能提升很大,你們有沒有用過?
Facet 查詢需要更大的記憶體,更多的 CPU 資源。可以考慮routing、filter、cache等多種方式提高效能。
Aggs 將來是要替換 Facet,建議儘快替換原來的facet API。
Q11:Elasticsearch配置bootstrap.mlockall,我們在使用中發現會導致啟動很慢,因為Elasticsearch要獲取到足夠的記憶體才開始啟動。
啟動慢是可以接受的,啟動慢的原因也許是記憶體沒有有效釋放過,比如檔案 cached了。 記憶體充足的情況下,啟動速度還是蠻快的,可以接受。 JVM 和 Lucene 都需要記憶體,一般是JVM 50%, 剩下的50% 檔案cached 為Lucene 使用。
Q12:優化是一個開銷比較大的操作,每天優化的時候是否會導致查詢不可用?如何優化這塊?
優化是開銷很大的。不會導致查詢不可用。優化是值得的,大量的碎片會導致查詢效能大大降低。 如果非常 care 查詢,可以考慮多個叢集。在優化時,查詢 skip 這個叢集就可以。
Q13:Elasticsearch適合做到10億級資料查詢,每天千萬級的資料實時寫入或更新嗎?
10億是可以做到的,如果文件輕量,10億所佔的資源還不是很多。
ELK 使用 Elasticsearch ,進行日誌處理每天千萬是小case吧?
不過我們除了使用 ELK 進行日誌處理,還進行業務處理,10億級快速查詢是可以做到,不過,需要做一些工作,比如索引和shards的分分合合:)
Q14:Elasticsearch相比Solr有什麼優勢嗎?
我們當年使用 Solr 的時候,Elasticsearch 剛出來。他們都是基於 Lucene的。 Elasticsearch 相對於 solr ,省事是一個優點。而且現在 Elasticsearch 相關的應用軟體也越來越多。Solr 和 Lucene 整合度很高,更新版本是和Lucene一起的,這是個優點。
很多年沒用 Solr了,畢竟那時候資料量還不大,所以折騰的就少了,主要還是折騰 JVM。所以,就不再過多的比較了。
Q15:分詞用的什麼元件?Elasticsearch自帶的嗎?
我們使用 IK 分詞,不過其他分詞也不錯。IK分詞更新還是很及時的。而且它可以遠端更新詞典。:)
Q16: reindex有沒有好的方法?
reindex 這個和 Lucene 有關,它的 update 就是 delete+ add。
Q17:以上面的兩個例子為例 : 是儲存多份同樣的資料麼?
是兩個叢集。第一個叢集使用大城市分索引,不過,還有大部分小城市合併一個索引。大城市還是用類目進行routing,小城市合併的索引就使用城市進行routing 。
第二個叢集,大類分得索引,比如fang、che,房屋和車輛和其他類目在一個叢集上,他們使用 city+二級類目做routing。
Q18:叢集部署有沒有使用 Docker ? 我們使用的時候 ,同一個伺服器 節點之間的互相發現沒有問題 ,但是跨機器的時候需要強制指定network.publish_host 和discovery.zen.ping.unicast.hosts 才能解決叢集互相發現問題。
我們使用puppet進行部署。暫沒使用 Docker。 強制指定network.publish_host 和discovery.zen.ping.unicast.hosts 才能解決叢集,跨IP段的時候是有這個需要。
Q19:您建議採用什麼樣的資料匯流排架構來保證業務資料按routing寫入多個Elasticsearch叢集,怎麼保證多叢集Elasticsearch中的資料與資料庫中資料的一致性?
我們以前使用 php在web程式碼中進行索引和分析 query,然後引導到不同叢集。 現在我們開發了一套go rest系統——4sea,使用 redis + elastic 以綜合提高效能。
索引時,更新db的同時,提交一個文件 ID 通知4sea 進行更新,然後根據配置更新到不同叢集。
資料提交到查詢時,就是分析 query 並引導到不同叢集。
這套 4sea 系統,有機會的可以考慮開源,不算很複雜的。
Q20: 能介紹一下Elasticsearch的叢集rebanlance、段合併相關的原理和經驗嗎?
“段”合併?,我們是根據業務特點,產生幾個不一樣的叢集,主要還是 routing 不一樣。
shards 比較平均很重要的,所以選擇routing 維度是難點,選擇城市的話,大城市所在分片會非常大,此時可以考慮 分索引,幾個大城市幾個索引,然後小城市合併一個索引。
如果 shards 大小分佈平均的話,就不關心如何 allocation 了。
Q21:關於叢集rebalance,其實就是cluster.routing.allocation配置下的那些rebalance相關的設定,比如allow_rebalance/cluster_concurrent_rebalance/node_initial_primaries_recoveries,推薦怎麼配置?
分片多的情況下,這個才是需要的吧。
分片比較少時,allow_rebalance disable,然後手動也可以接受的。
分片多,一般情況會自動平衡。我們對主從不太關心。只是如果一臺機器多個 JVM instance (多個 Elasticsearch node)的話,我們寫了個指令碼來避免同一shard 在一臺機器上。
cluster_concurrent_rebalance 在恢復的時候根據情況修改。正常情況下,再改成預設就好了。
node_initial_primaries_recoveries,在保證叢集低壓的情況下,不怎麼care。
kopf 上面有好多這種配置,你可以多試試。
Q22:合併查詢是非同步請求還是同步請求?做快取嗎?
合併查詢是 Elasticsearch 自帶 API。
Q23:用httpurlconnection請求的時候,會發現返回請求很耗時,一般怎麼處理?
儘可能減少慢查詢吧?我們很多工作就是想辦法如何減少慢查詢,routing和分分合合,就是這個目的。
Q24:生產環境單個節點儲存多少G資料?
有大的,有小的。小的也幾十G了。不過根據我們自己的業務特點,某些叢集就去掉了全文索引。唯一的全文索引,使用基本的routing(比較平衡的routing,比如user。城市的話,就做不到平衡了,因為大城市資料很多),然後做了 快照,反正是增量快照,1小時甚至更短時間都可以考慮!!!去掉全文索引的其他業務叢集,就小多了。
相關推薦
億級規模的Elasticsearch優化實戰
本次分享主要包含兩個方面的實戰經驗:索引效能和查詢效能。 一. 索引效能(Index Performance) 首先要考慮的是,索引效能是否有必要做優化? 索引速度提高與否?主要是看瓶頸在什麼地方,若是 Read DB(產生DOC)的速度比較慢,那瓶頸不在
我是如何用單機實現億級規模題庫去重的?
流程 algo 今天 函數 分布 github .com 角度 比例 背景 最近工作中遇到了一個問題:如何對大規模題庫去重?公司經過多年的積累,有著近億道題目的題庫,但是由於題目來源不一導致題庫中有很多重復的題目,這些重復的題目在檢索時,除了增加搜索引擎的計算量外,並不會提
【HBase調優】Hbase萬億級儲存效能優化總結
背景:HBase主叢集在生產環境已穩定執行有1年半時間,最大的單表region數已達7200多個,每天新增入庫量就有百億條,對HBase的認識經歷了懵懂到熟的過程。為了應對業務資料的壓力,HBase入庫也由最初的單機多執行緒升級為有容災機制的分散式入庫,為及早發現叢集中的問題,還開發了一套對HBas
一文解析Hbase萬億級儲存效能優化
背景 hbase主叢集在生產環境已穩定執行有1年半時間,最大的單表region數已達7200多個,每天新增入庫量就有百億條,對hbase的認識經歷了懵懂到熟的過程。為了應對業務資料的壓力,hbase入庫也由最初的單機多執行緒升級為有容災機制的分散式入庫,為及早發現叢集中的問題,還開發了一套對hb
億級資料mysql優化
億級資料優化 情況簡介 使用者分析系統以使用者的心跳資料為依據,統計查詢使用者的各種情況。心跳資料很多,經過去重,去無效,資料量還是在2億/月的水平。普通的查詢在這個量級的資料庫上根本查不出來,為此,分表分庫、優化查詢、多執行緒查詢就很有必要了。 分表分庫
Hbase萬億級儲存效能優化總結
2014年12月07日 23:49:30 代立冬 閱讀數:12191更多 背景 hbase主叢集在生產環境已穩定執行有1年半時間,最大的單表region數已達7200多個,每天新增入庫量就有百億條,對hbase的認識經歷了懵懂到熟的過程。為了應對業
ElasticSearch 優化實戰
二. 查詢效能(Query Perofrmance) 王道是什麼?routing,routing,還是 routing。 我們為了提高查詢速度,減少慢查詢,結合自己的業務實踐,使用多個叢集,每個叢集使用不同的 routing。比如,使用者是一個routing維度
百億級資料處理優化
最近在做大資料處理時,遇到兩個大表 join 導致資料處理太慢(甚至算不出來)的問題。我們的數倉基於阿里的 ODPS,它與 Hive 類似,所以這篇文章也適用於使用 Hive 優化。處理優化問題,一般是先指定一些常用的優化引數,但是當設定引數仍然不奏效的時候,我們就要結合具體的業務,在 SQL 上做優化了。為
億級 Elasticsearch 性能優化
eba 路由 方式 use 跟蹤系統 lte 順序 hash 堆內存 前言 最近一年使用 Elasticsearch 完成億級別日誌搜索平臺「ELK」,億級別的分布式跟蹤系統。在設計這些系統的過程中,底層都是采用 Elasticsearch 來做數據的存儲,並且數據量都超
JAVA架構師大型分布式高並發電商項目實戰,性能優化,集群,億級高並發,web安全,緩存架構實戰
調用 希望 lec nta 微信 只有一個 常見問題 字段 屬性。 現任58到家技術委員會主席,高級技術總監,負責企業,支付,營銷、客戶關系等多個後端業務部門。本質,技術人一枚。互聯網架構技術專家,“架構師之路”公眾號作者。曾任百度高級工程師,58同城高級架構師,58
JAVA架構師大型分散式高併發電商專案實戰,效能優化,叢集,億級高併發,web安全,快取架構實戰
現任58到家技術委員會主席,高階技術總監,負責企業,支付,營銷、客戶關係等多個後端業務部門。本質,技術人一枚。網際網路架構技術專家,“架構師之路”公眾號作者。曾任百度高階工程師,58同城高階架構師,58同城技術委員會主席,58同城C2C技術部負責人。 內容介紹 1.大資
財務平臺億級資料量毫秒級查詢優化之elasticsearch原理解析
財務平臺進行分錄分表以後,隨著資料量的日漸遞增,業務人員對賬務資料的實時分析響應時間越來越長,體驗性慢慢下降,之前我們基於mysql的效能優化做了一遍,可以說基於mysql該做的優化已經基本上都做了,本次是基於elasticsearch對其做進一步的效能優化
十億級視頻播放技術優化揭密
切換ip 安卓系統 https 移動客戶端 思考 智能 不出 獲取 cnblogs 本文為轉載文章,文章來自:王輝|十億級視頻播放技術優化揭密 QCon是由InfoQ主辦的全球頂級技術盛會,每年在倫敦、北京、東京、紐約、聖保羅、上海、舊金山召開。自 2007年
TOP100summit:【分享實錄-QQ空間】10億級直播背後的技術優化
rac rtmp d3d 占比 sha 壓縮 off 特殊 取數據 本篇文章內容來自2016年TOP100summit QQ空間客戶端研發總監王輝的案例分享。編輯:Cynthia 王輝:騰訊SNG社交平臺部研發總監、騰訊QQ空間移動客戶端技術負責人高級工程師。09年起負責
億級流量電商詳情頁系統實戰-緩存架構+高可用服務架構+微服務架構第二版視頻教程
class 全文檢索 ron pan 教程 ec2 dubbo sgx 技術經理 14套java精品高級架構課,緩存架構,深入Jvm虛擬機,全文檢索Elasticsearch,Dubbo分布式Restful 服務,並發原理編程,SpringBoot,SpringCloud
雜文筆記《Redis在萬億級日訪問量下的中斷優化》
class min QQ BE 虛擬網卡 筆記 mps 重點 研究 雜文筆記《Redis在萬億級日訪問量下的中斷優化》 Redis在萬億級日訪問量下的中斷優化 https://mp.weixin.qq.com/s?__biz=MjM5ODI5Njc2MA==&mi
如何用elasticsearch構架億級資料採集系統(第1集:非生產環境windows安裝篇)
(一)做啥的? 基於Elasticsearch,可以為實現,大資料量(億級)的實時統計查詢的方案設計,提供底層資料框架。 本小節jacky會在非生產環境下,在 window 系統下,給大家分享著部分的相關內容。 (二)Elasticsearch的安裝 2.1 版本選擇:ela
仿微信 IM後臺 億級流量實戰
億級流量IM的應用場景 隨著移動網際網路、AI的飛速發展,高效能高併發IM(即時通訊),有著非常廣泛的應用場景。 一切高實時性通訊、訊息推送的場景,都需要高併發 IM 。 私信、聊天、大規模推送、視訊會議、彈幕、抽獎、互動遊戲、基於位置的應用(Uber、滴滴司機位置)、線上教育、智慧家居等。 有這
仿微信 IM後臺(億級流量高併發) 瘋狂實戰
仿微信 億級流量 IM後臺 實戰 分散式、高併發、億級流量—— 瘋狂創客圈 死磕Netty 系列之10 億級流量IM的應用場景 隨著移動網際網路、AI的飛速發展,高效能高併發IM(即時通訊),有著非常廣泛的應用場景。 一切高實
億級Web系統搭建:快取機制的建立和優化
好記憶不如爛筆頭,能記下點東西,就記下點,有時間拿出來看看,也會發覺不一樣的感受。 這篇文章不錯,做系統的時候,很多地方都用到了! 在Web負載均衡(請戳我)中我們講完了Web系統的負載均衡策略,現在我們開始關注我們Web系統自身的效能問題。我們的Web站點隨著訪問量的上升,會