高可用負載均衡集羣html
ipvsios
負載均衡經常使用的有四種模式算法
DRvim
NAT瀏覽器
TUN緩存
FULLNET服務器
實驗環境:準備四臺rhel6.5的虛擬機四臺。一臺做爲調度器server1,兩臺做爲real server(server3,4),heartbeat服務關閉網絡
172.25.50.10 server1.example.com負載均衡
172.25.50.20 server2.example.comcurl
172.25.50.30 server3.example.com
172.25.50.250 real50.example.com
172.25.50.40 server4.example.com
DR模式:
#ipvsadm -l 命令能夠看到當前主機的調度策略
#ipvsamd -L
#iIpvsadm -C 清除當前策略
在server3和server4上都安裝而且開啓httpd服務,而後都在默認發佈目錄上寫一個不一樣的測試頁面:server3.example.com server4.example,com
調度器server1上,添加一個172.25.50.100的ip
# ip addr add 172.25.50.100/24 dev eth0
而且用真機ping 一下這個ip讓真機緩存綁定一個MAC地址
在server1上添加策略:
ipvsadm -A -t 172.25.50.100:80 -s rr##rr表示輪詢
ipvsadm -a -t 172.25.50.100:80 -r 172.25.50.30:80 -g
ipvsadm -a -t 172.25.50.100:80 -r 172.25.50.40:80 -g
.ipvsadm參數說明:
-C:清除表中全部的記錄
-A:在服務器列表中新添加一套新的虛擬服務器記錄
-a:在服務器列表中添加一體新的真實主機記錄
-t:表示tcp服務
-u:表示udp服務
-r::真實服務器地址
-s:使用調度算法(rr | wrr | )
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.50.100:http rr
-> server3.example.com:http Route 1 0 0
-> server4.example.com:http Route 1 0 0
在serevr3和server4上都添加ip:
# ip addr add 172.25.50.100/32 dev eth0
測試:在瀏覽器上訪問172.25.50.100,重複刷新,能夠看到測試頁面的變更
[root@real50 kiosk]# curl 172.25.50.100
<h1>serer3.example.com</h1>
[root@real50 kiosk]# curl 172.25.50.100
<h2>server4.example.com</h2>
這樣作是有缺陷的。這樣是不具有對服務的健康檢查
當real server的服務宕機,在調度器上不能看到服務是否正常運行,在瀏覽器上能夠看到網頁時好時壞。
Arp
在server3和server4上安裝arptables_jf.x86_64 0:0.0.8-23.el6
在server3和server4 上都執行如下策略
arptables -A IN -d 172.25.50.100 -j DROP
arptables -A OUT -s 172.25.50.100 -j mangle --mangle-ip-s 172.25.50.30
/etc/init.d/arptables_jf save
而後關閉server3的httpd服務
而後在調度器上server1上可以發現real serevr 上的服務故障
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.50.100:http rr
-> server4.example.com:http Route 1 0 0
在瀏覽器上只能看到serevr4的測試頁面
[root@real50 kiosk]# curl 172.25.50.100
<h2>server4.example.com</h2>
[root@real50 kiosk]# curl 172.25.50.100
<h2>server4.example.com</h2>
######將heartbeat加入負載均衡集羣中:#####
[root@server1 ~]# ipvsadm -C ##清除以前的策略
[root@server1 ~]# ipvsadm -L
[root@server1 ha.d]# rpm -qd ldirectord##查詢這個軟件的文檔
/usr/share/doc/ldirectord-3.9.5/COPYING
/usr/share/doc/ldirectord-3.9.5/ldirectord.cf
/usr/share/man/man8/ldirectord.8.gz
[root@server1 ha.d]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf .
[root@server1 ha.d]# vim ldirectord.cf ##這個文件寫着調度策略
25 virtual=172.25.50.100:80##虛擬ip
26 real=172.25.50.30:80 gate##真實主機的ip地址
27 real=172.25.50.40:80 gate
28 fallback=127.0.0.1:80 gate
29 service=http
30 scheduler=rr##策略:輪詢
31 #persistent=600
32 #netmask=255.255.255.255
33 protocol=tcp
34 checktype=negotiate
35 checkport=80
36 request="index.html"
37 # receive="Test Page"##檢測真實主機上的測試測試頁面是否一致
38 # virtualhost=www.x.y.z
[root@server1 ha.d]# /etc/init.d/ldirectord start##啓動ld
在server3上將httpd服務停了
在真機上:
[root@real50 Desktop]# curl 172.25.50.100
<h2>server4.example.com</h2>
調度器serverv1上:
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.50.100:http rr
-> server4.example.com:http Route 1 0 0
這時將server3上的httpd服務打開
這時負載均衡開始工做:
[root@real50 Desktop]# curl 172.25.50.100
<h2>server4.example.com</h2>
[root@real50 Desktop]# curl 172.25.50.100
<h1>serer3.example.com</h1>
[root@server1 ha.d]# /etc/init.d/ldirectord stop
[root@server1 html]# ip addr del 172.25.50.100/24 dev eth0
[root@server1 html]# /etc/init.d/httpd stop
[root@server1 html]# cd /etc/ha.d/
[root@server1 ha.d]# vim haresources
在最後一行添加:
server1.example.com IPaddr::172.25.50.100/24/eth0 ldirectord httpd
||||
添加虛擬ip啓動腳本
[root@server1 ha.d]# scp haresources 172.25.50.20:/etc/ha.d/#發送到server2上
[root@server1 ha.d]# scp ldirectord.cf 172.25.50.20:/etc/ha.d/
root@172.25.50.20's password:
haresources 100% 5972 5.8KB/s 00:00
/etc/init.d/heartbeat restart##在serevr1和server2上都從新啓動heartbeat
[root@server1 ha.d]# tail -f /var/log/messages #用過日誌查看服務啓動狀況
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.50.100:http rr
-> server3.example.com:http Route 1 0 0
-> server4.example.com:http Route 1 0 0
在真機上測試:
[root@real50 Desktop]# for i in {1..8}; do curl 172.25.50.100; done
<h2>server4.example.com</h2>
<h1>serer3.example.com</h1>
<h2>server4.example.com</h2>
<h1>serer3.example.com</h1>
<h2>server4.example.com</h2>
<h1>serer3.example.com</h1>
<h2>server4.example.com</h2>
<h1>serer3.example.com</h1>
當realserver上任何一個的http服務掛了。另一個realserver會一直接管httpd服務
當調度器中的server1掛了,server2會接管調度工做,保證系統正常運行
Keepalived+lvs
先關閉sererv1和server2的heartbeart服務
/etc/init.d/heartbeat stop
在server和server上都進行以下操做
tar zxf keepalived-1.2.24.tar.gz #第三方模塊,在官網上去找
cd keepalived-1.2.24
yum install openssl-devel -y#編譯文件
yum install libnl-devel -y
yum install libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm -y
rpm -ivh libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm
warning: libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
package libnfnetlink-devel-1.0.0-1.el6.x86_64 is already installe
cd keepalived-1.2.24
./configure --prefix=/usr/local/keepalived##編譯,並指定安裝路徑,
make && make install
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/#指定啓動腳本軟鏈接
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/etc/keepalived /etc/
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin
軟鏈接設置後能夠在後面的目錄中生成一個新的文件,若是設置錯了,把生成的新文件刪除,再進行軟鏈接設置便可。
編輯集羣信息配置文件
[root@server1 etc]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost#接收警報的 email 地址,能夠添加多個
}
notification_email_from Alexandre.Cassen@firewall.loc #設置郵件的發送地址
smtp_server 192.168.200.1#設置 smtp server 地址
smtp_connect_timeout 30#設置鏈接 smtp 服務器超時時間
router_id LVS_DEVEL#load balancer 的標識 ID,用於 email 警報
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER設置爲主機###備機改成 BACKUP,此狀態是由 priority 的值來決定的,當前priority 的值小於備機的值,那麼將會失去 MASTER 狀態
interface eth0#HA 監測網絡接口
virtual_router_id 51##主、備機的 virtual_router_id 必須相同,取值 0-255
priority 100##優先級,備份機改成50,數字大的優先級高,主>備
advert_int 1#主備之間通告間隔秒數
authentication {
auth_type PASS##設置認證類型,pass 或者 AH
auth_pass 1111##設置驗證密碼
}
virtual_ipaddress {#設置虛擬 IP 地址,能夠設置多個虛擬 IP 地址,每行一個
172.25.50.100
}
}
virtual_server 172.25.50.100 80 {#定義虛擬服務器
delay_loop 6#每隔 6 秒查詢 realserver 狀態
lb_algo rr#每隔 6 秒查詢 realserver 狀態
lb_kind DR#LVS 是用 DR 模式
# persistence_timeout 50
protocol TCP#指定轉發協議類型,有 tcp 和 udp 兩種
real_server 172.25.50.30 80 {#配置服務節點
weight 1配置服務節點的權值,權值大小用數字表示,數字越大,權
值越高,設置權值的大小能夠爲不一樣性能的服務器分配不一樣的負載,能夠對性能高的服務器設
置較高的權值,而對性能較低的服務器設置相對較低的權值,這樣就合理的利用和分配了系統
資源
TCP_CHECK {#realserve 的狀態檢測設置部分,單位是秒
connect_timeout 3#3 秒無響應超時
nb_get_retry 3#重複次數
delay_before_retry 3#重試間隔
}
}
real_server 172.25.50.40 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
注意:紅色字體只有 備機 keepalived配置只改動紅色部分
將配置文件複製到備機server2上,並進行修改
將server3和server4上的httpd服務開啓,並設置vip:
ip addr add 172.25.50.100/32 dev eth0l兩臺realserver都添加
將server1和server2上的keepalived服務開啓。
測試:
1. 高可用測試:中止 master 上的 keepalived 服務,看 backup 是否接管。
2. 負載均衡測試:訪問 http://192.168.0.163,看到頁面在兩個 realserver 上切換表示成功!
你也能夠經過 ipvsadm -Lnc 查看詳細鏈接狀況!
3. 故障切換測試:任意關閉 realserver 上的 httpd 服務,Keepalived 監控模塊是否能及時發現,
而後屏蔽故障節點,同時將服務轉移到正常節點來執行