solrcloud使用中遇到的問題及解決方式

2021-09-08 17:52:50 字數 2220 閱讀 4820

首先宣告,我們團隊在使用solrcloud過程中踩了一些坑,同事(曉磊和首富)進行了總結,我列到我的部落格上做記錄用:

solr預設採用的時區是utc時區,而db中用的則是cst時區,這兩個時區本身就相差了8個小時。可以通過修改solr啟動配置solr_timezone="utc+08:00"將時區設定為cst。注意:修改solr_timezone只在匯入資料時起到自動轉換時區的作用。即使修改了以上配置,solr在展示資料時任然採用utc時區,通過solrj互動時任然需要手動轉換時區。

在搭建solr集群時,不同機器上的核心具有不同的命名例如:

127.0.0.1:8983上有financelog_shard1_replca1核

127.0.0.2:8983上有financelog_shard1_replca2核

127.0.0.3:8983上有financelog_shard1_replca3核

三個核共同組成了名為financelog的集群。

如果為三颱機器配置solr.nonobank.com網域名稱,通過ngx來做負載均衡是不行的,因為在具體方位時url中需要指定相應的核名。如

解決方案,通過solrj提供的solrcloudclient,通過zookeeper位址進行訪問。

solrclient首次連線需要較長的時間可以通過setzkconnecttimeout()方法設定乙個較長的超時時間。

solr對中文的原生支援較差,只能單個字分詞,如「真開心」只能分詞成:真、開、心,這樣在搜尋「心開」時該條同樣會被搜尋出來,這不是我們所想要的。

解決方案:使用icutokenizer替代solr預設的tokenizer,icutokenizer對中文有較好的分詞,可以將「真開心」只能分詞成:真、開心、真開心。

在solr啟動配置中新增1000將超過1s的查詢記錄。

可以將console的日誌級別由info調整為warn;或者控制日誌檔案的大小,如:

保證最多記錄10g的日誌檔案。

solr集群恢復在最壞的情況下需要2倍當前core的儲存空間,所以有時會出現磁碟空間不夠的情況。

solr本身會記錄最後一次執行增量匯入的時間,設為time1,下一次通過執行 select * from finance_log where update_time >= time1 找出增量資料。

丟失資料的根本原因在於db中一條記錄的update_time並不是該條記錄實際提交的時間(即出現在db中的時間)。

例如, db在8:00:00執行一條update語句更新一條資料data後,data的update_time會被設定為8:00:00,而對應事務實際提交(執行commit)的時間可能是 8:00:20。假設solr在8:00:10時執行增量匯入,執行後會記錄最後一次更新時間為8:00:10,此時由於data的更新狀態尚未被提交,其對應solr資料不會被更新。下一次執行增量匯入時通過select * from finance_log where update_time >= 8:00:10找出增量的資料時並不包含data,即data被丟失了。

效能方面

solr上線後我們發現了幾個效能方面的問題

分析:有可能和我們的vm配置有關,我們換成多cpu單核的情況下(8個cpu),cpu使用率上去了

分析: 初步懷疑是young heap設定了太小

解決方案:使用g1gc,增大了xmn後吞吐量提公升很明顯 (85%-> 98%)

分析:觀察log發現有很多oom的錯誤,通過分析一台solr的jvm heap,發現solr dump中的fieldcache佔了大約5g(不能被gc),fieldcache這個配置在solrcloud不能控制,是底層的lucene來控制,它是用來做sorting 和faceting的,也就是說我們業務中會在solr中進行大批量資料的排序(比如拿最大值是時候)。

解決方案:優化業務方每一次取排序資料的量

solr cloud 5 4 0安裝,,使用

1.解壓solr tar zvxf solr 5.4.0.tar.gz 2.檢視solr命令介紹 cd solr 5.4.0 bin solr 3.檢視solr啟動命令介紹 bin solr start help c or cloud 以集群模式啟動 z zookeeper的引數 4.啟動solr,...

solrcloud刪除active狀態的shard

solr工作在集群模式下時,一般很難在開始階段就能確定需要建立幾個分片,只有當資料量大到一定的程度時 比如建立索引速度明顯下降 這時我們可能就需要執行分片操作,但是有時我們有需要刪除多餘的shard,前提是這些shard有備份,否則可能導致資料缺失,但是我們是不能通過刪除當前處於active狀態的s...

PHP中file exists使用中遇到的問題小結

介紹 我發現了乙個問題,今天與大家分享。我把整個過程描述一下。ikwdeg 問題 公司有個框架是基於smarty寫的,我負責php的公升級,維護人員把新環境布上來之後,測試人員找我提出經常報錯 錯誤 提示找不到檔案的 我追蹤了一下 原來是smarty的這個地方報的錯誤。錯誤 這裡報出檔案不存在。思考...