LVS基礎及LVS+Keepalived實現雙主高可用負載均衡php
LB集羣:html
(Load Balancing)即負載均衡集羣,其目的是爲了提升訪問的併發量及提高服務器的性能,其 實現方式分爲硬件方式和軟件方式。前端
硬件實現方式:mysql
經常使用的有 F5公司的BIG-IP系列、A10公司的AX系列、Citrix公司的 NetScaler系列等nginx
軟件實現方式:算法
LVS工做於傳輸層、nginx工做於應用層、haproxy工做於傳輸層和應用層sql
本文主要講解LVS。數據庫
1、什麼是LVS ?apache
1. LVS:(Linux Virtual Server)Linux虛擬服務,工做於前端調度器內核的netfilter模塊上,根據請求報文的目標IP和目標PORT將其調度轉發至後端的某主機,其轉發是依賴於四層協議的特徵進行轉發的,所以須要在內核的TCP/IP協議棧進行過濾篩選,這樣的過濾轉發規則由系統管理員進行定義。
後端
2. LVS兩段式組成:
ipvsadm:用戶空間的命令行工具,用於管理集羣服務及集羣服務上的主機(RS)。
ipvs:工做與內核上的netfilter的INPUT鉤子之上的程序,可根據用戶定義的集羣實現請求轉發。
工做原理圖解以下:
LVS集羣專用術語:
CIP:發送請求的客戶端IP地址。
VIP:lvs調度器的IP地址,也是向客戶端提供服務的IP地址。
DIP:lvs調度器與後端real server之間通訊使用的IP地址。
RIP:提供真正服務的real server的IP地址。
vs:虛擬服務器,調度器,
rs: 後端提供真實服務的服務器
3.LVS集羣的類型:
1)lvs-nat:
多目標的DNAT,經過將請求報文中的目標地址和目標端口修改成挑選出的某RS的RIP和PORT實現轉發
2)lvs-dr:
經過爲請求報文的從新封閉一個MAC首部進行轉發,源MAC是DIP所在接口的MAC,目標MAC是挑選出某RS的RIP所在接口的MAC地址;IP首部不會發生變化(CIP<-->VIP)
3)lvs-tun:
不修改請求報文的IP首部(源IP爲CIP,目標IP爲VIP),而是原IP首部以外再封裝一個IP首部(源IP爲DIP,目標IP爲挑選出的RS的RIP)
4)lvs-fullnat:
經過同時修改請求報文的源IP地址(CIP-->DIP)和目標IP地址(VIP-->RIP)進行轉發
4.LVS集羣的調度算法(Scheduler):
根據其調度時是否考慮後端主機的當前負載,可分爲靜態方法和動態方法兩類
靜態算法:僅根據算法自身進行調度
動態算法:根據算法及後端主機當前的負載狀態進行調度
5.ipvsadm管理工具用法
管理集羣:ipvsadm -A|E -t|u|f service_address [-s scheduler]
A:增 -E:修改
-t:tcp -u:udp -f:firewall mark
-s scheduler:調度算法,默認爲wlc
ipvsadm -D -t|u|f service_address 刪除集羣
管理集羣上的RS:
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-a:增
-e:改
-r server-address :RS的地址;rip[:port]
-g, gateway, dr,默認
-i, ipip, tun
-m, masquerade, nat
-w weight
查看:
ipvsadm -L|l [options]
-n, --numeric:數字格式顯示IP和PORT;
--exact:精確值,不作單位換算;
-c, --connection:顯示IPVS鏈接;
--stats:統計數據;
--rate:速率;
清空: ipvsadm -C:clear
保存和重載:
保存:
ipvsadm -S > /PATH/TO/SOME_RULE_FILE
ipvsadm-save > /PATH/TO/SOME_RULE_FILE
重載:
ipvsadm -R < /PATH/TO/SOME_RULE_FILE
ipvsadm-restore < /PATH/TO/SOME_RULE_FILE
清空計數器:
ipvsadm -Z [-t|u|f service-address]
2、LVS-NAT工做模型及原理
1.lvs-nat原理
多目標的DNAT,經過將請求報文中的目標地址和目標端口修改成挑選出的某RS的RIP和PORT實現轉發;
(1)RIP和DIP必須在同一IP網絡,且應該使用私有地址;RS的網絡要指向DIP(保證響應報文必須經由VS);
(2)請求報文和響應報文都經由Director轉發,較高負載下,Director易於成爲系統性能瓶頸;
(3)支持端口映射;
(4)VS必須是Linux,RS能夠是任意OS
2.lvs-nat測試
測試環境:3臺虛擬機
Director主機(兩張網卡)IP:
外網:172.18.123.14
內網:192.168.100.254
RS1主機IP:192.168.100.20
RS2主機IP:192.168.100.21
注:Director內網ip及RS主機網卡均設置爲僅主機模式,RS主機的網關需指向192.168.100.254,安裝apache服務且處於開啓狀態。
1).在Director主機上安裝ipvsadm並配置集羣服務。
2).測試
3、LVS-DR工做模型及原理
1.lvs-dr:
Direct Routing:經過爲請求報文的從新封閉一個MAC首部進行轉發,源MAC是DIP所在接口的MAC,目標MAC是挑選出某RS的RIP所在接口的MAC地址;IP首部不會發生變化(CIP<-->VIP);
1)確保前端路徑器將目標IP爲VIP的請求報文發往Director:
解決方案:
在路由器上靜態綁定VIP和Director的MAC地址;
禁止RS響應VIP的ARP請求,禁止RS的VIP進行通告
(a) arptables
(b) 修改RS的內核參數,並把VIP綁定lo的別名上;
arp_ignore, arp_announce
2)RS的RIP可使用私有地址,也可使用公網地址;
3)RS跟Director必須在同一物理網絡;RS的網關必須不能指向DIP;
4)請求報文必須由Directory調度,但響應報文必須不能經由Director;
5)不支持端口映射;
6)RS可使用大多的OS;
2.lvs-dr測試
測試環境(CentOS 7)在director上安裝ipvsadm
Director:
DIP:172.18.123.14
VIP:172.18.123.15
RS1:
RIP:172.18.123.50
VIP:172.18.123.15
RS2:
RIP:172.18.123.51
VIP:172.18.123.15
1.關閉RS1、RS2的arp響應:分別在RS1和RS2主機上執行如下命令
2.分別在三臺主機上配置VIP;
分別在RS1及RS2上設置VIP
3.增長路由
在Director:
RS1及RS2:
4.在Director上添加集羣列表
5.測試
注:arp響應限制
1)arp_ignore:
定義對目標地址爲本地IP的ARP詢問不一樣的應答模式0
0 - (默認值): 迴應任何網絡接口上對任何本地IP地址的arp查詢請求
1 - 只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求
2 -只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,且來訪IP必須在該網絡接口的子網段內
3 - 不迴應該網絡界面的arp請求,而只對設置的惟一和鏈接地址作出迴應
4-7 - 保留未使用
8 -不迴應全部(本地地址)的arp查詢
2)arp_announce:
對網絡接口上,本地IP地址的發出的,ARP迴應,做出相應級別的限制: 肯定不一樣程度的限制,宣佈對來自本地源IP地址發出Arp請求的接口
0 - (默認) 在任意網絡接口(eth0,eth1,lo)上的任何本地地址
1 -儘可能避免不在該網絡接口子網段的本地地址作出arp迴應. 當發起ARP請求的源IP地址是被設置應該經由路由達到此網絡接口的時候頗有用.此時會檢查來訪IP是否爲全部接口上的子網段內ip之一.若是改來訪IP不屬於各個網絡接口上的子網段內,那麼將採用級別2的方式來進行處理.
2 - 對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通訊的本地地址.首要是選擇全部的網絡接口的子網中外出訪問子網中包含該目標IP地址的本地地址. 若是沒有合適的地址被發現,將選擇當前的發送網絡接口或其餘的有可能接受到該ARP迴應的網絡接口來進行發送.
4、基於Keepalived實現lvs雙主高可用集羣及部署應用
1.實驗拓撲結構圖
2.部署環境
3.安裝軟件
1)保證LVS1及LVS2時間同步,並可以通訊,並在兩臺主機上安裝keepalived及ipvsadm
2)配置LVS1的keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from zzpp@zp.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MY_LVS
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 123
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass abcdef
}
virtual_ipaddress {
172.18.123.22
}
}
vrrp_instance VI_2 {
state BACKUP
interface eno16777736
virtual_router_id 223
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass abcdef
}
virtual_ipaddress {
172.18.123.23
}
}
virtual_server 172.18.123.22 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 172.18.123.50 80 {
weight 1
HTTP_GET {
url {
path /
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.18.123.51 80 {
weight 1
HTTP_GET {
url {
path /
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 172.18.123.23 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 172.18.123.50 80 {
weight 1
HTTP_GET {
url {
path /
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.18.123.51 80 {
weight 1
HTTP_GET {
url {
path /
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
3) scp LVS1的keepalived.conf到LVS2的/etc/keepalived/下,並修改下述標識內容,其餘內容不變。
vrrp_instance VI_1 {
state BACKUP
interface eno16777736
virtual_router_id 123
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass abcdef
}
virtual_ipaddress {
172.18.123.22
}
}
vrrp_instance VI_2 {
state MASTER
interface eno16777736
virtual_router_id 223
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass abcdef
}
virtual_ipaddress {
172.18.123.23
}
}
4)在RS1及RS2上安裝httpd、php及php-mysql
準備測試頁
配置內核及VIP,運行下面腳本:bash
#!/bin/bash
#
VIP1=172.18.123.22
VIP2=172.18.123.23
interface1="lo:0"
interface2="lo:1"
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $interface1 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up
route add -host $VIP1 dev $interface1
ifconfig $interface2 $VIP2 broadcast $VIP2 netmask 255.255.255.255 up
route add -host $VIP2 dev $interface2
;;
stop)
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $interface1 down
ifconfig $interface2 down
;;
status)
if ifconfig lo:0 | grep $VIP1 &> /dev/null && ifconfig lo:1 | grep $VIP2 &> /dev/null;then
echo "ipvs is running"
else
echo "ipvs is stopped"
fi
;;
*)
echo "Usage: `basename $0` {start|stop|status}"
exit 1
esac
查看Rs主機的ip信息:
5)測試,啓動LVS1及LVS2主機上的keepalived服務,查看兩節點的ip信息及ipvs規則
經過瀏覽器訪問172.18.123.22及172.18.123.23
停掉LVS2的keepalived服務,查看LVS1的ip及測試訪問均正常。
6)在SQL1主機上安裝Mariadb數據庫,並受權用戶
在兩臺RS上配置測試是否連通Mariadb
4、部署phpwind
1.在RS1及RS2主機上下載phpwind_v9.0.1.141223_utf8.zip,解壓到/var/www/html目錄下,更改解壓後目錄的屬主屬組爲apache用戶
出現下述錯誤,安裝php-xml便可
安裝成功
測試OK。