lvs+keepalived+bind實現負載均衡高可用智能dns

lvs+keepalived+bind實現負載均衡高可用智能dns

整體架構:

1.IP地址規劃:

Dns1:172.28.0.54

Dns2:172.28.0.55

Dr服務器主:172.28.0.57

Dr服務器從:172.28.0.67

Vip:172.28.0.99

原理過程:

Lvs+keepalived實現高性能高可靠性負載均衡,這裏使用dr模式,客戶機訪問負載均衡服務器,會調度到後面的真實服務器上,真實服務器直接將結果返回,如果主調度服務器除了問題,vip會漂到從服務器繼續提供負載均衡,主恢復後vip重新漂到主服務器,後面的真實服務器如果出現問題,會被剔除集羣,直到恢復。

Lvs描述:

lvs說明:目前有三種IP負載均衡技術(VS/NAT、VS/TUN和VS/DR);
八種調度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。
在調度器的實現技術中,IP負載均衡技術是效率最高的。在已有的IP負載均衡技術中有通過網絡地址轉換(Network Address Translation)將一組服務器構成一個高性能的、高可用的虛擬服務器,我們稱之爲VS/NAT技術(Virtual Server via Network AddressTranslation),大多數商品化的IP負載均衡調度器產品都是使用此方法,如Cisco的LocalDirector、F5的Big/IP和 Alteon的ACEDirector。在分析VS/NAT的缺點和網絡服務的非對稱性的基礎上,我們提出通過IP隧道實現虛擬服務器的方法VS/TUN (Virtual Server via IP Tunneling),和通過直接路由實現虛擬服務器的方法VS/DR(Virtual Server via Direct Routing),它們可以極大地提高系統的伸縮性。所以,IPVS軟件實現了這三種IP負載均衡技術,它們的大致原理如下(我們將在其他章節對其工作原理進行詳細描述),

Virtual Server via Network Address Translation(VS/NAT)
通過網絡地址轉換,調度器重寫請求報文的目標地址,根據預設的調度算法,將請求分派給後端的真實服務器;真實服務器的響應報文通過調度器時,報文的源地址被重寫,再返回給客戶,完成整個負載調度過程。

Virtual Server via IP Tunneling(VS/TUN)
採用NAT技術時,由於請求和響應報文都必須經過調度器地址重寫,當客戶請求越來越多時,調度器的處理能力將成爲瓶頸。爲了解決這個問題,調度器把請求報文通過IP隧道轉發至真實服務器,而真實服務器將響應直接返回給客戶,所以調度器只處理請求報文。由於一般網絡服務應答比請求報文大許多,採用 VS/TUN技術後,集羣系統的最大吞吐量可以提高10倍。

Virtual Server via Direct Routing(VS/DR)
VS/DR通過改寫請求報文的MAC地址,將請求發送到真實服務器,而真實服務器將響應直接返回給客戶。同VS/TUN技術一樣,VS/DR技術可極大地提高集羣系統的伸縮性。這種方法沒有IP隧道的開銷,對集羣中的真實服務器也沒有必須支持IP隧道協議的要求,但是要求調度器與真實服務器都有一塊網卡連在同一物理網段上。

針對不同的網絡服務需求和服務器配置,IPVS調度器實現瞭如下八種負載調度算法:使用

比較多的是以下四種:

輪叫(Round Robin)
調度器通過"輪叫"調度算法將外部請求按順序輪流分配到集羣中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載。

加權輪叫(Weighted Round Robin)
調度器通過"加權輪叫"調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。

最少鏈接(Least Connections)
調度器通過"最少連接"調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集羣系統的真實服務器具有相近的系統性能,採用"最小連接"調度算法可以較好地均衡負載。

加權最少鏈接(Weighted Least Connections)
在集羣系統中的服務器性能差異較大的情況下,調度器採用"加權最少鏈接"調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。

第一部分智能dns主從實現

注意:dns主從服務器時間一定要同步,所有服務器的時間都有同步

1.下載bind9:

Wget http://www.isc.org/downloads/file/bind-9-9-5rc2/?version=tar.gz

Bind9.9.5目前最新穩定版本

2.安裝:

Ubuntu默認沒有C/C++編譯環境所以先要安裝好編譯環境

sudo apt-get installbuild-essential

bind9使用默認需要openssl支持我們這裏編譯安裝openssl

下載openssl-1.0.1f

Wget http://www.openssl.org/source/openssl-1.0.1f.tar.gz

安裝openssl

Sudo mkdir /usr/local/ssl

./config --prefix=/usr/local/ssl

Make && sudo make install

正式開始安裝bind9

Tar xvf bind-9.9.5.tar.gz

Sudo mkdir /usr/local/named

Cd bind-9.9.5

./configure –enable-threads –prefix=/usr/local/named--enable-largefile --with-openssl=/usr/local/ssl

Make

Sudo make install

創建用戶named用戶,使用named用戶運行dns

1.groupadd named  

2.useradd -g named -s /sbin/nologin named

  1. 建幾個目錄:

  2. Sudo mkdir /usr/local/named/etc/zones

  3. Sudo mkdir /usr/local/named/log //保存日誌就新建這個目錄


3.配置

Master 配置主從使用tsig事務簽名認證,dnssec-keygen -a HMAC-MD5 -b 128 -n HOSTxxxx 生成的祕鑰,實現智能dns主從同步


Cd /usr/local/named/etc/

Vim named.conf

include"/usr/local/named/etc/named.conf.options"; //放配置

include"/usr/local/named/etc/named.conf.local"; //定義zone

include"/usr/local/named/etc/cnc";  //acl列表自定義ip地址

include"/usr/local/named/etc/chinanet"; //acl列表自定義ip地址


vim /usr/local/named/etc/named.conf.options

options {

       directory "/usr/local/named";//修改默認路徑

       pid-file"/usr/local/named/var/run/named.pid";

       allow-query-cache { any; }; //允許查詢

};

//這裏設置日誌有多種級別日誌一般不設置

     //logging {

            // channel query_log {

              //       file"/usr/local/named/log/query.log"        versions 3 size 20m;

                //     severity        info;

                  //  print-time        yes;

                    // print-category  yes;

             //};

             //category queries {

               //      query_log;

           // };

     //};

//下面的是dnssec-keygen -a HMAC-MD5 -b 128 -n HOST xxxx 生成的祕鑰,實現智能dns主從同步

key chinanet {

       algorithm hmac-md5;

       secret"kve3QMmhjXGZUZURb6mucQ==";

};

Vim /usr/local/named/etc/named.conf.local

view "chinanetzone" {

      match-clients { key chinanet; chinanet; }; //前面的是key 後面的是acl

      server 172.28.0.55 { keys { chinanet; }; };//定義從服務器,通過key同步

      zone "test.com" {

               type master;    //定義此區爲主服務器,從服務器寫slave

               file "/usr/local/named/etc/zones/db.test";   //指定區資源文件的位置,區域文件隨便取名字

               allow-transfer { key chinanet;};允許通過key的服務器同步zone文件

              //allow-transfer { 172.28.0.55;};

               also-notify { 172.28.0.55;};

               };

      zone "." {

               type hint;

               file"/usr/local/named/etc/zones/db.root";

       };


};


//反向解析根據條件看需不需要配置

//zone "172.in-addr.arpa" {

//     type master;    //定義此區爲主服務器

//      file "/etc/bind/db.172";       //指定區資源文件的位置

//     };

Chown R named:named/usr/local/named

Zones文件:

;

; BINDdata file for local loopback interface

;

$TTL    604800 ;其它服務器緩存保留時間

@       IN     SOA     spdns01.test.com.root.test.com. (

                             2         ; Serial

                        604800         ; Refresh

                         86400         ; Retry

                       2419200         ; Expire

                        604800 )       ; Negative Cache TTL

;

@       IN     NS      spdns01.test.com.

@       IN     NS      spdns02.test.com.

spdns01IN      A       172.28.0.57

spdns02IN      A       172.28.0.67

;spdns02        IN     A       172.28.0.55

www     IN     A       2.2.2.2

Slave配置:

Slave配置只有named.conf.local不同:

view "chinanetzone" {

      match-clients { key chinanet; chinanet; };

      server  { keys { chinanet; }; };

      zone "test.com" {

               type slave;    //定義此區爲從服務器

               file "/usr/local/named/etc/zones/db.slavechinanettest";   //指定區資源文件的位置,區域文件隨便取名字

               masters { 172.28.0.54; };

               };

      zone "." {

               type hint;

               file"/usr/local/named/etc/zones/db.root";

      };


};

//zone "172.in-addr.arpa" {

//     type master;    //定義此區爲主服務器

//      file "/etc/bind/db.172";       //指定區資源文件的位置

//     };


賦權 chown –R:named /usr/local/named

殺掉named進程sudo killall -9 named

這裏爲了方便我們可以寫個bind自動啓動腳本,實現開機自動啓動:


#!/bin/bash

# named a network name service.

# chkconfig: 345 35 75

# description: a name server

if [ `id -u` -ne 0 ]

then

echo "ERROR:For bind to port 53,mustrun as root."

exit 1

fi

case "$1" in

start)

if [ -x /usr/local/named/sbin/named ]; then

/usr/local/named/sbin/named -c/usr/local/named/etc/named.conf –u named && echo . && echo'BIND9 server started'

fi

;;

stop)

kill `cat/usr/local/named/var/run/named.pid` && echo . && echo 'BIND9server stopped'

;;

restart)

echo .

echo "Restart BIND9 server"

$0 stop

sleep 10

$0 start

;;

reload)

/usr/local/named/sbin/rndc reload

;;

status)

/usr/local/named/sbin/rndc status

;;

*)

echo "$0 start | stop | restart|reload |status"

;;

esac

這裏可以使用chkconfig實現開機自啓動

Rndc 實現配置文件的更新:

配置 rndc 遠程控制 DNS 服務器的基本流程:

1.  在每個受控服務器端使用 rndc-confgen 生成 key,配置 named.conf 文件允許被哪臺

控制端服務器控制。

2.  在控***務器端將每個受控服務器端的 key 複製到本地,配置 rndc.conf 文件允許

控制哪些受控服務器

Rnd能夠不停掉服務器進行配置很牛逼

在受控端也就是dns主從服務器端使用rndc-congen生成配置文件信息

./rndc-confgen -k mrndc-key-k選項可以定義key名)

Rndc 不能在用root權限啓動的dns服務器中運行一般對權限要求高爲了安全

同樣在從服務器使用命令./rndc-confgen

在主dnsnamed.conf文件中加入生成的祕鑰例如:

key "rndc-key" {

     algorithm hmac-md5;

     secret "EyZKic6KKjt1agePxK41cA==";

};


controls {

     inet * port 953

              allow { any; } keys {"rndc-key"; };

};

rndc.conf中加入key:

key "rndc-key" {

      algorithm hmac-md5;

      secret "EyZKic6KKjt1agePxK41cA==";

};


options {

      default-key "rndc-key";

      default-server 127.0.0.1;

      default-port 953;

};


Lvs+keepalived實現高可用高性能負載均衡

1.環境 ubuntu12.04  lvs  

下載軟件:

Wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz

直接用sudoapt-get install 安裝就行了

Wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz

modprobe -l | grep ipvs 查看內核支不支持 ubuntu支持

2.安裝:

Ubunut內核自帶支持這個lvs,如果是redhat 或者ubuntu還要重新編譯內核

首先要安裝好編譯安裝環境:

Sudo apt-get install ipvsadm

Sudo dpkg-reconfigure ipvsadm(這個命令可以圖形界面配置ipvsadm)這裏不使用

注意:安裝keepalived需要ssl支持

Sudo apt-get install libssl-dev

Tar xvf keepalived-1.2.12.tar.gz

Sudo mkdir /usr/local/keepalived

./configure –prefix=/usr/local/keepalived

Make && sudo make install

3.配置keepalived

要實現負載均衡,首先對真實服務器進行配置如下

真實服務器上面的腳本: 防止迴環 廣播等 最好設置爲開機自動啓動腳本

#!/bin/bash

PATH=/sbin:/usr/sbin:/bin:/usr/bin

./lib/lsb/init-functions

VIP=172.28.0.99

case"$1" in

start)

       /sbin/ifconfig lo:0 $VIP broadcast $VIPnetmask 255.255.255.255 up

       /sbin/route add -host $VIP dev lo:0

       echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore

       echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce

       echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore

       echo "2">/proc/sys/net/ipv4/conf/all/arp_announce

       sysctl -p >/dev/null 2>&1

       echo "RealServer Start OK"


      ;;

stop)

      ifconfig lo:0 down

      route del $VIP >/dev/null 2>&1

      echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore

      echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce

      echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore

      echo "0">/proc/sys/net/ipv4/conf/all/arp_announce

      echo "RealServer Stoped"

      ;;

*)

      echo "Usage: $0 {start|stop}"

      exit 1

esac


exit 0

真實服務器需要的配置做成腳本實現,可以使用命令sudo chkconfig add  realserver.sh

這樣可以使用sudo service realserver.sh start/stop來運行腳本

設置開機自動啓動這裏使用:chkconfig命令

需要安裝,sudo chkconfig add realserver.sh

Sudo chkconfig realserver.sh on (如果報錯/sbin/insserv:No such file or directory,則需要:

sudo ln -s /usr/lib/insserv/insserv/sbin/insserv 再用chkconfig命令)

sudo/usr/local/keepalived/sbin/keepalived –D 檢查運行情況

啓動/usr/local/keepalived/sbin/keepalived f指定配置文件位置 否則默認查找配置文件/etc/keepalived/keepalived.conf

Keepalived配置文件如下

Sudo vim /etc/init.d/keepalived.conf

#vi /etc/keepalived/keepalived.conf


! Configuration File for keepalived

global_defs {

 notification_email {

***@**.com  //定義郵箱,自己定義

  }

 notification_email_from ***@rui.com

  smtp_server222.73.214.147

 smtp_connect_timeout 30

  router_id LVS_DEVEL

}


vrrp_instance VI_1 {

     state MASTER //從服務器這裏寫BACKUP

     interface eth0  //vip綁到哪個網卡上

  virtual_router_id 51

    priority 100  //優先級主比從大

   advert_int 1

  authentication {

auth_typePASS

      auth_pass 1111

   }

  virtual_ipaddress {

      172.28.0.99 //vip

   }

}


virtual_server 172.28.0.99 53 {  //ip和端口

   delay_loop 6

   lb_algorr  

   lb_kindDR    

  //persistence_timeout60  //同一IP的連接60秒內被分配到同一臺realserver

  inhibit_on_failure  //服務器健康檢查失效時,將其設爲0,而不是直接從ipvs中刪除

  protocol UDP  //使用什麼協議訪問


   real_server 172.28.0.54 53 {  //負載均衡真實服務器和服務端口

       weight 3   //權重 rr算法沒意義

    TCP_CHECK {

       connect_timeout10

       nb_get_retry3

          delay_before_retry 3

       }

   }


   real_server172.28.0.55 53 {  

       weight 1

      TCP_CHECK {

          connect_timeout 10

          nb_get_retry 3

          delay_before_retry 3

       }

   }

}

#下面的是一些例子,因爲不支持udp檢測,所以可以自定義腳本檢查

#   MISC_CHECK      

#        {

#            connect_timeout 3

#           misc_path "/etc/keepalived/dnscheck.sh -h 192.168.0.11"

#        }

#    }

#    real_server192.168.0.12 53 {

#        weight1

#       MISC_CHECK      

#        {

#           connect_timeout 3

#           misc_path "/etc/keepalived/dnscheck.sh -h 192.168.0.12"

#        }

查看vip情況

sudo ip addr list 或者 ip addr show 查看vip

spacer.gif

從服務器只需更改幾個地方

1 state MASTER  改爲stateBACKUP

2. priority 100 改到比主小


要實現keepalived開機自啓動:

/usr/local/keepalived/sbin/keeplived 加到/etc/rc.local裏面

Dns壓力測試:

使用queryperfdns壓力測試

cd  bind-9.9.5/contrib/queryperf

./configure –prefix=/usr/local/named

make

不需要make install 可以直接使用這個工具,一般我們sudo cp queryperf /usr/local/named/bin

Queryperf的使用:

Queryperf  -sdns服務器–d 文件(文件格式:域名類型A NS 等) -l發包時間長短

還有一個工具也可以進行dns性能測試:dnsperf

#!/bin/sh

SECS=60                #//運行時間

INPUT=test.txt      #//調用壓力測試文件

SERVER=172.28.0.54            #//目標DNS服務器地址

./queryperf-s $SERVER -d $INPUT -l $SECS > out1 2>&1 &  #//第一個進程

./queryperf-s $SERVER -d $INPUT -l $SECS > out2 2>&1 &  #//第二個進程

./queryperf-s $SERVER -d $INPUT -l $SECS > out3 2>&1 &  #//第三個進程

./queryperf-s $SERVER -d $INPUT -l $SECS > out4 2>&1 &  #//第四個進程

./queryperf-s $SERVER -d $INPUT -l $SECS > out5 2>&1 &  #//第五個進程

./queryperf-s $SERVER -d $INPUT -l $SECS > out6 2>&1 &  #//第六個進程

./queryperf-s $SERVER -d $INPUT -l $SECS > out7 2>&1 &  #//第七個進程

./queryperf-s $SERVER -d $INPUT -l $SECS > out8 2>&1 &  #//第八個進程

./queryperf-s $SERVER -d $INPUT -l $SECS > out9 2>&1 &  #//第九個進程

./queryperf-s $SERVER -d $INPUT -l $SECS > out10 2>&1 &  #//第十個進程

./queryperf-s $SERVER -d $INPUT -l $SECS > out11 2>&1 &  #//第十一個進程

wait

grep'Queries per' out? | awk 'BEGIN { sum=0;}{ sum += $5;} END {printf("Total:%.1f qps\n", sum);}'    #//數據彙總

dns輪詢設置

在 named.conf 中可以設置 bind 的 round-robin 的給出結果的順序:
options {
rrset-order { order random; };
};
rrset-order 支持三個參數:fixed, random, cyclic 。
fix 會將多個A記錄按配置文件的順序固定給出
random 會隨機給出
cyclic 會循環給出


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章