Python第十四周網絡知識和數據庫知識總結

高性能集群Linux virtual server、Nginx、高可用性集群keepalived

三、高性能集群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這一特性

 

3IO多路復用模型

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

(0)
604603701@qq.com604603701@qq.com
上一篇 2018-06-10
下一篇 2018-06-10

相關推薦

欧美性久久久久