天天看點

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

Solr的時區為什麼總是UTC? 從資料庫同步資料到Solr, 為什麼時間總是少了8小時? 要怎樣修改Solr的預設時區?這篇文章來做個實踐和探讨.

目錄

  • 1 為什麼少8小時
  • 2 如何檢視Solr的時區
  • 3 修改Solr的時區
    • 3.1 Solr從資料庫中同步資料的原理
    • 3.2 為什麼要修改時區
    • 3.3 如何修改時區
  • 參考資料
  • 版權聲明

(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.

通過Solr Admin (Solr Web界面)檢視:

(1) 進入Solr Admin, 點選左側的

Java Properties

菜單, 進入Java屬性設定頁面;

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

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

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

① 我們知道, 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>
           

由上述分析可知, 修改時區的原因主要是: 友善與資料庫中資料的自動同步.

一般情況下, MySQL等資料庫伺服器的時區都與實際時區一緻, 也就是東八區(GMT+8), 而Solr預設的時區是UTC, 與東八區(GMT+8)相差8個小時.

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

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

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

作者: 馬瘦風

出處: 部落格園 馬瘦風的部落格

您的支援是對部落客的極大鼓勵, 感謝您的閱讀.

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

繼續閱讀