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

轉:https://www.cnblogs.com/mikeluwen/p/7068356.htmlhtml

總體架構:linux

1.IP地址規劃:算法

Dns1:172.28.0.54ubuntu

Dns2:172.28.0.55vim

Dr服務器主:172.28.0.57後端

Dr服務器從:172.28.0.67緩存

Vip:172.28.0.99安全

原理過程:bash

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

建幾個目錄:

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

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

在主dns的named.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壓力測試:

使用queryperf作dns壓力測試

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 會循環給出

相關文章
相關標籤/搜索