最近在看 prometheus 的源**,發現它自帶了優雅的關閉方式,這和我以前博文講到的熱更新十分相似。
因為 prometheus 是乙個 unix 二進位制程式,我們可以向 prometheus 程序傳送sigterm
關閉訊號。
使用pgrep-f prometheus
找到執行的 prometheus 程序號
使用kill-term1234
來關閉
ps: 這裡1234
指程序號。
prometheus 提供了 http 關閉介面,但在使用之前,需要通過--web.enable-lifecycle
引數開啟lifecycle
功能,然後你就可以使用 http 請求來關閉程式了,例如:
curl -x post http://localhost:9090/-/quit
此時 http 介面會返回:
requesting termination... goodbye!
當我們使用以上兩種方法來關閉 prometheus 的時候,在它的 log 中可以看到如下資訊:
level=warn ts=2018-06-26t03:37:35.209100753z caller=main.go:381 msg="received termination request via web service, exiting gracefully..."
level=info ts=2018-06-26t03:37:35.212894277z caller=main.go:402 msg="stopping scrape discovery manager..."
level=info ts=2018-06-26t03:37:35.212937719z caller=main.go:416 msg="stopping notify discovery manager..."
level=info ts=2018-06-26t03:37:35.212963663z caller=main.go:438 msg="stopping scrape manager..."
level=info ts=2018-06-26t03:37:35.212975269z caller=main.go:398 msg="scrape discovery manager stopped"
level=info ts=2018-06-26t03:37:35.213029699z caller=main.go:412 msg="notify discovery manager stopped"
level=info ts=2018-06-26t03:37:35.21332349z caller=main.go:432 msg="scrape manager stopped"
level=info ts=2018-06-26t03:37:35.237387659z caller=manager.go:464 component="rule manager" msg="stopping rule manager..."
level=info ts=2018-06-26t03:37:35.238240277z caller=manager.go:470 component="rule manager" msg="rule manager stopped"
level=info ts=2018-06-26t03:37:35.238625599z caller=notifier.go:512 component=notifier msg="stopping notification manager..."
level=info ts=2018-06-26t03:37:35.238693489z caller=main.go:588 msg="notifier manager stopped"
level=info ts=2018-06-26t03:37:35.238723167z caller=main.go:599 msg="see you next time!"
可以發現在程式終止之前它依次關閉了如下服務:
雖然優雅關閉 prometheus 耗時較長,但這個等待是值得的。
因為它在關閉的同時做了很多依賴服務的清理工作,其中最主要的就是fanoutstorage
,如果它沒有正常關閉,很有可能破壞 tsdb 正在落盤的資料,從而導致一些莫名的 bug,以至於再也無法啟動 prometheus 了。
突然想到一點,通常我們會使用supervisord
來管理 prometheus,那supervisord
預設的 stop 命令傳送的是什麼程序關閉訊號呢?
檢視了文件,確認 supervisord 的stopsignal
預設配置為term
,恰好滿足 prometheus 的優雅關閉方式,從而避免了對其進行額外的配置操作。
有想要諮詢的wechat:17812796384
TCP中的優雅關閉和非優雅關閉
優雅關閉 其實就是正常的四次揮手 非優雅關閉 向對端傳送乙個rst報文直接進入closed狀態 伺服器為了避免太多time wait的關閉方式 1.保證由客戶端主動發起關閉 2.關閉的時候使用rst的方式 3.對處於time wait狀態的tcp允許重用 一般我們當然最好是選擇第一種方式,實在沒有辦...
優雅的關閉socket
我們在利用iocp 完成埠 進行程式設計的時候,經常要關閉一些不滿足條件的套接字。假如我們直接採用closesocket方法進行關閉的話,繫結到io埠的此套接字的未傳送的資料就會丟失,這種情況是我們不願意發生的。下面介紹一種合理關閉此套接字的方法 首先,利用setsockopt msdn 函式設定套...
Spark Streaming優雅的關閉策略優化
我們可以有兩種方式來更加優雅的停止流程式,分別是通過http暴露服務,和通過hdfs做訊息中轉來定時掃瞄mark檔案是否存在來觸發關閉服務。下面我們先來看下通過http暴露服務的核心 負責啟動守護的jetty服務 param port 對外暴露的埠號 param ssc stream上下文 負責接受...