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:
在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爲:
執行結果報錯
<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爲:
此時Shard1的數據會平均分佈到shard1_0和shard1_1上,在利用DELETESHARD API刪除Shard1,便可保證數據不冗餘。