2014-01-24 80 views
0

我已經看了很多論壇條目。SolrCloud與單獨索引和搜索加快搜索

我的用例是將非常規模式下從SQL Server到Solr的大量數據拉到Solr並且能夠快速搜索到它

我們目前的用戶界面定期更新SQL服務器上的數據,但我們的操作非常緩慢。我們希望能夠將所有數據最初從數據庫拖放到後臺批處理中的Solr,然後成爲能夠在一批中定期進口德爾塔進口(儘可能頻繁地)以儘可能保持數據接近實時。我還沒有做過任何測試,並且正在嘗試根據其他人的經驗提出一個架構來從...開始。

我聽說索引變慢查詢/搜索,我想爲我們的解決方案避免這種情況。我已經給了一個10-30分鐘的滯後時間,可以跟蹤用例中的軟件包 - 這意味着能夠在30分鐘內對三角洲進行索引。

有效負載很重,儘管跨多個表連接,但這只是爲了檢索它並將其轉儲到Solr端的非規範化模式。這個想法是真的加快了從非規格化Solr中搜索和檢索數據架構。

我更大的擔心是數據在全球範圍內定期更新,需要通過delta-imports通過一些腳本同步,可能需要3-5分鐘的時間間隔。我不希望這種增量索引進程完全影響搜索操作。

10萬行 - >非規格化 - >索引的大小 - > 30萬行

1000更新/分鐘

5000查詢/分鐘

隨着SolrCloud方法,我可以使用帶領導的主/從方法(作爲發生索引的主人)和 副本(在其上進行搜索) - 確切地說? Solr REST API將被我們的前端代碼訪問。 我也看過集合別名方法作爲另一種選擇,但是UI必須以某種方式定期指向一組新的集合。

由於索引確實需要時間才能將數據從RDBMS中提取到Solr索引中,我正在努力處理NRT數據。 添加softCommits似乎有自己的一套陷阱要知道。

任何幫助表示讚賞,

維傑

+0

我可以使用docId的前綴(如idx!docid1)將索引路由到SolrCloud的某個分片嗎?那我可以用q = ...&_ route_!= idx!從非索引碎片進行檢索? https://cwiki.apache.org/confluence/display/solr/Shards+and+Indexing+Data+in+SolrCloud – Vijay

回答

0

當我從您的需求理解,首先你需要有一個非常有效的SolrCloud結構。它應該包含CPU和RAM方面的優秀機器。通過solr size estimator來估算您的需求。

我建議你使用一些ETL(提取變換負載)工具進行Solr索引。它會從您的RDBMS中提取數據並將其索引到Solr。由於它將是Solr索引的單獨實例,它將減少您的應用程序負載。

+0

感謝您的評論。索引實例將如何與SolrCloud搜索實例進行通信? – Vijay

+0

SolrCloud可以通過Solr API調用或HTTP調用進行通信。 – buddy86

1

在Oracle中使用SolrCloud版本4構建了一個類似的系統來索引數據(約10億條目)。3,我想你應該考慮以下的設計挑戰:

1索引數據分佈:文檔在使用複合路由器碎片自動分發,基於計算的文檔的唯一鍵的哈希值。每個分片有一個領導和許多複製品。你必須認真考慮碎片的數量,因爲一旦創建了集羣,這個數字是固定的。自從版本4.4開始,Solr允許分片分割,但如果每個分片沒有被相同的因子分割,那麼你的簇將不會被平衡。當時我們已經測試了這個功能,但實現仍然不穩定。一旦獲得了碎片的數量和每個碎片的潛在大小,現在可以使用estimator mentionned by buddy86進行solr實例的大小調整。

2.索引數據:在我看來,直接訪問Solr REST API並不是一個好的開始。您應該使用solr java客戶端SolrJ,並使用CloudSolrServer爲您的數據建立索引。此實現與您表達的每個要求相匹配:更新直接發送到分片的領導者,並且搜索查詢在副本之間進行負載平衡(循環)。一旦文檔在領導者身上編入索引,就會自動使用HTTP將其分配給副本。爲了避免提交時出現問題,請求只使用commitWithins選項(〜1分鐘)。要擴大搜索容量,只需添加更多副本。

我們的系統中沒有使用隨Solr提供的ETL工具,因爲我們需要將更新索引到後端RDMBS(您的用例似乎是相同的),並且最終但不是很常見,我們爲了恢復目的,需要同時對整個數據庫進行重新索引。 ETL工具對於任務來說太簡單了,但它們可以匹配你的用例。

+0

Thx,Minh。目前,我無法使用DIH從DB中提取7.8百萬條記錄。我使用自定義Java程序將數據提取到每個100MB的csv文件並將其移入工作目錄。然後,我運行完全導入從UI(可以做一樣的捲曲scipt)將csv文件拖入Solr索引。我的自定義Java程序使用一個屬性文件來存儲最後一個TS,然後可以使用一些像調度程序的cron從表中進行delta-import每隔10-15分鐘。我每隔1分鐘設置一次NRT,並堅持提交5分鐘。我不使用CloudSolrServer,因爲我使用schema.xml並讓Solr完成它的工作。 – Vijay

+0

對此方法的任何想法。如果我們稍後需要,我計劃使用單獨的別名進行寫別名和讀別名。您最終會使用多少碎片和複製因子?看起來您可以稍後輕鬆添加副本,但不會分割。您如何處理索引更新?舊的主從複製不適用於NRT。 – Vijay

+1

在我們的用例中,我們有12個碎片,每個碎片上有1個引導和1個副本,分佈在兩個遠程站點上。更新由在表中寫入更新事件的數據庫觸發器檢測(只是一個唯一的ID)。索引進程會抓取此表以檢索該文檔的標識和索引。 –