歡迎您光臨本站 註冊首頁

基於DNS的多機均衡負載的實現-

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

基於DNS的多機均衡負載的實現-

基於DNS的多機均衡負載的實現-

前二天為一個客戶添加了一台伺服器。共同承擔一個論壇的運作。但是。要實現負載均衡。的確是件難事。
之前有試過幾個方法,
一、DNS輪值。。優點:簡單實現。缺點:無法檢測各個伺服器的負荷。難控制訪客的訪問地址(一般DNS伺服器都有緩存,所以。效果不明顯)
二、前台程序。。使用了一個類似Zeus Load Balancer的服務程序。在前台接受訪問請求。再分流到各個實際的伺服器。

但以上二個方法都不太適用我的情況。。
第一種。無法正確分配訪客流量。。。常發生一台伺服器的負荷很大。而另一台就很低。。。
第二種。會佔用更多的流量。資源也佔用較大。 

最好。我還是採用了一個DNS均衡負載的方法---lbname。
它的主要效果介紹:
一、基於perl的dns服務端。應用簡單。
二、自動檢測各個伺服器的負荷。然後再按結果優先分配DNS解析。
三、DNS解析實時生效。不會被DNS伺服器緩存。
四、安裝方法簡單。。。



lbname網頁介紹
http://www.stanford.edu/~schemers/docs/lbnamed/lbnamed.html
http://www.stanford.edu/~riepel/lbnamed/




下載:
http://www.stanford.edu/~riepel/lbnamed/lbnamed-1.2.1.tar.gz
http://www.stanford.edu/~schemers/dist/lb.tar
.
.

下載包說明:
內存數個目錄
1)lbcd的源代碼。。。。lbcd是lbnamed所用到的伺服器端檢測伺服器負荷程序。。每個需要均衡負荷的伺服器都需要安裝、運行它的。。。
建議下載使用最新的lbcd編譯包。http://www.stanford.edu/~riepel/lbnamed/lbcd-3.1.0.tar.gz  之前的常有編譯錯誤的。(這個也有的。嘻。)
編譯這個包時。常會出錯的。如何成功安裝。就看你的本事了。(編輯util.c第123行。在前面加上//)
  編譯lbcd成功后。將它複製到/usr/sbin。那你就可以運行它了。。不用加什麼參數了。(運行后要停止它就是lbcd -s)

2)lbnamed的伺服器程序perl..分有二個版本。一個是perl4.另一個是perl5.我是使用perl5的。所以用它來說明。
 進入perl5目錄。。。。。先要配置好lbnamed和poller程序。
 說明一下:
  lbnamed程序是主程序。提供dns動態解析。嚴格來說。它已是一個dns伺服器端程序了。
  poller是為lbnamed提供各個均衡伺服器的負荷情況。(配合我們之前安裝的lbcd程序使用)
  但二個程序可能都需要更改,請看程序第一行的perl程序地址。。改為你的perl地址。
  
  然後就需要更改程序的配置文件了。
  1,lbnamed.conf 要更改的地方有幾個 
          一、$hostmaster = "schemers.leland.stanford.edu"; 將schemers.leland.stanford.edu改為你伺服器的域名。。比如host.abc.com 這個無太大關係
          二、將所有stanford改為你域名的中段(比如bendy.com,就改為bendy),將所有edu改為域名的後綴(比如bendy.com,就改為com)。。這個很重要。。我建議不要更改best。當然你也可以改
  2,sweet.config 這個文件可以是用其它文件名的,具體在lbnamed.conf有設置。我建議大家先清空這文件。再重新建立新的。
          這個文件的配置方法是
          負荷伺服器host 負重 組
          比如。我自己的情況。有二台伺服器。分別是bbs1.bendy.com和bendy2.bendy.com那我的配置文件就是
         
          bbs1 1 bbs
          bbs2 2 bbs
         
          配置好這個文件后。你需要一個能對bbs1這個域名進行解析的方法。就是修改/etc/hosts文件。我的情況就是
          192.168.1.1 bbs1
          192.168.1.2  bbs2
         
          這樣的話。poller程序就會檢測111.222.333.001、111.222.333.002的負荷情況了
  
  至此,DNS伺服器和均衡負載的伺服器的程序已完成。可能我的說明不太清楚。現在我就一一列表說明
  
  bbs1伺服器 lbserver1 192.168.1.1  編譯運行lbcd   
  bbs2伺服器 lbserver2 192.168.1.2  編譯運行lbcd
  dns伺服器 dnsserver 10.0.0.1     配置lbnamed 在/etc/hosts配置bbs1、bbs2域名解析
  
  這樣的情況下。。在dns伺服器運行lbnamed程序。系統就開始動作了。。lbnamed的啟動參數主要是 -l logfile和-d(debug)
  ./lbnamed -l lb.log -d
  查看記錄(類似)
  cat lb.log
  
  -=====
  05/30 00:59 21442 lbnamed starting poller
05/30 00:59 21442 lbnamed load_config
  loading 1452 bbs2 192.168.1.2 bbs
  loading 837 bbs1 192.168.1.1 bbs
05/30 00:59 21442 lbnamed ready to answer requests
05/30 00:59 21442 lbnamed do_maint
05/30 00:59 21442 lbnamed reloading config
05/30 00:59 21442 lbnamed load_config
  loading 1671 bbs2 192.168.1.2 bbs
  loading 1086 bbs1 192.168.1.1 bbs


  如果你沒有那些記錄。看文件sweet.config.unreach這是代表poller程序無法接收到對方伺服器的負荷信息。。請檢查lbcd程序是否運行。。

  如果程序運行正常。那你的DNS伺服器就正常運行了。
  如果檢查程序是否正常。。。用我們的nslookup就可以了。。。

   
C:\Documents and Settings\Administrator.XINGKONG-SERVER>;nslookup
Default Server:  ns.guangzhou.gd.cn
Address:  202.96.128.143

>; server 10.0.0.1                                   //直接使用dns伺服器
Default Server:  
Address:  10.0.0.1

>; set type=all                                      //設置查詢類型

>; bbs.best.bendy.com                                //bbs是sweet.config設置的組名,best.bendy.com是在lbnamed.conf設置的
Server:  
Address:  10.0.0.1

bbs.best.bendy.com      canonical name = bbs2.bendy.com        //返回的信息。是DNS系統分配了bbs2給你這次的查詢(按二台伺服器返回的負荷情況來分配的,並非隨便分配的)
bbs2.bendy.com  internet address = 192.168.1.2                 //而bbs.bendy.com在該在DNS系統的A記錄是192.168.1.2//最後結果bbs.best.bendy.com得到的IP地址是192.168.1.2


====
自此。。伺服器方面的配置已經完成。
跟著是我們配置具體域名的dns解析。。。

方法也是很簡單,以bendy.com為例,在bendy.com的DNS管理加上以下記錄
一、加上二個best.bendy.com的ns記錄為ns1.bendy.com和ns2.bendy.com(也可以不止二個的.取決你有多少台伺服器運行lbnamed
二、加上第一條添加的ns記錄的實際指向iP,分別指向各個運行lbnamed的伺服器,比如ns1.bendy.com address 10.0.0.1/ns2.bendy.com address 10.0.0.2等。
三、添加bbs1.bendy.com和bbs2.bendy.com等的實際ip地址。。。正如剛才所說...bbs.best.bendy.com只將DNS記錄轉移為bbs1.bendy.com或者bbs2.bendy.com。而lbnamed是沒權對bbs1.bendy.com和bbs2.bendy.com進行解析的。。。所以。需要bendy.com的NAMESERER對它進行解析。
(ps:bbs1.bendy.com的記錄並不一定要求與lbnamed程序的相同。。。)
四、最後。。添加bbs.bendy.com cname to bbs.best.bendy.com。。。哈哈。。。大功告成。。。


DNS解析完成後,我們就完成本次任務了。。。。
小弟的表達能力有限。如有什麼不明白的地方。請到http://www.discuz.net/forumdisplay.php?fid=34&page=1這裡發表意見



Bendy
原創於2004.5.30
Email & msn: Bendy@etang.com
發表於Discuz Unix 茶館http://www.discuz.net/forumdisplay.php?fid=34&page=1
轉載請保留版權和說明出處
《解決方案》

基於DNS的多機均衡負載的實現-

好貼,加精,改天做一下……謝謝樓主。
《解決方案》

基於DNS的多機均衡負載的實現-

不知道這樣做有何好處?
如果把伺服器做成 cluster 不是更好么??
《解決方案》

基於DNS的多機均衡負載的實現-

不錯,又一個好東西。
《解決方案》

基於DNS的多機均衡負載的實現-

這樣做有潛在的問題!
不同真實伺服器之間的session存儲如何同步?
這樣做對靜態服務不會有任何問題,但是對動態網頁的應用(尤其是與session相關時)會有特殊的要求,象JSP這種把session存根放在內存的應用就會出錯.

不應該根據負載狀況進行均衡,而應該使用源地址HASH演算法.
《解決方案》

基於DNS的多機均衡負載的實現-

正常情況下。在IE瀏覽器進入一個網站后。它的DNS解析會被IE所緩存。所以。它的DNS解析是不變動的。。。。。(並不同於系統的DNS,它是變動的)
所以。我想樓上所說的問題應該不存在的。我在一個discuz3.1.2大型論壇上已測試成功。 並沒有SESSION不正常情況出來 
《解決方案》

基於DNS的多機均衡負載的實現-

原帖由 "Bendy" 發表:
正常情況下。在IE瀏覽器進入一個網站后。它的DNS解析會被IE所緩存。所以。它的DNS解析是不變動的。。。。。(並不同於系統的DNS,它是變動的)
所以。我想樓上所說的問題應該不存在的。我在一個discuz3.1.2大型論壇..........

那人家要是不使用IE呢?
這隻能說你的方案要求客戶機能夠在合適時間內保持DNS緩存(太長了均衡效果不好,太短了風險上升).況且DNS的緩存也不是永遠保持的,總有老化更新的時候吧?如果更新發生在一個session中間還能沒問題嗎?
或者如果客戶機使用links/lynx甚至curl這種根本沒有DNS緩衝的程序怎辦呢?

沒有出現問題不意味著沒有問題.
《解決方案》

基於DNS的多機均衡負載的實現-

up
《解決方案》

基於DNS的多機均衡負載的實現-

問題好多。再說DNS不緩存本身就有性能問題。
session只能放在資料庫進行共享才能實現。
《解決方案》

基於DNS的多機均衡負載的實現-

用dns作負載均衡好象是非常不明智的做法吧,只要第一台dns死機那其他都不用再想用了吧

[火星人 ] 基於DNS的多機均衡負載的實現-已經有413次圍觀

http://coctec.com/docs/service/show-post-33244.html