本次實驗需要兩台DR(調度器),兩台RS(真實伺服器)
DR1:192.168.0.221
DR2:192.168.0.222
RS1:192.168.0.223
RS2:192.168.0.224
DR配置
先安裝基礎軟體包
[root@DR1 ~]# yum install -y gcc gcc-c++ make openssl-devel kernel-devel kernel-headers libnl* libpopt* popt-static libnfnet* keepalived
軟連結核心檔案以供ipvsadm安裝使用
[root@DR1 ~]# ln -s /usr/src/kernels/2.6.32-642.11.1.el6.x86_64 /usr/src/linux
解壓ipvsadm
[root@DR1 ~]# tar xzvf ipvsadm-1.26.tar.gz
[root@DR1 ipvsadm-1.26]# make &&make install
安裝好ipvsadm後即可,無需修改其他檔案
由於keepalived軟體包已包含在上述基礎軟體包中,所以可直接在/etc/keepalived中修改keepalived.conf中修改檔案使用,亦或使用以下提供的精簡內容替換使用:
! Configuration File for keepalived
global_defs {
notification_email {
service@qq.com #組態管理員郵箱,用於警示,一行設定一個,可以設定多個,系統需要開啟sendmail 服務
}
notification_email_from Alexandre.Cassen@firewall.loc #設定郵件的發送地址
smtp_server 127.0.0.1 #設定smtp server地址
smtp_connect_timeout 30 #設定串連smtp服務逾時時間
router_id LVS_DEVEL1 #路由ID,和BACKUP 要不同,不然會報錯
}
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER表示此主機是主用伺服器,BACKUP表示是待命伺服器。
interface eth1 #指定檢測網路的介面
virtual_router_id 55 #虛擬路由辨別碼,即同一個vrrp_instance下,MASTER和BACKUP必須是一致的。
priority 100 #定義優先順序,數字越大,優先順序越高,在一個vrrp_instance下,MASTER的優先順序必須大於BACKUP的優先順序。
advert_int 1 #設定MASTER與BACKUP負載平衡器之間同步檢查的時間間隔,單位是秒。
authentication { #設定驗證類型和密碼。
auth_type PASS #設定驗證類型,主要有PASS和AH兩種
auth_pass 1111 #設定驗證密碼,在一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通訊。
}
virtual_ipaddress{
192.168.0.220 #設定虛擬IP地址,可以設定多個虛擬IP地址,每行一個。
}
}
virtual_server 192.168.0.220 80 { #設定虛擬伺服器,需要指定虛擬ip地址和服務連接埠,ip與連接埠之間用空格隔開。
delay_loop 6 #設定健全狀態檢查時間,單位是秒。
lb_algo rr #設定負載調度演算法,這裡設定為rr,即輪詢演算法
lb_kind DR #設定LVS實現負載平衡的機制,可以有NAT、TUN和DR三個模式可選。
persistence_timeout 2 #會話保持時間,單位是秒,這個會話保持功能,使用者的請求會被一直分發到某個服務節點,直到超過這個會話保持時間。需要注意的是,這個會話保持時間,是最大無響應逾時時間,也就是說使用者在操作動態網頁面時,如果在2秒內沒有執行任何操作,那麼接下來的操作會被分發到另外節點,但是如果一直在操作動態網頁面,則不受2秒的時間限制。由於在本次屬於實驗性質,需要看到輪詢功能的情況,所以將此值調整得2秒這麼小。
protocol TCP #指定轉寄協議類型,有tcp和udp兩種。
real_server 192.168.0.223 80 { #佈建服務節點1,需要指定realserver的真實IP地址和連接埠,ip與連接埠之間用空格隔開。
weight 3 #佈建服務節點的權值,權值大小用數字表示,數字越大,權值越高,設定權值的大小可以為不同效能的伺服器分配不同的負載,可以對效能高的伺服器設定較高的權值,而對效能較低的伺服器設定相對較低的權值,這樣就合理的利用和分配了系統資源。
TCP_CHECK { #realserve的狀態檢測設定部分,單位是秒
connect_timeout 10 #10秒無響應逾時
nb_get_retry 3 #重試次數
delay_before_retry 3 #稍候再試
}
}
real_server 192.168.0.224 80 { #佈建服務節點2
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry3
}
}
}
儲存並退出
使用ipvsadm –L –n命令查看keepalived是否運行,正常狀態如下:
[root@DR1 keepalived]#ipvsadm -L -n
IP VirtualServer version 1.2.1 (size=4096)
ProtLocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.220:80 rr persistent 2
-> 192.168.0.223:80 Route 1 0 0
-> 192.168.0.224:80 Route 1 0 0
OK,keepalived正常運作
查看eth1網卡是否有VIP
[root@DR1keepalived]# ip a
1: lo:<LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth1:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:b0:09:39 brdff:ff:ff:ff:ff:ff
inet 192.168.0.221/24 brd 192.168.0.255scope global eth1
inet 192.168.0.220/32 scope global eth1
inet6 fe80::20c:29ff:feb0:939/64 scope link
valid_lft forever preferred_lft forever
OK,IP地址已經識別出來了
接下來查看ipvsadm預設逾時時間
[root@DR1 keepalived]# ipvsadm -L --timeout
Timeout (tcp tcpfin udp): 900 120 300
900 120 300這三個數值分別是TCP TCPFINUDP的時間.也就是說一條tcp的串連經過lvs後,lvs會把這台記錄儲存15分鐘,就是因為這個時間過長,所以大部分人都會發現做好LVS DR之後輪詢現象並沒有發生,而且我也看到大部分的教程是沒有說明這一點的,巨坑。。。。。。因為是實驗性質,所以將此數值調整為非常小,使用以下命令調整:
[root@DR1 ~]# ipvsadm --set 1 2 1
調整之後查看調整效果
[root@DR1 ~]# ipvsadm -L --timeout
Timeout (tcp tcpfin udp): 1 2 1
OK,沒問題。
註:以上列出的僅為DR1的配置,DR2的配置僅需要修改keepalived.conf中的以下選項:
router_id LVS_DEVEL1 可改為 router_idLVS_DEVEL2
state MASTER 改為 state BACKUP
interface eth1 根據網卡具體介面而修改
priority 100 改為 priority 90
下面就可以開始做RS
RS
首先關閉防火牆
[root@localhost ~]# service iptables stop
iptables: Setting chains to policy ACCEPT:filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
[root@localhost ~]# setenforce 0
安裝基礎軟體包
[root@localhost ~]# yum install -y gcc-c++ ncurses-devel gdbm-devel libxml2-devel openssl-devel
安裝apache
[root@localhost ~]# tar xzvfhttpd-2.2.14.tar.gz
[root@localhost ~]# cd httpd-2.2.14
[root@localhost httpd-2.2.14]# ./configure--prefix=/usr/local/apache2 --enable-module=so --enable-so --enable-cache --enable-disk-disk-cache --enable-mem-cache --enable-threads --enable-ssl && make && make install
由於是實驗性質,所以apache就修改httpd.conf的ServerName和index.html內容而不做其他的設定了
[root@localhost ~]# cd /usr/local/apache2/conf/
[root@localhost conf]# vim httpd.conf
把ServerName www.example.com:80改為 ServerName 0.0.0.0:80
儲存退出
[root@localhost conf]# cd ..
[root@localhost apache2]# cd htdocs/
[root@localhost htdocs]# vim index.html
把<html><body><h1>It works! </h1></body></html>修改為 <html><body><h1>It works! RealServer1</h1></body></html>
儲存退出
這樣apache就設定完畢了
接下來設定IP轉寄
在/etc/init.d建立sh檔案,把以下內容複寫進去,記得要修改VIP地址
#!/bin/bash
. /etc/init.d/functions
SNS_VIP=192.168.0.220
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_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 $SNS_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
儲存並退出
賦予檔案運行許可權
[root@localhost init.d]# chmod a+x lvsrs
運行檔案
[root@localhost init.d]# service lvsrs start
RealServer Start OK
OK,運行沒問題,查看以下IP地址有沒有掛在lo環回口上
[root@localhost init.d]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 192.168.0.220/32 brd 192.168.0.220 scope global lo:0
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth1:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:86:2a:17 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.224/24 brd 192.168.0.255 scope global eth1
inet6 fe80::20c:29ff:fe86:2a17/64 scope link
valid_lft forever preferred_lft forever
OK,已經掛上了,接下來就可以開始測試
首先回到DR1的介面上,執行以下命令用於監測串連保持狀態(2s重新整理一次狀態)
[root@DR1 ~]# watch ipvsadm -L -n -c
開啟瀏覽器,輸入VIP地址,每隔2秒按F5重新整理一次,效果如下圖所示:
第一次重新整理
查看ipvsadm狀態
IPVS connection entries
pro expire state source virtual destination
TCP 00:00 NONE 192.168.0.219:0 192.168.0.220:80 192.168.0.223:80
TCP 00:00 ESTABLISHED 192.168.0.219:15566 192.168.0.220:80 192.168.0.223:80
第二次重新整理
查看ipvsadm狀態
IPVS connection entries
pro expire state source virtual destination
TCP 00:00 NONE 192.168.0.219:0 192.168.0.220:80 192.168.0.224:80
TCP 00:00 ESTABLISHED 192.168.0.219:15566 192.168.0.220:80 192.168.0.224:80
OK,這樣MASTER端就沒有問題,接下來斷開MASTER的eth1網路測試BACKUP DR輪詢情況
首先要開啟cmd先ping VIP地址 -t,如下圖所示
然後執行以下命令關閉eth1網卡,查看ping情況
[root@DR1 ~]# ifdown eth1
可以看到,ping只丟了一個包,就切換到BACKUP DR上了
接下來測試BACKUP DR的輪詢情況,也是使用瀏覽器每隔2秒重新整理一次
第一次重新整理
查看ipvsadm狀態
IPVS connection entries
pro expire state source virtual destination
TCP 00:00 NONE 192.168.0.219:0 192.168.0.220:80 192.168.0.223:80
TCP 00:00 ESTABLISHED 192.168.0.219:15566 192.168.0.220:80 192.168.0.223:80
第二次重新整理
查看ipvsadm狀態
IPVS connection entries
pro expire state source virtual destination
TCP 00:00 NONE 192.168.0.219:0 192.168.0.220:80 192.168.0.224:80
TCP 00:00 ESTABLISHED 192.168.0.219:15566 192.168.0.220:80 192.168.0.224:80
OK,這樣BACKUP DR就沒有問題,整個實驗大功告成。
註:以上列出的僅為RS1的配置,RS2的配置僅需要修改index.html中的以下內容:
RealServer1 改為RealServer2