DNS負載平衡,是最早的實現負載平衡技術的。在DNS的設定檔中為多個地址配置同一個名字,即配置多條指向不同ip的A記錄,而用戶端在查詢這條A記錄的時候將隨機獲得其中一個地址。通過以上描述不難發現,DNS負載平衡有著配置簡單,效能優異,沒有修改架構的開銷等特點。因此,經常被用在內網。
說了優點,也要說說缺點。DNS負載平衡採用的是簡單的輪循負載演算法,不能分辨伺服器的差異,不能根據後端伺服器的運行狀態進行動態調整,即健全狀態檢查。由於實現演算法的隨機性,不能為效能較好的伺服器更多的分配請求,經常會出現將請求集中在某一台伺服器上的現象。
如果你負載平衡的要求很高,不如使用其他負載平衡技術來的容易,比如LVS,Nginx或者HAproxy。修改演算法,不僅要看明白洋洋散散幾萬行源碼,還要將自己的代碼完美融合進去,這個成本因人而異,但肯定不是一朝一夕之功。但如果只是後端伺服器的健康檢測問題,使用shell指令碼就可以辦到。
思路:DNS伺服器通過某種機制對後端RS主機的運行狀態進行判斷,如果後端主機出現故障,那麼DNS所要做的是修改設定檔,將問題主機從設定檔中提出並重啟服務。更進一步,當RS主機恢複時,DNS主機還要將其恢複到設定檔中。
首先是健康檢測機制。如果RS主機是web服務,那麼可選的至少有三個,icmp,telnet,curl分別工作在第三層,第四層,和第七層。我們在這裡使用icmp。修改設定檔,可以通過將提前準備好的設定檔覆蓋原檔案做到,當然還有sed -i,我們在這裡使用sed -i。最後使用while及if elif將這些元素合理的嵌套。
web1 192.168.1.1 web2 192.168.1.2
DNS設定檔:
www IN A 192.168.1.1
www IN A 192.168.1.2
#! /bin/bash
while true;do #定義無限迴圈,讓指令碼不間斷工作。
ping -c1 192.168.1.1 &> /dev/null #由於linux下的ping命令會無限進行下去,所以我們要使用-c參數指定資料包個數,並將標準錯誤和標準輸出全部重新導向到/dev/null這個髒目錄中。
if ! [ $? -eq 0 ];then #如果$?的傳回值不為零,即ping不通。
sed -i '/192.168.1.1/s/^/;/' dns #修改設定檔,將包含192.168.1.1的行開頭替換成;號。(dns設定檔的注釋是;號)
/etc/init.d/bind restart
else
sed -i '/192.168.1.1/s/;//' dns #如果可以ping通,那麼去掉;
/etc/init.d/bind restart
fi
ping -c1 192.168.1.2 &> /dev/null
if ! [ $? -eq 0 ];then
sed -i '/192.168.1.2/s/^/;/' dns
/etc/init.d/bind restart
else
sed -i '/192.168.1.2/s/;//' dns
/etc/init.d/bind restart
fi
sleep 5 #休息5秒,繼續工作。
done