Solr的時區為什麼總是UTC? 從資料庫同步數據到Solr, 為什麼時間總是少了8小時? 要怎樣修改Solr的預設時區?這篇文章來做個實踐和探討. ...
目錄
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) 下拉右側的滾動條至底部, 可以看到時區屬性, 如下圖所示:
說明: 預設的時區為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
菜單, 即可發現時區已經修改成功.
參考資料
版權聲明
作者: ma_shoufeng(馬瘦風)
出處: 博客園 馬瘦風的博客
您的支持是對博主的極大鼓勵, 感謝您的閱讀.
本文版權歸博主所有, 歡迎轉載, 但請保留此段聲明, 併在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關人員法律責任的權利.