三、高性能集群Linux virtual server
1、cluster概念
系統擴展方式:
Scale up:向上擴展,增強。
Scale out:向外擴展增加設備,調度分配問題,cluster
u Cluster:集群,為解決某個特定問題將多臺計算機組合起來形成的單個系統
u Linux Cluster類型:
? LB:Load Balancing,負載均衡
? HA:High Availiablity,高可用,SPOF(single Point Of failure)
MTBF:Mean Time Between Failure 平均無故障時間
MTTR:Mean Time To Restoration( repair)平均恢復前時間
A=MTBF/(MTBF+MTTR)
(0,1):99%, 99.5%, 99.9%, 99.99%, 99.999%, 99.9999%
? HPC:High-performance computing,高性能 www.top500.org
u 分布式系統:
分布式存儲:云盤
分布式計算:hadoop,Spark
uLB Cluster的實現
u硬件
F5 Big-IP
Citrix Netscaler
A10 A10
u軟件
lvs:Linux Virtual Server
nginx:支持四層調度
haproxy:支持四層調度
ats:apache traffic server,yahoo捐助
perlbal:Perl 編寫
Pound
u基于工作的協議層次劃分:u
傳輸層(通用):DPORTLVS:nginx:streamhaproxy:mode tcpu
應用層(專用):針對特定協議,自定義的請求模型分類
proxy server:
http:nginx, httpd, haproxy(mode http), …fastcgi:nginx, httpd, …mysql:mysql-proxy,
會話保持:負載均衡
(1) session sticky:同一用戶調度固定服務器
Source IP:LVS sh算法(對某一特定服務而言)
Cookie
(2) session replication:每臺服務器擁有全部session
session multicast cluster
(3) session server:專門的session服務器
Memcached,Redis
u HA集群實現方案
keepalived:vrrp協議
ais:應用接口規范
heartbeat
cman+rgmanager(RHCS)
coresync_pacemaker
分布式系統。
2、lvs介紹
章文嵩 基層內接。
Vs:虛擬服務器。
Rs:真正提供服務
L4:四層調度
u LVS:Linux Virtual Server,負載調度器,集成內核 章文嵩 阿里
官網:http://www.linuxvirtualserver.org/
VS: Virtual Server,負責調度
RS: Real Server,負責真正提供服務
L4:四層路由器或交換機
u 工作原理:VS根據請求報文的目標IP和目標協議及端口將其調度轉發至某RS,根
據調度算法來挑選RS
u iptables/netfilter:
iptables:用戶空間的管理工具
netfilter:內核空間上的框架
流入:PREROUTING –> INPUT
流出:OUTPUT –> POSTROUTING
轉發:PREROUTING –> FORWARD –> POSTROUTING DNAT:
目標地址轉換; PREROUTING
工作原理:vs根據請求報文的目標ip和目標協議及端口將其調度轉發至某RS。根據調度算法來挑選RS。
數據包三種流向:進入、經過、穿過。
lvs集群類型中的術語:
?VS:Virtual Server,Director Server(DS)
Dispatcher(調度器),Load Balancer
?RS:Real Server(lvs), upstream server(nginx)
backend server(haproxy)
?CIP:Client IP
?VIP: Virtual serve IP VS外網的IP
?DIP: Director IP VS內網的IP
?RIP: Real server IP
?訪問流程:CIP <–> VIP == DIP <–> RIP
四表:mangle,nat,filter,raw
五鏈:
DANT:目標的地址的轉變。
訪問流程:cip—-vip—-dip—-rip
3、Lvs集群的類型
ulvs: ipvsadm/ipvs
ipvsadm:用戶空間的命令行工具,規則管理器
用于管理集群服務及RealServer
ipvs:工作于內核空間netfilter的INPUT鉤子上的框架
ulvs集群的類型:
lvs-nat:修改請求報文的目標IP,多目標IP的DNAT
lvs-dr:操縱封裝新的MAC地址
lvs-tun:在原請求IP報文之外新加一個IP首部
lvs-fullnat:修改請求報文的源和目標IP
4、Lvs-nat模式
本質上就是多目標的DNAT。通過將請求報文
調度過程:NAT模式IP包調度過程。
- RIP和DIP在一個網段上(可以不再一個上),應該使用私網地址。rs的網關要指向dip。
(2)請求報文和響應報文都必須經由Director轉發,Director易于成為系統瓶頸
(3)支持端口映射,可修改請求報文的目標PORT
(4)VS必須是Linux系統,RS可以是任意OS系統
Nat模式ip包調度過程
Vs/nat的體系結構
5、lvs-DR模型
Ip地址,啟動時候發出arp的廣播,使用此地址。
數據發送回去的時候直接到達cip,不是原路返回的。
LVS-DR:Direct Routing,直接路由,LVS默認模式,應用最廣泛,通過為請求報文重新
封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出
的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變
u Director和各RS都配置有VIP
(1) 確保前端路由器將目標IP為VIP的請求報文發往Director
? 在前端網關做靜態綁定VIP和Director的MAC地址
? 在RS上使用arptables工具
arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle –mangle-ip-s $RIP
? 在RS上修改內核參數以限制arp通告及應答級別
arp_announce
arp_ignore
- RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網絡;R的網關不能指向DIP,以確保響應報文不會經由Director(3) RS和Director要在同一個物理網絡(4) 請求報文要經由Director,但響應報文不經由Director,而由RS直接發往Client(5) 不支持端口映射(端口不能修敗)(6) RS可使用大多數OS
避免ip沖突:
- 網絡中發廣播,
- 對外不宣城使用ip的地址。
Rs的rip可以使用私網地址,可以使用公網地址。
請求報文經由lvs,響應報文不經過lvs,有rs直接到達客戶端。
端口不支持映射。
Rs距離太近了。
6、lvs-tun模式
不修改請求報文的頭部,直接增加一層報文頭部。
- dip,VIP,rip都應該是公網地址
- Rs的網關不能,也不能指向dip
- 請求報文要經由director,但影響不能經由director
- 不支持端口映射
- Rs的os必須支持隧道功能
?
7、lvs-fullnat模式
同時更改請求報文的源ip地址和目標ip地址進行轉發。
Cip ??—-> dip
Vip ??—–>rip
- VIP是公網地址,rip和dip是私網地址,且通常不在同一ip網絡,因此,rip的網關一般不會指向dip。
- 認識收到的請求報文原地址是dip,因此,只需要響應給dip,但director還要將其發往client。
- 請求和享用報文都經由director
- 支持端口映射
此類型kernel默認不支持。
8、lvs工作模式總結
Vs/nat | Vs/tun | Vs/dr | |
Server | Any | Tunneling | Non-arp device |
Server network | Private | Lan/wan | Lan |
Servernumber | Low(10-20) | High(100) | High(100) |
Server gateway | Load balancer | Own router | Own router |
u lvs-nat與lvs-fullnat:請求和響應報文都經由Director
lvs-nat:RIP的網關要指向DIP,源地址指向VIP,
lvs-fullnat:RIP和DIP未必在同一IP網絡,但要能通信,源地址也要替換。
u?lvs-dr與lvs-tun:請求報文要經由Director,但響應報文由RS直接發
往Client
lvs-dr:通過封裝新的MAC首部實現,通過MAC網絡轉發,客戶端發請求到lvs,只是參與請求報文,不參與報文的轉發。
lvs-tun:通過在原IP報文外封裝新IP頭實現轉發,支持遠距離通信。兩個報文頭部。請求和響應報文不是同路返回。
9、ipvs scheduler
ipvs scheduler:
u根據其調度時是否考慮各RS當前的負載狀態
兩種:靜態方法和動態方法
調度:靜態調度和動態調度
靜態方法:僅根據算法本身進行調度。
- RR輪詢
- WRR加權輪詢
- sh,實現session sticky,源地址hash運算。
- DH:目標地址hash。正向代理緩存的情況。
不考慮后端服務器的負載狀態。
6種動態算法:
動態方法:主要根據每rs當前的負載狀態機調度算法進行調度,overhead=value較小的rs將被調度:
- LC:least connections適用于長連接應用
Overhead=activeconns*256+inactiveconns
- WLC:默認調度。
Overhead=(activeconns*256+inactiveconns)/weight
- SED:初始連接高權重優先
Overhead=(activeconns+1)*256/weight
- NQ:第一輪均勻分配,后續SED。
- LBLC:動態的DH算法,使用場景,根據負載狀態實現正向代理。
- LBLCR:帶復制功能的LBLC。解決LBLC負載不均衡問題,從負載重的復制到負載輕的rs。
10、ipvs
Ipvsadm/ipvs:
Ipvs:
grep -i -C 10 “ipvs” /boot/config-VERSION-RELEASE.x86_64
支持的協議:TCP, UDP, AH, ESP, AH_ESP, SCTP
Ipvs集群:
管理集群服務
管理服務商的rs
11、ipvsadm包構成
程序包:ipvsadm:
Unit File: ipvsadm.service
?主程序:/usr/sbin/ipvsadm
?規則保存工具:/usr/sbin/ipvsadm-save
?規則重載工具:/usr/sbin/ipvsadm-restore
?配置文件:/etc/sysconfig/ipvsadm-config
12、ipvsadm命令
核心功能:
集群服務管理:增刪改,
集群服務的rs管理:增、刪、改
查看:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [–ppersistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address 刪除
ipvsadm –C 清空
ipvsadm –R 重載
ipvsadm -S [-n] 保存
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-addres
u管理集群服務:增、改、刪
u增、改:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
u刪除:
ipvsadm -D -t|u|f service-address
uservice-address:
-t|u|f:
-t: TCP協議的端口,VIP:TCP_PORT
-u: UDP協議的端口,VIP:UDP_PORT
-f:firewall MARK,標記,一個數字
u[-s scheduler]:指定集群的調度算法,默認為wlc
u管理集群上的RS:增、改、刪
u增、改:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w
weight]
u刪:ipvsadm -d -t|u|f service-address -r server-address
userver-address:
rip[:port] 如省略port,不作端口映射
u選項:
lvs類型:
-g: gateway, dr類型,默認
-i: ipip, tun類型
-m: masquerade, nat類型
-w weight:權重
清空定義的所有內容:ipvsadm –C
u清空計數器:ipvsadm -Z [-t|u|f service-address]
u查看:ipvsadm -L|l [options]
–numeric, -n:以數字形式輸出地址和端口號
–exact:擴展信息,精確值
–connection,-c:當前IPVS連接輸出
–stats:統計信息
–rate :輸出速率信息
uipvs規則: /proc/net/ip_vs
uipvs連接:/proc/net/ip_vs_conn
13、保存及重載規則
保存:議保存至/etc/sysconfig/ipvsadm
ipvsadm-save > /PATH/TO/IPVSADM_FILE
ipvsadm -S > /PATH/TO/IPVSADM_FILE
systemctl stop ipvsadm.service
u重載:
ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
ipvsadm -R < /PATH/FROM/IPVSADM_FILE
systemctl restart ipvsadm.service
yum clean all 清理yum源的緩存。
Lvs只是處理請求報文,網關可以隨意配置,不能不配置。
14、Lvs
u負載均衡集群設計時要注意的問題
(1) 是否需要會話保持
(2) 是否需要共享存儲
共享存儲:NAS, SAN, DS(分布式存儲)
數據同步:
ulvs-nat:
設計要點:
(1) RIP與DIP在同一IP網絡, RIP的網關要指向DIP
(2) 支持端口映射
(3) Director要打開核心轉發功能
##############練習題一個
15、lvs-DR
DR模型中各主機均需要配置VIP,解決地址沖突的方式有三種:
- 在前端網關做靜態綁定
- 在各rs使用arptables
- 在各rs修改內核參數,來限制arp響應和通告的級別
限制響應級別:arp_ignore
0:默認值,表示可使用本地任意接口上配置的任意地址進行響應
1: 僅在請求的目標IP配置在本地主機的接收到請求報文的接口上時,才給予響應
u 限制通告級別:arp_announce
0:默認值,把本機所有接口的所有信息向每個接口的網絡進行通告
1:盡量避免將接口信息向非直接連接網絡進行通告
2:必須避免將接口信息向非本網絡進行通告
16、rs預配置腳本信息
#!/bin/bash
vip=192.168.0.100
mask=’255.255.255.255‘
dev=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 $dev $vip netmask $mask broadcast $vip up
route add -host $vip dev $dev
;;
stop)
ifconfig $dev down
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
;;
*)
echo “Usage: $(basename $0) start|stop”
exit 1
;;
Esac
17、vs的配置腳本
#!/bin/bash
vip=’192.168.0.100′
iface=’eth0:1’mask=’255.255.255.255′
port=’80’
rs1=’192.168.0.101′
rs2=’192.168.0.102′
scheduler=’wrr’
type=’-g’
case $1 in
start)
ifconfig $iface $vip netmask $mask broadcast $vip up
iptables -F
ipvsadm -A -t ${vip}:${port} -s $schedule
ripvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
;;
stop)
ipvsadm -C
ifconfig $iface down
;;
*)
echo “Usage $(basename $0) start|stop“;exit 1
;;
esac
##############################實現NAT模式
18、firewall Mark
Fwm:fire wall mark
Mark target 可用于給特定的報文打標記
–set-mark value
其中:value為十六進制數字
借助于防火墻標記分類報文,而后基于標記定義集群服務,可將多個不同的應用使用同一個集群服務進行調度。
實現方法:
在Director主機打標記:
iptables -t mangle -A PREROUTING -d $vip -p $proto –m multiport –dports $port1,$port2,… -j MARK –set-mark NUMBER
?在Director主機基于標記定義集群服務:
ipvsadm -A -f NUMBER [options]
19、持久連接
u session 綁定:對共享同一組RS的多個集群服務,需要統一進行綁定,lvs sh算法無
法實現
u 持久連接( lvs persistence )模板:實現無論使用任何調度算法,在一段時間內
(默認360s ),能夠實現將來自同一個地址的請求始終發往同一個RS
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
u 持久連接實現方式:
? 每端口持久(PPC):每個端口對應定義為一個集群服務,每集群服務單獨調度
? 每防火墻標記持久(PFWMC):基于防火墻標記定義集群服務;可實現將多個端
口上的應用統一調度,即所謂的port Affinity
? 每客戶端持久(PCC):基于0端口(表示所有服務)定義集群服務,即將客戶端
對所有應用的請求都調度至后端主機,必須定義為持久模式
20、lvs高可用性
u 1 Director不可用,整個系統將不可用;SPoF Single Point of Failure
解決方案:高可用
keepalived heartbeat/corosync
u 2 某RS不可用時,Director依然會調度請求至此RS
解決方案: 由Director對各RS健康狀態進行檢查,失敗時禁用,成功時啟用
keepalived heartbeat/corosync ldirectord
檢測方式:
(a) 網絡層檢測,icmp
(b) 傳輸層檢測,端口探測
(c) 應用層檢測,請求某關鍵資源
RS全不用時:backup server, sorry server
21、ldirectord
uldirectord:監控和控制LVS守護進程,可管理LVS規則
u包名:ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
u文件:
/etc/ha.d/ldirectord.cf 主配置文件
/usr/share/doc/ldirectord-3.9.6/ldirectord.cf 配置模版
/usr/lib/systemd/system/ldirectord.service 服務
/usr/sbin/ldirectord 主程序
/var/log/ldirectord.log 日志
/var/run/ldirectord.ldirectord.pid pid文件
22、ldirectord配置文件實例
checktimeout=3
checkinterval=1
autoreload=yes
logfile=“/var/log/ldirectord.log“ #日志文件
quiescent=no #down時yes權重為0,no為刪除
virtual=5 #指定VS的FWM或IP:port
real=172.16.0.7:80 gate 2
real=172.16.0.8:80 gate 1
fallback=127.0.0.1:80 gate #sorry server
service=http
scheduler=wrr
checktype=negotiate
checkport=80
request=”index.html”
receive=“Test Ldirector”
四、Nginx
1、性能影響
u有很多研究都表明,性能對用戶的行為有很大的影響:u79%的用戶表示不太可能再次打開一個緩慢的網站u47%的用戶期望網頁能在2秒鐘以內加載u40%的用戶表示如果加載時間超過三秒鐘,就會放棄這個網站u頁面加載時間延遲一秒可能導致轉換損失7%,頁面瀏覽量減少11%u8秒定律:用戶訪問一個網站時,如果等待網頁打開的時間超過8秒,會有超過30%的用戶放棄
2、httpd mpm
Prefork:進程模型,兩級結構,主進程master負責生成子進程,每個子進程負責影響一個請求。
Worker:線程模型,三級結構,主進程master負責生成子進程,每個子進程負責生成多個線程,每個線程響應一個請求。
Event:線程模型,三級結構,主進程master負責生成子進程,每個子進程響應多個請求。
3、I/O模型
網絡IO:本質上就是socket讀取
磁盤IO、
每次IO,都要經由兩個階段。
第一步:將數據從磁盤文件先加載至內核內存空間(緩沖區),等待數據準備完成,時間較長。
第二步:將數據從內核緩沖區復制到用戶空間的進程的內存中,時間較短。
同步/異步:關注的是消息通信機制。
同步:synchronous 調用者自已主動等待被調用者返回消息,才能繼續執行
異步:asynchronous 被調用者通過狀態、通知或回調機制主動通知調用者被調用者的運行狀態
阻塞/非阻塞:關注調用者在等待結果返回之前所處的狀態
阻塞:blocking,指IO操作需要徹底完成后才返回到用戶空間,調用結果返回之前,調用者被掛起。
非阻塞:nonblocking,指IO操作被調用后立即返回給用戶一個狀態值,無需等到IO操作徹底完成,最終的調用結果返回之前,調用者不會被掛起
I/O:模型:
阻塞型,非阻塞型、復用型、信號驅動型、異步
4、IO模型的實現
1)同步阻塞IO模型
u同步阻塞IO模型是最簡單的IO模型,用戶線程在內核進行IO操作時被阻塞
u用戶線程通過系統調用read發起IO讀操作,由用戶空間轉到內核空間。內核等
到數據包到達后,然后將接收的數據拷貝到用戶空間,完成read操作
u用戶需要等待read將數據讀取到buffer后,才繼續處理接收的數據。整個IO請
求的過程中,用戶線程是被阻塞的,這導致用戶在發起IO請求時,不能做任何
事情,對CPU的資源利用率不夠
2)同步非阻塞IO模型
u用戶線程發起IO請求時立即返回。但并未讀取到任何數據,用戶線程需要不斷
地發起IO請求,直到數據到達后,才真正讀取到數據,繼續執行。即 “輪詢”
機制
u整個IO請求的過程中,雖然用戶線程每次發起IO請求后可以立即返回,但是為
了等到數據,仍需要不斷地輪詢、重復請求,消耗了大量的CPU的資源
u是比較浪費CPU的方式,一般很少直接使用這種模型,而是在其他IO模型中使
用非阻塞IO這一特性
3)IO多路復用模型
u 多個連接共用一個等待機制,本模型會阻塞進程,但是進程是阻塞在select或者poll這兩個系統調用上,而不是阻塞在真正的IO操作上
u 用戶首先將需要進行IO操作添加到select中,繼續執行做其他的工作(異步),同時等待select系統調用返回。當數據到達時,IO被激活,select函數返回。用戶線程正式發起read請求,讀取數據并繼續執行。
u 從流程上來看,使用select函數進行IO請求和同步阻塞模型沒有太大的區別,甚至還多了添加監視IO,以及調用select函數的額外操作,效率更差。并且阻塞了兩次,但是第一次阻塞在select上時,select可以監控多個IO上是否已有IO操作準備就緒,即可達到在同一個線程內同時處理多個IO請求的目的。而不像阻塞IO那種,一次只能監控一個IO
u 雖然上述方式允許單線程內處理多個IO請求,但是每個IO請求的過程還是阻塞的(在select函數上阻塞),平均時間甚至比同步阻塞IO模型還要長。如果用戶線程只是注冊自己需要的IO請求,然后去做自己的事情,等到數據到來時再進行處理,則可以提高CPU的利用率
u IO多路復用是最常使用的IO模型,但是其異步程度還不夠“徹底”,因為它使用了會阻塞線程的select系統調用。因此IO多路復用只能稱為異步阻塞IO模型,而非真正的異步IO
4)多路IO復用
IO多路復用是指內核一旦發現進程指定的一個或者多個IO條件準備讀取,它就通
知該進程
u IO多路復用適用如下場合:
? 當客戶端處理多個描述符時(一般是交互式輸入和網絡套接口),必須使用
I/O復用
? 當一個客戶端同時處理多個套接字時,此情況可能的但很少出現
? 當一個TCP服務器既要處理監聽套接口,又要處理已連接套接口,一般也要用
到I/O復用
? 當一個服務器即要處理TCP,又要處理UDP,一般要使用I/O復用
? 當一個服務器要處理多個服務或多個協議,一般要使用I/O復用
5)信號驅動IO模型
信號驅動IO:signal-driven I/O
u用戶進程可以通過sigaction系統調用注冊一個信號處理程序,然后主程序可以
繼續向下執行,當有IO操作準備就緒時,由內核通知觸發一個SIGIO信號處理程
序執行,然后將用戶進程所需要的數據從內核空間拷貝到用戶空間
u此模型的優勢在于等待數據報到達期間進程不被阻塞。用戶主程序可以繼續執
行,只要等待來自信號處理函數的通知
u該模型并不常用
I/O模型的具體實現:
Select:Linux實現對應,I/O復用模型,BSD4.2最早實現。
6)異步IO模型
u異步IO與信號驅動IO最主要的區別是信號驅動IO是由內核通知何時可以進行IO
操作,而異步IO則是由內核告訴我們IO操作何時完成了。具體來說就是,信號
驅動IO當內核通知觸發信號處理程序時,信號處理程序還需要阻塞在從內核空
間緩沖區拷貝數據到用戶空間緩沖區這個階段,而異步IO直接是在第二個階段
完成后內核直接通知可以進行后續操作了
u相比于IO多路復用模型,異步IO并不十分常用,不少高性能并發服務程序使用
IO多路復用模型+多線程任務處理的架構基本可以滿足需求。況且目前操作系統
對異步IO的支持并非特別完善,更多的是采用IO多路復用模型模擬異步IO的方
式(IO事件觸發時不直接通知用戶線程,而是將數據讀寫完畢后放到用戶指定
的緩沖區中)
7)五種IO模型
lamp ?lnmp ?lemp
8)IO模型的具體實現
主要實現方式有幾種:
Select:Linux實現對應,IO復用模型,bsd4.2最早實現。
Poll:Linux實現,對應IO復用模型,system v Unix最早實現。
Epoll:Linux實現,對應IO模型,具有信號驅動IO模型的某些特征。
Kqueue:rreedsd實現,對應IO復用模型,具備信號驅動IO模型的某些特征。
/dev/poll:SUN的Solaris實現,對應I/O復用模型,具有信號驅動I/O模型的某些特性
Iocp Windows實現,對應第5種(異步I/O)模型
5、select/poll/epoll
uSelect:POSIX所規定,目前幾乎在所有的平臺上支持,其良好跨平臺支持也是
它的一個優點,本質上是通過設置或者檢查存放fd標志位的數據結構來進行下
一步處理
u缺點
?單個進程可監視的fd數量被限制,即能監聽端口的數量有限
cat /proc/sys/fs/file-max
?對socket是線性掃描,即采用輪詢的方法,效率較低
?select 采取了內存拷貝方法來實現內核將 FD 消息通知給用戶空間,這樣一
個用來存放大量fd的數據結構,這樣會使得用戶空間和內核空間在傳遞該結
構時復制開銷大
poll
?本質上和select沒有區別,它將用戶傳入的數組拷貝到內核空間,然后查詢每
個fd對應的設備狀態
?其沒有最大連接數的限制,原因是它是基于鏈表來存儲的
?大量的fd的數組被整體復制于用戶態和內核地址空間之間,而不管這樣的復
制是不是有意義
?poll特點是“水平觸發”,如果報告了fd后,沒有被處理,那么下次poll時會
再次報告該fd
?邊緣觸發:只通知一次
u epoll:在Linux 2.6內核中提出的select和poll的增強版本
? 支持水平觸發LT和邊緣觸發ET,最大的特點在于邊緣觸發,它只告訴進程哪些fd剛剛
變為就需態,并且只會通知一次
? 使用“事件”的就緒通知方式,通過epoll_ctl注冊fd,一旦該fd就緒,內核就會采用
類似callback的回調機制來激活該fd,epoll_wait便可以收到通知
u 優點:
? 沒有最大并發連接的限制:能打開的FD的上限遠大于1024(1G的內存能監聽約10萬個
端口)
? 效率提升:非輪詢的方式,不會隨著FD數目的增加而效率下降;只有活躍可用的FD
才會調用callback函數,即epoll最大的優點就在于它只管理“活躍”的連接,而跟連
接總數無關
? 內存拷貝,利用mmap()文件映射內存加速與內核空間的消息傳遞;即epoll使用
mmap減少復制開銷
6、Nginx介紹
Nginx:engine X ,2002年,開源,商業版
uhttp協議:web服務器(類似于httpd)、http reverse proxy(類似于
httpd)、imap/pop3 reverse proxy,tcp
uNGINX is a free, open-source, high-performance an HTTP and reverse
proxy server, a mail proxy server, and a generic TCP/UDP proxy server
uC10K(10K Connections)
u二次開發版:Tengine, OpenResty
u官網:http://nginx.org
正向代理和反向代理:
u特性:
? 模塊化設計,較好的擴展性
? 高可靠性
? 支持熱部署:不停機更新配置文件,升級版本,更換日志文件
? 低內存消耗:10000個keep-alive連接模式下的非活動連接,僅需要2.5M內存
? event-driven,aio,mmap,sendfile
u基本功能:
? 靜態資源的web服務器
? http協議反向代理服務器
? pop3/imap4協議反向代理服務器
? FastCGI(lnmp),uWSGI(python)等協議
? 模塊化(非DSO),如zip,SSL模塊
7、Nginx架構
uweb服務相關的功能:
虛擬主機(server)
支持 keep-alive 和管道連接
訪問日志(支持基于日志緩沖提高其性能)
url rewirte
路徑別名
基于IP及用戶的訪問控制
支持速率限制及并發數限制
重新配置和在線升級而無須中斷客戶的工作進程
Memcached 的 GET 接口
nginx的程序架構:
master/worker結構
?一個master進程:
負載加載和分析配置文件、管理worker進程、平滑升級
?一個或多個worker進程
處理并響應用戶請求
?緩存相關的進程:
cache loader:載入緩存對象
cache manager:管理緩存對象
unginx高度模塊化,但其模塊早期不支持DSO機制;1.9.11版本支持動態裝載和
卸載
u模塊分類:
?核心模塊:core module
?標準模塊:
- HTTP 模塊: ngx_http_*
HTTP Core modules 默認功能
HTTP Optional modules 需編譯時指定
- Mail 模塊 ngx_mail_*
- Stream 模塊 ngx_stream_*
?第三方模塊
8、nginx的功用
靜態的web資源服務器
html,圖片,js,css,txt等靜態資源
u結合FastCGI/uWSGI/SCGI等協議反向代理動態資源請求
uhttp/https協議的反向代理
uimap4/pop3協議的反向代理
utcp/udp協議的請求轉發(反向代理)
curl www.jd.com -I ?查看一個網站的web服務器。
9、安裝nginx
1)yum install epel-release -y ?安裝epel源。 ?centos7上面
2)yum install nginx
3)systemctl start nginx ?(查看80端口是否是nginx占用的)
4)systemctl stop firewalld 關閉防火墻
5)curl-ip地址就可以訪問主頁,瀏覽器上也可以訪問。
6)cd /etc/nginxvim nginx.conf相關配置文件。
7)使用:
mkdir /app/website{1,2,3} -pv ?創建三個網站
寫入文件:echo www.a.com > /app/website1/index.html
cd /etc/nginx/conf.d編輯vim vhost.conf
文件,創建以下內容:
server {
listen 80;
server_name www.a.com;
root /app/website1/;
}
server {
listen 80;
server_name www.b.com;
root /app/website2/;
}
server {
listen 80;
server_name www.c.com;
root /app/website3/;
}
生效以下服務:
systemctl restart nginx
Ping www.a.com網站和curl?網站。
利用另外一臺虛擬主機訪問網站:
改變主機的vim /etc/hosts文件,增加要訪問的網址ip和網站名詞。
反向代理服務器實現:
課件文檔:官方:
http://nginx.org/packages/centos/7/x86_64/RPMS
u Fedora-EPEL:
https://mirrors.aliyun.com/epel/7/x86_64/
u 編譯安裝:
- yum install pcre-devel openssl-devel zlib-devel
- useradd -r nginx
- ./configure –prefix=/usr/local/nginx –conf-path=/etc/nginx/nginx.conf –error-logpath=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pidpath=/var/run/nginx.pid –lock-path=/var/run/nginx.lock –user=nginx –group=nginx
–with-http_ssl_module –with-http_v2_module –with-http_dav_module –withhttp_stub_status_module –with-threads –with-file-aio
- make && make install
u編譯安裝nginx選項:
? –prefix=/etc/nginx 安裝路徑
? –sbin-path=/usr/sbin/nginx 指明nginx程序文件安裝路徑
? –conf-path=/etc/nginx/nginx.conf 主配置文件安裝位置
? –error-log-path=/var/log/nginx/error.log 錯誤日志文件安裝位置
? –http-log-path=/var/log/nginx/access.log 訪問日志文件安裝位置
? –pid-path=/var/run/nginx.pid 指明pid文件安裝位置
? –lock-path=/var/run/nginx.lock 鎖文件安裝位置
? –http-client-body-temp-path=/var/cache/nginx/client_temp 客戶端body部分的臨時文
件存放路徑,如果服務器允許客戶端使用put方法提交大數據時,臨時存放的磁盤路
徑
–http-proxy-temp-path=/var/cache/nginx/proxy_temp 作為代理服務器,服務器響應
報文的臨時文件存放路徑
? –http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 作為fastcgi代理服務器,服務
器響應報文的臨時文件存放路徑
? –http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 作為uwsgi代理服務器,服務器
響應報文的臨時文件存放路徑
? –http-scgi-temp-path=/var/cache/nginx/scgi_temp 作為scgi反代服務器,服務器響應
報文的臨時文件存放路徑
? –user=nginx 指明以那個身份運行worker進程,主控master進程一般由root運行
? –group=nginx
? –with-http_ssl_module 表示把指定模塊編譯進來
u ls /usr/local/nginx/
html是測試頁,sbin是主程序
u ls /usr/local/nginx/sbin/
nginx 只有一個程序文件
u ls /usr/local/nginx/html/
50x.html index.html 測試網頁
u Nginx:默認為啟動nginx
-h 查看幫助選項
-V 查看版本和配置選項
-t 測試nginx語法錯誤
-c filename 指定配置文件(default: /etc/nginx/nginx.conf)
-s signal 發送信號給master進程,signal可為:stop, quit, reopen, reload 示例:-s
stop 停止nginx -s reload 加載配置文件
-g directives 在命令行中指明全局指令
分為master進程和worker進程。
制作虛擬主機網站
4、反向代理http協議
調度的集合
Weight=number權重
設置down,只是先更新一部分。
Ip-hash:客戶端的ip地址做hash計算。源地址。
五、高可用性集群keepalived
1、集群cluster
集群類型:
Lb lvs/nginx(http/upstream,stream/upstream)。
HA的高可用性
Spof:single point of failure
Hpc
系統可用性的公式: A=MTB/(MTBF+MTTR)
(0,1),95%
幾個9指標:99%,99.999%,99.9999%:
系統故障:
硬件故障:設計缺陷,wear out(損耗)、自然災害
軟件故障:設計缺陷
2、集群cluster
u提升系統高用性的解決方案之降低MTTR:
手段:冗余redundant
active/passive 主備
active/active雙主
active –> HEARTBEAT –> passive
active <–> HEARTBEAT <–> active
u高可用的是“服務”:
HA nginx service:
vip/nginx process[/shared storage]
資源:組成一個高可用服務的“組件”
(1) passive node的數量
(2) 資源切換
shared storage:
NAS:文件共享服務器;
SAN:存儲區域網絡,塊級別的共享
uNetwork partition:網絡分區
quorum:法定人數
with quorum: > total/2
without quorum: <= total/2
隔離設備: fence
node:STONITH = Shooting The Other Node In The Head,斷
電重啟
資源:斷開存儲的連接
TWO nodes Cluster
輔助設備:ping node, quorum disk
uFailover:故障切換,即某資源的主節點故障時,將資源轉移至其它節點的操作
uFailback:故障移回,即某資源的主節點故障后重新修改上線后,將之前已轉移
至其它節點的資源重新切回的過程
uHA Cluster實現方案:
ais:應用接口規范 完備復雜的HA集群
RHCS:Red Hat Cluster Suite紅帽集群套件
heartbeat
corosync
vrrp協議實現:虛擬路由冗余協議
Keepalived
3、keepalived
vrrp協議:Virtual Router Redundancy Protocol
u術語:
虛擬路由器:Virtual Router
虛擬路由器標識:VRID(0-255),唯一標識虛擬路由器
物理路由器:
master:主設備
backup:備用設備
priority:優先級
VIP:Virtual IP
VMAC:Virutal MAC (00-00-5e-00-01-VRID)
u通告:心跳,優先級等;周期性
u工作方式:搶占式,非搶占式
u安全工作:
認證:
無認證
- 簡單字符認證:預共享密鑰Ssh-keygen生產公鑰私鑰。
MD5
u工作模式:
主/備:單虛擬路徑器
主/主:主/備(虛擬路徑器1),備/主(虛擬路徑器2)
ukeepalived:
vrrp協議的軟件實現,原生設計目的為了高可用ipvs服務
u功能:
?vrrp協議完成地址流動
?為vip地址所在的節點生成ipvs規則(在配置文件中預先定義)
?為ipvs集群的各RS做健康狀態檢測
?基于腳本調用接口通過執行腳本完成腳本中定義的功能,進而影響集群事務,
以此支持nginx、haproxy等服務
u組件:
? 核心組件:
vrrp stack
ipvs wrapper
checkers
? 控制組件:配置文件分析器
? IO復用器
? 內存管理組件
Keepalived組成:
Keepalived實現:
uHA Cluster 配置準備:
? (1) 各節點時間必須同步
ntp, chrony
? (2) 確保iptables及selinux不會成為阻礙
? (3) 各節點之間可通過主機名互相通信(對KA并非必須)
建議使用/etc/hosts文件實現
? (4) 各節點之間的root用戶可以基于密鑰認證的ssh服務完成互相通信(對KA并
非必須)
keepalived安裝配置:
CentOS 6.4+ Base源
u程序環境:
?主配置文件:/etc/keepalived/keepalived.conf
?主程序文件:/usr/sbin/keepalived
?Unit File:/usr/lib/systemd/system/keepalived.service
?Unit File的環境配置文件:/etc/sysconfig/keepalived
配置文件組件部分:
uTOP HIERACHY
GLOBAL CONFIGURATION
Global definitions
Static routes/addresses
VRRPD CONFIGURATION
VRRP synchronization group(s):vrrp同步組
VRRP instance(s):即一個vrrp虛擬 路由器
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s):ipvs集群的vs和rs
配置語法:
u 配置虛擬路由器:
vrrp_instance <STRING> {
….
}
u 專用參數:
state MASTER|BACKUP:當前節點在此虛擬路由器上的初始狀態;只能有一個是
MASTER,余下的都應該為BACKUP
interface IFACE_NAME:綁定為當前虛擬路由器使用的物理接口
virtual_router_id VRID:當前虛擬路由器惟一標識,范圍是0-255
priority 100:當前物理節點在此虛擬路由器中的優先級;范圍1-254
advert_int 1:vrrp通告的時間間隔,默認1s
authentication { #認證機制auth_type AH|PASSauth_pass <PASSWORD> 僅前8位有效}virtual_ipaddress { #虛擬IP<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label
<LABEL>192.168.200.17/24 dev eth1192.168.200.18/24 dev eth2 label eth2:1}track_interface { #配置監控網絡接口,一旦出現故障,則轉為FAULT狀態實現地址轉移eth0eth1
unopreempt:定義工作模式為非搶占模式
upreempt_delay 300:搶占式模式,節點上線后觸發新選舉操作的延遲時長,
默認模式
u定義通知腳本:
notify_master <STRING>|<QUOTED-STRING>:
當前節點成為主節點時觸發的腳本
notify_backup <STRING>|<QUOTED-STRING>:
當前節點轉為備節點時觸發的腳本
notify_fault <STRING>|<QUOTED-STRING>:
當前節點轉為“失敗”狀態時觸發的腳本
notify <STRING>|<QUOTED-STRING>:
通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知
4、單主配置詳細信息
u單主配置示例:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1 #主機名,在另一結點為node2
vrrp_mcast_group4 224.0.100.100
}
vrrp_instance VI_1 {
state MASTER #在另一個結點上為BACKUP
interface eth0virtual_router_id 6 #多個節點必須相同
priority 100 #在另一個結點上為90
advert_int 1 ?#通告間隔1s
authentication {
auth_type PASS #預共享密鑰認證
auth_pass 571f97b2}
virtual_ipaddress {
172.18.100.66/16 dev eth0 label eth0:0
}
track_interface {
eth0
}
}
5、雙主配置信息
雙主模型示例:
! Configuration File for keepalived
Global_defs{
notification_emai{
root@localho
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.100
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 6
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
172.16.0.10/16 dev eth0
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 8
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 578f07b2
}
virtual_ipaddress {
172.16.0.11/16 dev eth0
}
}
腳本:
#!/bin/bash
#
contact=’root@localhost’
notify() {
mailsubject=”$(hostname) to be $1, vip floating”
mailbody=”$(date +’%F %T’): vrrp transition, $(hostname) changed to be $1″
echo “$mailbody” | mail -s “$mailsubject” $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo “Usage: $(basename $0) {master|backup|fault}”
exit 1
;;
esac
腳本調用方法:
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh faul
常用參數:
u delay_loop <INT>:檢查后端服務器的時間間隔
u lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定義調度方法
u lb_kind NAT|DR|TUN:集群的類型
u persistence_timeout <INT>:持久連接時長
u protocol TCP:服務協議,僅支持TCP
u sorry_server <IPADDR> <PORT>:所有RS故障時,備用服務器地址
u real_server <IPADDR> <PORT>
{
weight <INT> RS權重
notify_up <STRING>|<QUOTED-STRING> RS上線通知腳本
notify_down <STRING>|<QUOTED-STRING> RS下線通知腳本
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHEC K { … }:定義當前主
機的健康狀態檢測方法
}
6、Keepalived配置檢測
u HTTP_GET|SSL_GET:應用層檢測
HTTP_GET|SSL_GET {
url {
path <URL_PATH>:定義要監控的URL
status_code <INT>:判斷上述檢測機制為健康狀態的響應碼
digest <STRING>:判斷為健康狀態的響應的內容的校驗碼
}
connect_timeout <INTEGER>:連接請求的超時時長
nb_get_retry <INT>:重試次數
delay_before_retry <INT>:重試之前的延遲時長
connect_ip <IP ADDRESS>:向當前RS哪個IP地址發起健康狀態檢測請求
connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址
bind_port <PORT>:發出健康狀態檢測請求時使用的源端口
}
u TCP_CHECK {
connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測
請求
connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址
bind_port <PORT>:發出健康狀態檢測請求時使用的源端口
connect_timeout <INTEGER>:連接請求的超時時長
}
7、單主模型ipvs實例
u高可用的ipvs集群示例:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.10
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 6
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
172.16.0.10/16 dev eth0
}
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
}
virtual_server 172.16.0.10 80 {
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
real_server 172.16.0.11 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.16.0.12 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
8、雙主模型的lvs集群
雙主模式的lvs集群,拓撲、實現過程;
配置示例(一個節點):
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.100
}
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 6
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass f1bf7fde
}
virtual_ipaddress {
172.16.0.80/16 dev eth0 label eth0:0
}
track_interface {
eth0
}
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 8
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass f2bf7ade
}
virtual_ipaddress {
172.16.0.90/16 dev eth0 label eth0:1
}
track_interface {
eth0
}
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
}
virtual_server fwmark 3 {
delay_loop 2
lb_algo rr
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
sorry_server 127.0.0.1 80
real_server 172.16.0.11 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.0.12 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 3
}
}
}
9、keepalived調用腳本進行資源監控
u keepalived調用外部的輔助腳本進行資源監控,并根據監控的結果狀態能實現優先動態調整
u vrrp_script:自定義資源監控腳本,vrrp實例根據腳本返回值,公共定義,可被多個實例調用,
定義在vrrp實例之外
u track_script:調用vrrp_script定義的腳本去監控資源,定義在實例之內,調用事先定義的
vrrp_script
u 分兩步:(1) 先定義一個腳本;(2) 調用此腳本
vrrp_script <SCRIPT_NAME> {
script “”
interval INT
weight -INT
}
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.10
}
vrrp_script chk_down {
script “[[ -f /etc/keepalived/down ]] && exit 1 || exit 0”
interval 1
weight -20
}
vrrp_script chk_nginx {
script “killall -0 nginx && exit 0 || exit 1”
interval 1
weight -20
fall 2 #2次檢測失敗為失敗
rise 1 #1次檢測成功為成功
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
172.18.0.93/16 dev eth0
}
track_script {
chk_down
chk_nginx
}
notify_master “/etc/keepalived/
notify.sh master”notify_backup “/etc/keepalived/
notify.sh backup”notify_fault “/etc/keepalived/notify.sh fault
}
10、同步組
u LVS NAT模型VIP和DIP需要同步,需要同步組
u vrrp_sync_group VG_1 {
group {
VI_1 # name of vrrp_instance (below)
VI_2 # One for each moveable IP.
}
}
vrrp_instance VI_1 {
eth0
vip
}
vrrp_instance VI_2 {
eth1
dip
}
雙主模型,解決高可用問題。
帶有lvs的功能。
兩個虛擬路由器,每個里面都有worker和master。
Keepalived支持ipvs:配置虛擬主機。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/100807