SolrCloud5.0路由 Collection建與數據遷移

SolrCloud的設計是爲了提供高可用、容錯,在分佈式環境中進行內容索引和查詢請求。node

SolrCloud 5.0,對自帶的SolrCloud的啓動腳本進行了改進,啓動SolrCloud變的異常簡單,執行web

view source print ? 1. $ bin/solr –e cloud 根據提示輸入一些參數,便可啓動完成SolrCloud,部署啓動完成,以下圖算法

SolrCloud相關概念apache

SolrCloud中有四個關鍵名詞:core、collection、shard、node。json

core:在Solr單機環境中,core本質上就是單個index。若需有多個index,那必須建立多個core。在SolrCloud環境中,單個index能夠橫跨多個Solr實例,這意味着單個index是由不一樣機器上的多個cores組成。tomcat

collection:由core組成的邏輯index叫作collection,一個collection是跨越多個cores的index,這使index可擴展並冗餘備份。分佈式

shard:在SolrCloud中能夠有多個collections。Collections可被分片,每一個分片可有多個副本(Replica),同一副本下的相同分片稱爲shards。每一個shards下的有一個分片爲leader,該leader經過選舉策略產生。工具

node:SolrCloud中,node是運行Solr的Java虛擬機實例,也就是Server(例如Tomcat、Jetty)。 理解core和collection的區別很是重要。在傳統的單node solr中,core和collection的概念等同,都表明一個邏輯index。在SolrCloud中,多個nodes下的cores造成一個collection。 SolrCloud路由測試

SolrCloud中,提供了兩種路由算法: compositeIdimplicit 在建立Collection時,須要經過router.name指定路由策略,默認爲compositeId路由。ui

compositeId

該路由爲一致性哈希路由,shards的哈希範圍從80000000~7fffffff。初始建立collection是必須指定numShards,compositeId路由算法根據numShards的個數,計算出每一個shard的哈希範圍,所以路由策略不能夠擴展shard。 implicit

該路由方式指定索引具體落在路由到哪一個Shard,這與compositeId路由方式索引可均勻分佈在每一個shard上不一樣。同時只有在implicit路由策略下才可建立shard。

利用solrJ新建索引時,須要在代碼中指定索引具體落在哪一個shard上,添加代碼:

view source print ? 1. doc.addField("route", "shard_X"); 同時在schema.xml添加字段

view source print ? 1. <field name="_route_" type="string"/> 利用URL建立implicit路由方式collection:

http://10.21.17.200:9580/solr-5.0.0-web/admin/collections?action=CREATE&name=testimplicit&router.name=implicit&shards=shard1,shard2,shard3 SolrRouter源碼

在Solr源碼中,能夠看到,Solr路由的基類爲DocRouter抽象類,HashBasedRouter和ImplicitDouter繼承自DocRouter,同時CompositeIdRouter又繼承HashBasedRouter抽象類,經過一個工具Hash類實現Document的路由策略。

建立Collection

Solr建立Collection的兩種方式:

經過前臺界面Add Core建立collection

因爲在tomcat,setenv.sh,設置-DnumShards=7,因此該collection有7個shards。 須要注意的是:使用compositeId路由建立collection,指定numShards後,不可擴展Shard,即便勉強增長Shard,新建索引也不會落在該Shard上。查看clusterstate.json,可看到新建shard的"range":null

URL建立collection 經過URL建立collection須要知足條件:num of (shards + replications)< num of live nodes

測試環境中3臺solr機器,建立collection URL爲:

http://10.21.17.200:9580/solr-4.10.0/admin/collections?action=CREATE&name=collection1&router.name=compositeId&numShards=5&replicationFactor=1

執行結果報錯

<str name="Operation createcollection caused exception:">

org.apache.solr.common.SolrException:org.apache.solr.common.SolrException:Cannot create collection collection1. Value of maxShardsPerNode is 1, and thenumber of live nodes is 3. This allows a maximum of 3 to be created. Value ofnumShards is 5 and value of replicationFactor is 1. This requires 5 shards tobe created (higher than the allowed number)

</str> 報錯緣由不知足 5 + 1 < 3 數據遷移

在某些場景中,須要對SolrCloud進行擴容或數據遷移。

根據以上討論的兩種路由算法,implicit實現該需求比較簡單,只要建立Shard便可,新建索引時,將索引建到新建Shard上,查詢操做,指定collection名稱,獲得的還是整個集羣返回的結果。

compositeId路由實現上述需求稍微麻煩一下,經過分裂(SPLITSHARD)操做實現。以下圖,對Shard1進行分裂,分裂URL爲:

http://10.21.17.200:9580/solr-4.10.0-web/admin/collections?action=SPLITSHARD&collection=log4j201503&shard=shard1

此時Shard1的數據會平均分佈到shard1_0和shard1_1上,在利用DELETESHARD API刪除Shard1,便可保證數據不冗餘。

相關文章
相關標籤/搜索