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
建幾個目錄:
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
從服務器只需更改幾個地方
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 會循環給出