shell解決DNS負載均衡RS的健康檢測

2021-09-04 17:12:36 字數 2647 閱讀 8451

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

如果使用以上的shell指令碼,確實可以完成rs主機的高可用,但我們也會發現,如果後端主機出了問題,配置檔案會在問題主機ip所在行前不斷的增加;號的同時,不斷的重啟dns服務。這是我們不能允許的,修改後的指令碼如下:

#! /bin/bash

caipan1=0

caipan2=0 #定義兩個裁判變數記錄狀態

while true;do

ping -c1 192.168.1.1 &> /dev/null

state=$?

if ! [ state -eq 0 ] && [ $caipan1 -eq 0 ];then

sed -i '/192.168.1.1/s/^/;/' dns

/etc/init.d/bind restart

caipan1=1

elif [ state -eq 0 ] && [ $caipan1 -eq 1 ];then

sed -i '/192.168.1.1/s/;//' dns

/etc/init.d/bind restart

caipan1=0 fi

ping -c1 192.168.1.2 &> /dev/null

state=$?

if ! [ state -eq 0 ] && [ $caipan2 -eq 0 ];then

sed -i '/192.168.1.2/s/^/;/' dns

/etc/init.d/bind restart

caipan2=1

elif [ state -eq 0 ] && [ $caipan2 -eq 1 ];then

sed -i '/192.168.1.2/s/;//' dns

/etc/init.d/bind restart

caipan2=0 fi

sleep 5 #休息5秒,繼續工作。

done      

caipan變數的目的只有乙個,就是增加判斷條件,修改配置及重啟服務必須要滿足雙重條件才能進行,通過重置變數讓條件不再滿足。當然,解決辦法還有很多。篇幅所限,在這裡我們只給出了變數的辦法,希望大家能提出更好的建議,發動集體智慧型,開拓思路,寫出更好指令碼。

DNS負載均衡

dns負載均衡技術的實現原理是在 dns伺服器中為同乙個主機名配置多個 ip位址,在應答 dns查詢時,dns伺服器對每個查詢將以 dns檔案中主機記錄的 ip位址按順序返回不同的解析結果,將客戶端的訪問引導到不同的機器上去,使得不同的客戶端訪問不同的伺服器,從而達到負載均衡的目的。直到現在,很多 ...

DNS負載均衡

dns 負載均衡技術的實現原理是在 dns伺服器中為同乙個主機名配置多個 ip位址,在應答 dns查詢時,dns伺服器對每個查詢將以 dns檔案中主機記錄的 ip位址按順序返回不同的解析結果,將客戶端的訪問引導到不同的機器上去,使得不同的客戶端訪問不同的伺服器,從而達到負載均衡的目的。直到現在,很多...

DNS負載均衡

dns負載均衡 對同乙個請求的網域名稱,對映為不同的伺服器ip位址。http重定向 http 比如瀏覽器 向web伺服器請求某一url後,web伺服器根據http響應頭資訊中的location標記來返回乙個新的url,然後http 繼續請求訪問這個新的url。反向 負載均衡 普通的 方式是客戶端指定...