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