1. 程式人生 > >服務器時間和數據庫時間的校驗

服務器時間和數據庫時間的校驗

more 工作 以及 ptime -m 服務端 如果 times calc

問題與分析

今天在公司進行Sanity Test(可用性測試)時發現服務器啟動失敗,查找log後發現在啟動時發生了異常導致了服務器啟動失敗。

由於公司的服務器和數據庫分別部署在不同的主機,所以會在啟動時進行時間上的校驗,如果兩臺主機的時間差超過600s就會拋出異常、啟動失敗。這個設定的時間差被存儲在數據庫中,以方便日後修改。
<! --more -->
而在代碼中,通過mybatis來讀取到這個存儲在db中的時間差,sql語句如下:

SELECT TO_CHAR(CURRENT_TIMESTAMP,‘YYYY-MM-DD HH24:MI:SS‘) AS "DBTIME";

而服務器的本地時間以及時間的校驗則是由下邊的代碼來實現:

final DateTime dbTime = systemMapper.getDBTime();
final long dbTimeMs = dbTime.getMilliseconds(TimeZone.getDefault());

final DateTime webAppTime = DateTime.now();
final long webAppTimeMs = webAppTime.getMilliseconds(TimeZone.getDefault());

// Calculate difference between WebApp time and DB time
final long timeDifferent = Math.abs(dbTimeMs - webAppTimeMs);

從代碼可以看到,將服務器和數據庫所在的主機的本地時間轉換成默認的時區後,再進行相減取絕對值,如果這個結果值超過db中設定的時間差(也就是600s)就會拋出異常,令服務器啟動失敗。

分析到這裏,便開始進行驗證:分別連接到兩臺主機並通過date命令來查詢各自的時間,發現雙方的時間差大概有15分鐘左右,確實超過了600s。

於是問題來了,為什麽會忽然出現這麽大的時間差?明明昨天還可以正常啟動,今天卻因為時間差變大而導致失敗了?可以確定的是,db中設定的時間差一直就是600s,並沒有人去改動它。

在工作群裏說了下服務器啟動失敗的原因,有同事說可能是機器斷電造成的?百度了下,也有人遇到這種類似的情況,Linux的系統時間忽然變慢了幾分鐘到十幾分鐘,也有的是時間變快了。暫時沒找到具體的原因,解決辦法基本都是直接修改系統時間。

目前看來,這個問題的答案是無法得知了,對於這方面我確實不了解。如果哪位朋友知道的,歡迎評論告訴我一下O(∩_∩)O哈哈~

今天寫篇文章記錄下這個問題,以前我還真沒想到需要對不同主機的服務器和數據庫進行時間校驗,百度了下,倒是發現很多安卓app關於客戶端和服務端進行時間校驗的文章,挺有意思的。

服務器時間和數據庫時間的校驗