1. 程式人生 > >生產環境應用時好時壞

生產環境應用時好時壞

生產環境應用時好時壞


異常描述

  • 系統現狀:手動發版方式,依次執行 build beta host
    • build 執行打包,重新編譯 war 包
    • beta 釋出備機,將主機從 nginx 中移除
    • host 釋出主機,將備機從 nginx 中移除
    • 雙機部署,但不是雙機輪訓,而是主從部署,因為 nginx 與 主機部署於同一臺機器;換句話說如果主機出現問題,則整個服務癱瘓
  • 本次修改內容很少,修改靜態頁面及兩行程式碼
  • 專案發版後,測試驗收通過;產品驗收通過
  • 於是去開會
  • 兩分鐘後測試來找,出現問題;問題描述如下:
    • 提示下單異常,專案中增加了一個異常的丟擲,如果商品的標識不是指定的三種標識之一,提示商品不是本次指定的贈品,防止惡意下單
    • 發生異常的程式碼不是本次修改的內容,而是以前的內容;本次增加判斷增加第三種情況;舊的程式碼未被改掉,新的程式碼未生效
      • 發版失敗,war包沒有被替換
      • 遺漏機器,有的機器沒有釋出,沒有替換最新war包
    • 檢查資料,無誤,group by description 就三種標識,沒有第四種情況
    • 檢查程式碼,無誤,改動量十分的小,原來是兩種贈品,現增加了一種,加了一段 if else
  • 頁面資料是否有快取或結算介面查詢資料是否有快取
    • 查詢KEY值,情況快取 ;問題依舊
  • 檢查發版機器上的WAR包,是否是最新程式碼
  • 檢查發版機器是否啟動正常
    • 檢查 tomcat catalina.log 是否正常
  • 聯絡運維確認當前服務部署機器臺數
    • 兩臺
  • 檢視dubbo 服務註冊中心–當前服務
    • 顯示服務註冊機器數量三臺
  • 對照IP地址及NGINX中備註掉的配置資訊,確認問題原因如下
    • 雙十一期間為了伺服器壓力過大,增加了一臺部署機器
    • 雙十一結束備機被運維移除,但只是從ngnix 中移除,沒有停機處理
    • 備機的Tomcat依然在執行,dubbo 服務註冊中心,依然有該機器的服務註冊,
    • 所以就會出現上述問題,請求服務時好時壞

異常反思

  • 問題除錯三個小時,雖然也想到了,是有一臺機器沒有釋出,我將其中一段程式碼完全註釋掉,但生產環境居然報錯,錯誤的原因就是註釋掉的程式碼生效了,由此判斷是有一臺機器沒有釋出成功
  • 但是太執著了,多次和運維確認是兩臺機器後,只檢查了當前的兩臺機器,多次驗證服務
  • 服務驗證前八次都成功,以為沒問題了,讓測試驗證,不巧的時,一次就失敗,很尷尬,問題還是沒有好
  • 不要慌亂,出現一些其他問題就跑偏,重啟過程中出現
    • failed - POSSIBLE BREAK-IN ATTEMPT!
    • 於是各種找問題
  • 尋求幫助,多個人一起看

舉一反三

  • 出現服務呼叫時好時壞的問題排查步驟
    • 初步判斷原因:機器中部署的程式碼不一致
    • 檢查 dubbo 服務註冊中心,當前服務註冊數量及每臺機器IP地址
    • 檢查 nginx 配置,確認是否有機器是不需要的,是否是臨時部署的
    • 如果發現時其他備機的,ssh -p ip 免密登入,kill 呼叫 java 程序或 cd tomcat/bin ,執行 shutdown.sh ,jps 檢查執行結果
    • 如果不是上述問題,檢查tomcat 中部署的war包是否有最新程式碼
    • 是否是war包沒有刪除掉,手動執行war包替換
    • 是否發版過程中程序kill失敗,手動kill程序,重啟服務