小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Elasticsearch的路由(Routing)特性

 憤怒的蔥花 2016-07-04

Elasticsearch路由機(jī)制介紹

Elasticsearch的路由機(jī)制與其分片機(jī)制有著直接的關(guān)系。Elasticsearch的路由機(jī)制即是通過哈希算法,將具有相同哈希值的文檔放置到同一個主分片中。這個和通過哈希算法來進(jìn)行負(fù)載均衡幾乎是一樣的。


而Elasticsearch也有一個默認(rèn)的路由算法:它會將文檔的ID值作為依據(jù)將其哈希到相應(yīng)的主分片上,這種算法基本上會保持所有數(shù)據(jù)在所有分片上的一個平均分布,而不會產(chǎn)生數(shù)據(jù)熱點(diǎn)。


而我們?yōu)槭裁磿枰远x的Routing模式呢?首先默認(rèn)的Routing模式在很多情況下都是能滿足我們的需求的——平均的數(shù)據(jù)分布、對我們來說是透明的、多數(shù)時候性能也不是問題。但是在我們更深入地理解我們的數(shù)據(jù)的特征之后,使用自定義的Routing模式可能會給我們帶來更好的性能。


假設(shè)你有一個100個分片的索引。當(dāng)一個請求在集群上執(zhí)行時會發(fā)生什么呢?

1. 這個搜索的請求會被發(fā)送到一個節(jié)點(diǎn)

2. 接收到這個請求的節(jié)點(diǎn),將這個查詢廣播到這個索引的每個分片上(可能是主分片,也可能是復(fù)制分片)

3. 每個分片執(zhí)行這個搜索查詢并返回結(jié)果

4. 結(jié)果在通道節(jié)點(diǎn)上合并、排序并返回給用戶


因為默認(rèn)情況下,Elasticsearch使用文檔的ID(類似于關(guān)系數(shù)據(jù)庫中的自增ID,當(dāng)然,如果不指定ID的話,Elasticsearch使用的是隨機(jī)值)將文檔平均的分布于所有的分片上,這導(dǎo)致了Elasticsearch不能確定文檔的位置,所以它必須將這個請求廣播到所有的100個分片上去執(zhí)行。這同時也解釋了為什么主分片的數(shù)量在索引創(chuàng)建的時候是固定下來的,并且永遠(yuǎn)不能改變。因為如果分片的數(shù)量改變了,所有先前的路由值就會變成非法了,文檔相當(dāng)于丟失了。


而自定義的Routing模式,可以使我們的查詢更具目的性。我們不必盲目地去廣播查詢請求,取而代之的是:我們要告訴Elasticsearch我們的數(shù)據(jù)在哪個分片上。


原來的查詢語句:“請告訴我,USER1的文檔數(shù)量一共有多少”

使用自定義Routing(在USESR ID上)后的查詢語句:“請告訴我,USER1的文檔數(shù)量一共有多少,它就在第三個分片上,其它的分片就不要去掃描了”


指定個性化路由

所有的文檔API(get,index,delete,update和mget)都能接收一個routing參數(shù),可以用來形成個性化文檔分片映射。一個個性化的routing值可以確保相關(guān)的文檔存儲到同樣的分片上——比如,所有屬于同一個用戶的文檔。


第一種方法,也是比較直觀的方法就是直接在請求的URL中指定routing參數(shù):

[plain] view plain copy
  1. curl -XPOST 'http://localhost:9200/store/order?routing=user123' -d '  
  2. {  
  3.     "productName": "sample",  
  4.     "customerID": "user123"  
  5. }'  

這樣我們就按照用戶的customerID的值將具有相同customerID的文檔置于同一分片上了。


第二種方法就是直接從文檔中提取到對應(yīng)的路由值:

[plain] view plain copy
  1. curl -XPUT 'http://localhost:9200/store/order/_mapping' -d '  
  2. {  
  3.     "order": {  
  4.         "_routing": {  
  5.             "required": true,  
  6.             "path": "customerID"  
  7.         }  
  8.     }  
  9. }'  

這樣的方法和第一種方法在效果上一樣的,但是有一點(diǎn)需要注意,相比于第一種方法這種方法的效率稍低,因為第一種方法直接就在請求的參數(shù)中確定了路由的值,而第二種方法中,首先需要將文檔讀入之后,再從中提取到對應(yīng)的路由值。


利用路由機(jī)制的查詢

利用路由機(jī)制的查詢也是非常簡單明了的,只需要在查詢中指定對應(yīng)的路由值即可:

[plain] view plain copy
  1. curl -XGET 'http://localhost:9200/store/order/_search?routing=user123' -d '  
  2. {  
  3.     "query": {  
  4.         "filtered": {  
  5.             "query": {  
  6.                 "match_all": {}  
  7.             },  
  8.             "filter": {  
  9.                 "term": {  
  10.                     "userID": "user123"  
  11.                 }  
  12.             }  
  13.         }  
  14.     }  
  15. }'  

通過指定的路由值,我們就可以直接定位到user123的文檔所在的分片,而不用一股腦的向索引的所有節(jié)點(diǎn)都發(fā)送請求。這樣的話,會大大減少系統(tǒng)資源的浪費(fèi)。


當(dāng)然,也可以同時指定多個路由值,方法也是顯而易見的,只需要在查詢參數(shù)中指定多個路由值即可:

[plain] view plain copy
  1. curl -XGET 'http://localhost:9200/forum/posts/?routing=Admin,Moderator' -d '{}'  


路由機(jī)制的總結(jié)

實際上,如果不明確指明使用路由機(jī)制,實際上路由機(jī)制也是在發(fā)揮作用的,只是默認(rèn)的路由值是文檔的id而已。而個性化路由的需求主要是和業(yè)務(wù)相關(guān)的。默認(rèn)的路由(如果是自動的生成的id)直觀上會把所有的文檔隨機(jī)分配到一個分片上,而個性化的路由值就是和業(yè)務(wù)相關(guān)的了。這也會造成一些潛在的問題,比如user123本身的文檔就非常多,有數(shù)十萬個,而其他大多數(shù)的用戶只有幾個文檔,這樣的話就會導(dǎo)致user123所在的分片較大,出現(xiàn)數(shù)據(jù)偏移的情況,特別是多個這樣的用戶處于同一分片的時候,現(xiàn)象會更明顯。具體的使用還是要結(jié)合實際的應(yīng)用場景來選擇的。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多