Solr 17 - Solr的時間為什么比本地少8小時 (附修改方法)


1 為什么少8小時

(1) 原因:

Solr服務中默認使用的是UTC時間, 而中國本地時間為東八時區, 即比UTC標准時間多8小時.

(2) 示例:

① 中國內地服務器時間為2018-10-10 20:00:00, 系統將當前時間添加到Solr索引中時, Solr底層發現此時間的格式為UTC + 8, 它將對該時間減去8小時處理, 然后建立相關索引.
② 在查詢上述添加的時間時, Solr直接將索引信息返回, 變為: 2018-10-10T12:00:00Z ==> 時間少了8小時.

(3) 不同的時間格式:

  • UT, Universal Time, 世界時: 是基於天體觀察計算出來的時間, 是指英國格林尼治所在地的標准時間. 由於天體運行的一些不確定性(比如地球的自轉並不是勻速的, 而且正在緩慢減速), 所以UT時間並不均勻.
  • UTC, Universal Time Coordinate: 協調世界時, 是基於原子時鍾的時間, 是均勻的時間. 為了與UT時間保持較小的差距, UTC體系中增加了閏秒, 即某些年份的最后1分鍾有61秒.
  • GMT, Greenwish Mean Time, 格林尼治標准時間: 是人們對UTC的另一種稱法. 本初子午線被定義為英國倫敦郊區的皇家格林尼治天文台所在的經線, 此前人們將此地的時間當做標准時間, 但后來發現基於地球的時間並不准確, 在提出UTC概念后, 人們仍然自然地使用GMT來表達時間, 而此時的GMT == UTC.

2 如何查看Solr的時區

通過Solr Admin (Solr Web界面)查看:

(1) 進入Solr Admin, 點擊左側的Java Properties菜單, 進入Java屬性設置頁面;

(2) 下拉右側的滾動條至底部, 可以看到時區屬性, 如下圖所示:

Solr用戶本地系統的時區

說明: 默認的時區為UTC, 上圖是已經修改后的東八區(GMT+8).

3 修改Solr的時區

3.1 Solr從數據庫中同步數據的原理

① 我們知道, Solr中的數據源有很多是類似於MySQL的關系型數據庫, 也就是Solr通過其DIH(Data Import Handler)處理;

② Solr在更新數據時, 會記錄這些數據的最后更新時間戳, 保存在Collection/conf目錄下, 與db-data-config.xml文件同級, 文件內容類似於:

#Thu Jan 24 15:03:58 CST 2019
_delta.last_index_time=2019-01-08T05\:48\:21Z
_full.last_index_time=2019-01-24T07\:03\:37Z
last_index_time=2019-01-24T07\:03\:37Z

③ 在向MySQL、MongoDB等數據庫中寫入數據時, 添加類似於CreateTime的字段, 用於記錄數據的入庫時間戳;

④ 通過比較Solr和數據庫的更新時間戳, 完成對數據是否需要增量同步的判斷, 從而實現數據更新. 對比方式類似於:

<!-- MySQL中增量同步數據的配置類似於 -->
<entity name="BookShop_delta" 
     query="SELECT ID, Name, CreateTime FROM BookShop 
            WHERE CreateTime >= '${dataimporter.last_index_time}'" pk="ID">
<field column="ID" name="ID" />
<!-- ... -->
</entity>

<!-- MongoDB中增量導入數據的配置類似於 -->
<entity name="_delta" processor="MongoEntityProcessor"
		    query="{'CreateTime': {'$gte': ISODate('${dih.last_index_time}')}}"
     collection="BookShop" project="{_id:0, ID:1, Name:1, CreateTime:1}"
     datasource="ShopMongo" transformer="MongoMapperTransformer" >	
<field column="ID" name="ID" />
<!-- ... -->
</entity>

3.2 為什么要修改時區

由上述分析可知, 修改時區的原因主要是: 方便與數據庫中數據的自動同步.

一般情況下, MySQL等數據庫服務器的時區都與實際時區一致, 也就是東八區(GMT+8), 而Solr默認的時區是UTC, 與東八區(GMT+8)相差8個小時.

這種差距導致我們無法直接根據Solr的更新時間戳和MySQL等數據庫的更新時間戳進行比較, 從而使得數據的導入出現問題.

==> 所以需要修改Solr的時區.

3.3 如何修改時區

Solr的時區屬性所在配置文件, 在${SOLR_HOME}/bin下:

solr.in.sh是Linux系統下的啟動腳本, solr.in.cmd是Windows系統下的啟動腳本.

以Linux系統為例, 編輯solr.in.sh文件:

vim /data/solr-cloud/solr-4.10.4/bin/solr.in.sh

找到SOLR_TIMEZONE的相關配置: SOLR_TIMEZONE="UTC", 可以看出默認的時區是UTC, 而且被注釋掉了. 可將其修改為:

SOLR_TIMEZONE="UTC+8"

保存退出后, 重啟Solr服務, 然后再次進入Solr Admin管理界面, 查看Java Properties菜單, 即可發現時區已經修改成功.

參考資料

UT,UTC,GMT時間區別

Linux+Solr+Zookeeper-04:修改Solr的時區TIMEZONE

版權聲明

作者: 馬瘦風

出處: 博客園 馬瘦風的博客

您的支持是對博主的極大鼓勵, 感謝您的閱讀.

本文版權歸博主所有, 歡迎轉載, 但請保留此段聲明, 並在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關人員法律責任的權利.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM