2013-12-09 53 views

回答

1

簡短的回答是不容易,而不是自動,因爲一個特定的分片已滿。原因是32位散列範圍在每個碎片之間平均分配,Solr使用雜音散列算法,該算法可以使每個碎片中的文檔數保持平衡(大致),因此大多數節點幾乎都會開始遇到相同的限制同時,所以您需要監視您的索引併爲其提前或之後進行計劃。在此上下文中有兩個選項首先,自定義散列允許您根據某個常用字段值(例如租戶ID)將文檔路由到特定的分片。另一個例子是基於類別路由文檔。使用自定義散列時最大的擔憂是它可能會在您的羣集中創建不平衡的碎片。第二個選項是碎片拆分,允許您將現有碎片拆分爲兩個子碎片。要執行分片分割,請使用集合API的SPLITSHARD操作將現有分片分割爲兩個子分支。分割過程完成後發出「硬」提交以使新的子頻道處於活動狀態。從集羣中卸載原始分片。

但是,如果您仍然選擇強制文檔到特定分片,因爲您知道其他分片已滿,您可以這樣做:Solr 4.5增加了使用router.name參數指定路由器實現的功能。如果使用「compositeId」路由器,則可以在文檔ID中使用前綴發送文檔,該文檔ID將用於計算散列Solr用於確定文檔發送到索引的分片。前綴可以是任何你想要的(例如,它不一定是碎片名稱),但它必須一致,以便Solr的行爲一致。例如,如果您想爲客戶共同定位文檔,則可以使用客戶名稱或ID作爲前綴。例如,如果您的客戶是「IBM」,並帶有ID爲「12345」的文檔,則應在文檔ID字段中插入前綴:「IBM!12345」。感嘆號('!')在這裏非常關鍵,因爲它定義了將文檔引導到​​的分片。

您可以在這裏閱讀更多關於它的信息:https://cwiki.apache.org/confluence/display/solr/Shards+and+Indexing+Data+in+SolrCloud

+0

感謝Arun的回覆。 – buddy86

+0

我基本上是在尋找Solr中的任何自動路由。如果它不在那裏,那麼只剩下兩個選項。一種是使用SPLITSHARD並增加SolrCloud空間。另一個是使用「自定義分片」並將數據路由到其他分片。目前我正在使用solr-4.2.1。在solr-4.5.0中,所有的收集API都無法正常工作。他們在solr-4.6.0中工作,這是Solr的最新版本。 – buddy86