﻿# 精通 NLB：如何有效的執行「清空停止」動作 (含研究心得)

前陣子曾經有段時間無法理解**網路負載平衡管理員**中的「**清空停止**」功能到底是如何運作的，因為依照[官方的說法](http://technet.microsoft.com/zh-tw/library/cc772833\(WS.10\).aspx)原本應該非常簡單的：”當清空時，主機繼續處理已開啟的連線，並且在沒有其他使用中的連線時停止叢集操作”，依照這段描述來看，似乎是那麼的合情合理，而且非常適合在正式的環境使用，但我之前只要使用**清空停止**功能時卻沒有一次可以正常的「停止」，永遠都處理「正在清空」的階段。

執行「清空停止」功能的圖示如下：

![網路負載平衡管理員 (nlbmgr)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b1cc08b2e709c6d78f42-image.png "網路負載平衡管理員 (nlbmgr)")

![網路負載平衡管理員 (Nlbmgr) - 清空停止 (drainstop)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ca1fe184baabb5dbf5b8-image.png "網路負載平衡管理員 (Nlbmgr) - 清空停止 (drainstop)")

從[這篇文章](http://technet.microsoft.com/zh-tw/library/cc770345\(WS.10\).aspx)也有一段話是建議採用清空停止(drainstop)功能，以避免用戶受到影響：

> 當您停止處理 NLB 叢集流量時，會中斷已在進行中的用戶端連線。為了避免中斷作用中的連線，請考慮使用 drainstop 叢集控制命令 (而非 stop 命令)，此命令可讓主機繼續服務作用中的連線但停用到該主機的所有新流量。

後來跟微軟技術支援中心的人討論過後，有歸納出一些可能發生此狀況的原因如下：

-   當 IIS 啟用 HTTP Keep-Alive 機制時，**用戶端**連到**網站伺服器**基本上不會斷線，除非使用者一段時間沒有連結網站。由於主機會繼續處理已開啟的連線，所以當流量大且人數多時，很有可能會導致清空停止動作變的非常耗時。
-   如果 IIS 在 NLB 架構下執行許多網站，在使用清空停止(drainstop)時也必須要等所有網站的連線都關閉了，該清空停止節點才會真正停止 NLB 運作。
-   由於 NLB 預設會套用在所有 TCP/UDP ports，所以除了 80 Port 以外，如果也有其他 Ports 被佔用連線 (如: FTP, RDP, …) 等，清空停止(drainstop) 也一樣不會自動停止，需等所有連線都中斷了才會真正停止。

而我的情況是在於 IIS7 的 HTTP Keep-Alive 機制導致我的清空停止久久無法完成的主因，所以必須修改 IIS7 的站台設定才行，請參考以下設定方式：

![HTTP 回應標頭](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/9c0654fdcd71373dc8cd-image.png "HTTP 回應標頭")

 ![設定一般標頭](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a372d618c4240f498c90-image.png "設定一般標頭")

![啟用 HTTP Keep-Alive](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/81f6b0354c82fa94bb8d-image.png "啟用 HTTP Keep-Alive")

至於 IIS6 設定方式如下：

![啟用 HTTP 的持續作用](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/9a486dde2cacec7bc921-image.png "啟用 HTTP 的持續作用") 

**研究心得**

說實在的，身為 IT 人員不僅僅是要學會操作介面(UI)而已，而是要能盡可能全盤瞭解各項技術的細節，才能掌握在 IT 管理維運的過程中面對許多突如其來的挑戰，因為這樣的挑戰真的還挺多的。

有時候雖然 TechNet 或 MSDN 文件把規格與行為寫得很清楚，且中、英文版的文件可能也都看過，感覺也都看懂了，但遇到問題時卻還是會卡住，像這次遇到的問題雖然在文件中寫到「此命令可讓主機繼續服務作用中的連線」，這裡的「**作用中的連線**」似乎是段很簡單且直覺的描述，但卻可以衍生出 HTTP Keep-Alive 或 FTP Connection 等連線會久久不斷線的情況，我覺得這與**聯想力**有很大的關係，這關係到如何將**垂直知識**與**水平知識**之間**如何連結**與**連結密度**的問題。

我會將這類文件或書籍中學到的知識視為「垂直知識」，而將問題解決(Trouble Shooting)學到的知識視為「水平知識」，當你從書上或網路上習得「垂直知識」後，若能再透過無數次的實戰經驗補充你的「水平知識」，就能漸漸成為一個專業且全面的 IT 人，不過當垂直知識不足時，通常也難以累積水平知識，因為如果連 **認知**(**Awareness**) 都沒有又如何能產生連結呢？所以還是鼓勵各位多看書、多閱讀，遇到問題不要怕，花時間鑽下去就對了。

我學習任何技術都有一個習慣 ”**疑無不問，問無不透徹**”， 因為我不知道何時會再遇到相同的問題，即便問題少見，也不能放過理解疑問的過程中學習到的寶貴經驗，且我認為**垂直知識**與**水平知識**之間的**連結密度**是可以不斷培養、訓練出來的，當你習慣於思考不同技術之間的連結，慢慢的你對技術問題的掌握力也會越高，解決問題的速度越快。

在此我要特別感謝**微軟技術支援中心**的同仁不時接受我無情的問題挑戰，如果沒有他們我大概也沒那麼多生命可以燃燒，不然如此多的技術我哪學習的完阿！ ^\_^

**相關連結**

-   How to configure HTTP KEEP-ALIVE in IIS 7 ?
-   [Did you know: Enable HTTP Keep-alive in IIS 7 / 7.5](http://www.dotnetscraps.com/dotnetscraps/post/Did-you-know-Enable-HTTP-Keep-alive-in-IIS-7-75.aspx)
-   [HTTP Protocol Settings <httpProtocol>](http://www.iis.net/ConfigReference/system.webServer/httpProtocol)
-   [IIS 7.0：啟用 HTTP Keep-Alive 回應標頭](http://technet.microsoft.com/zh-tw/library/cc772183\(WS.10\).aspx)
-   [停止或啟動處理網路負載平衡叢集流量](http://technet.microsoft.com/zh-tw/library/cc770345\(WS.10\).aspx)
-   [Nlb](http://technet.microsoft.com/zh-tw/library/cc772833\(WS.10\).aspx)
