Load-Balancing

如何在 HAProxy 中建構 MongoDB 健康檢查?

  • September 24, 2015

HAProxy 部落格上fastcgi一個二進制執行狀況檢查的範例。我將如何為 MongoDB 建構一個類似的檢查,以便我進行更強大的執行狀況檢查- 驗證伺服器是否確實存在並做出響應,而不僅僅是檢查埠是否打開?MongoDB

如果健康檢查足夠通用,可以與各種MongoDB分片組件(配置伺服器、、mongos)一起使用,那將很有用mongod

首先,值得注意的是,您必須執行 HAProxy 1.5 或更高版本才能使用該tcp-check功能(在撰寫此答案時,1.5.3 是目前的穩定版本)。不幸的是,Ubuntu 14.04(例如)附帶 1.4 版,因此您需要從其他來源安裝。就我個人而言,我使用了這裡的軟體包,這樣我就可以通過apt.

部落格上列出的範例是一個很好的起點。使用它作為模板,我們需要做的就是選擇一個適當的命令來執行,然後將該命令分解為十六進制並為 MongoDB 建構適當的檢查。MongoDB 有線協議已記錄並發布,因此理論上您可以根據規範建構它,但有更簡單的方法來解構這樣的命令。Wireshark中有內置的解析器,可讓您檢查 MongoDB 流量,它提供了一個方便的十六進制視圖,並突出顯示以幫助我們在這裡的工作。

我們將在這裡使用的命令是ping 命令。如您所料,它旨在實現輕量級,甚至可以從負載較重的伺服器返回,這使其非常適合執行狀況檢查命令。如果您希望使用其他方法,則可以使用相同的方法編寫任何此類命令,但請始終警惕使用需要任何類型的鎖定或可能會增加數據庫負載的命令。

為了說明如何從您執行的命令到十六進制,這裡是我在 中突出顯示的命令的一個小鏡頭Wireshark,已被解碼:

Wireshark 中的 ping 命令

基於這些資訊,讓我們創建我們的TCP健康檢查。我將對各個部分進行評論以解釋它們的來源,並且每個部分都應該很容易在上面的抓取中找到:

option tcp-check
# MongoDB Wire Protocol
tcp-check send-binary 39000000 # Message Length (57)
tcp-check send-binary EEEEEEEE # Request ID (random value)
tcp-check send-binary 00000000 # Response To (nothing)
tcp-check send-binary d4070000 # OpCode (Query)
tcp-check send-binary 00000000 # Query Flags
tcp-check send-binary 746573742e # fullCollectionName (test.$cmd)
tcp-check send-binary 24636d6400 # continued
tcp-check send-binary 00000000 # NumToSkip
tcp-check send-binary FFFFFFFF # NumToReturn
# Start of Document 
tcp-check send-binary 13000000 # Document Length (19)
tcp-check send-binary 01 # Type (Double)
tcp-check send-binary 70696e6700 # Ping:
tcp-check send-binary 000000000000f03f # Value : 1
tcp-check send-binary 00 # Term

tcp-check expect string ok

對響應也使用完整的二進制匹配會很好,但不幸的是,無法預測伺服器為每個響應生成的請求 ID,因此這樣的完整匹配將失敗(無法選擇性地忽略片段二進制匹配)。

編輯:2014 年 9 月 8 日感謝來自BaptisteFelix的問答的評論,我回去重新測試最初似乎失敗的部分二進制匹配 - 看起來這只是我錯誤地為響應轉錄二進制的情況,所以我已經修改了答案以反映這一點。

“ok”字元串只是一個 OK 檢查 - 任何這樣的響應都意味著有問題的伺服器仍在響應,但有限的檢查有點不令人滿意。雖然不可能進行完整的響應檢查,但請求 ID 之後的所有內容都是可用的。

因此,這裡是對響應的可用部分進行分解的工作二進制檢查,再次使用 Wireshark 梳理出上述部分:

# Check for response (starting after request ID)
tcp-check expect binary EEEEEEEE # Response To (from the check above)
tcp-check expect binary 01000000 # OpCode (Reply)
tcp-check expect binary 00000000 # Reply Flags (none)
tcp-check expect binary 0000000000000000# Cursor ID (0)
tcp-check expect binary 00000000 # Starting From (0)
tcp-check expect binary 11000000 # Document Length (17)
tcp-check expect binary 01 # Type (Double) 
tcp-check expect binary 6f6b # ok
tcp-check expect binary 00000000000000f03f # value: 1
tcp-check expect binary 00 # term

以上所有內容均已使用 MongoDB 2.6.4 和 HAProxy 1.5.3 成功測試

引用自:https://serverfault.com/questions/625492