基于lvs實現(xiàn)4層負載均衡

Linux Virtual Server Linux虛擬服務器

章文嵩:研發(fā)伍派,原就職alibaba公司,目前就職滴滴屈张;

l4(layer 4):四層路由或四層交換
根據(jù)請求報文的目標IP和目標PORT擒权,將其進行調度轉發(fā)至后端的某RS;根據(jù)調度算法來挑選RS阁谆;

ipvsadm/ipvs類似于iptables/netfilter
iptables/netfilter
iptables:是用戶空間的命令行工具碳抄;
netfilter:是內核空間框架;

流入:PREROUTING --> INPUT
轉發(fā):PREROUTING --> FORWARD --> POSTROUTING
流出:OUTPUT --> POSTROUTING

DNAT:目標地址轉換场绿; PREROUTING剖效;
SNAT:源地址轉換;POSTROUTING;

lvs:2部分組成
ipvsadm:用戶空間的命令行工具璧尸;用于管理集群服務及集群服務上的RS咒林;
ipvs:是內核中的框架;工作于內核上的netfilter的INPUT鉤子上的程序爷光,可根據(jù)用戶定義的集群實現(xiàn)請求轉發(fā)垫竞;

注意:在lvs主機上,不允許在INPUT鏈上添加規(guī)則蛀序,一般不建議與ipvs一同使用filter規(guī)則欢瞪;更不能使用nat規(guī)則,任何鏈接追蹤功能都不能開啟徐裸,鏈接會話表就限制了會話能力遣鼓,否則,并發(fā)響應能力將大大受到限制重贺;

支持基于TCP UDP SCTP AH EST AH_EST等協(xié)議及端口進行調度骑祟;

lvs集群的專用術語:

vs:Virtual Server虛擬服務器,Director調度器气笙,Dispatcher分發(fā)器曾我,Balancer均衡器
rs:Real Server 后端主機

CIP:Client IP 客戶端IP地址;
VIP:Virtual Server IP 面向客戶端服務的IP地址健民,不是固定配置在主機上抒巢,需要在兩個節(jié)點間流動,因為當前主機掛了秉犹,備用主機替換上蛉谜,一般配置在網(wǎng)卡別名上,作為輔助地址存在崇堵;
DIP:Director IP 調度器的IP,用于與后端服務器通信的IP地址鸳劳;
RIP:Real Server IP 后端主機IP地址狰贯;一般不止一個;

lvs集群的4類工作模式

以下部分內容摘自于:http://www.reibang.com/p/5184c6564ee2

lvs-nat

多目標的DNAT赏廓;通過將請求報文中的目標地址和目標端口修改為挑選出的某RS的RIP和PORT實現(xiàn)轉發(fā)涵紊;

ipvs工作在INPUT鏈上,所以只有在INPUT鏈上才能判斷出集群服務幔摸,然后才能向后轉發(fā)摸柄,轉發(fā)時,基于某種調度算法既忆,ipvs自動從后端主機中挑選出一個來響應用戶請求驱负,挑選出的主機IP會成為報文目標IP的修改對象嗦玖;
定義負載均衡集群服務時,要定義集群服務跃脊,集群服務的真實主機宇挫;

nat應用場景邏輯圖

上圖為lvs-nat的常見的使用場景,其工作流程如下:
1酪术、客戶端的請求發(fā)往Director 的VIP捞稿。
2、Director發(fā)到客戶端請求報文后拼缝,將報文中的目標Ip修改為集群中的選定的RIP,目標端口80也修改成8080彰亥,然后將請求報文發(fā)往RS咧七。
3、當RS收到請求報文后任斋,在檢查報文的目標IP為自己的RIP后继阻,會接受報文并進行處理響應。響應的源Ip為RIP废酷,目標IP為CIP瘟檩,端口不變。
4澈蟆、Director收到RS的響應報文墨辛,修改響應報文的源IP為VIP,端口為80趴俘,然后轉發(fā)給客戶端睹簇。
5、客戶端接受響應報文寥闪,其源IP為VIP太惠,端口為80,整個過程對于客戶端來說是透明無感知的疲憋。

特點

(1)RIP和DIP必須在同一IP網(wǎng)絡凿渊,且應該使用私有地址;RS的網(wǎng)關必須指向DIP(保證響應報文必須經(jīng)由VS)缚柳;
(2)請求報文和響應報文都經(jīng)由Director轉發(fā)埃脏,較高負載下,Director易于成為系統(tǒng)性能瓶頸秋忙;
(3)支持端口映射剂癌;后端真實主機盡量為同一端口;
(4)VS必須是Linux翰绊,RS可以是任意OS(操作系統(tǒng))佩谷;

lvs-dr

Director Routing 直接路由旁壮,默認lvs工作類型

通過修改請求報文的MAC地址,重新封裝一個MAC首部進行轉發(fā)谐檀;源MAC是DIP所在接口的MAC地址抡谐,目標MAC是挑選出的某RS的RIP所在接口的MAC地址;IP首部不會發(fā)生變化(依然是CIP<-->VIP)

lvs服務主機與后端服務器主機接在同一交換機上桐猬,且每個后端主機都配有vip麦撵,為了避免地址沖突,把各后端主機配置的vip進行隔離溃肪;

隔離的方法有3種

  • 可使用arptables命令免胃,專門控制進行arp廣播隔離;
  • Linux內核較新版本中惫撰,提供了一個精巧的開關羔沙,也能夠實現(xiàn)隔離;
  • 在前端lvs服務器上游的路由器上綁定lvs的MAC地址與vip地址厨钻;此方法扼雏,較為不便,一般路由器由運營商負責夯膀,且lvs服務器主機會有兩個诗充,所以綁定MAC后,當一臺壞了時诱建,另一臺則不能通過路由器與外界通信蝴蜓;
特點

(1)確保前端路由器將目標IP為VIP的請求報文轉發(fā)往Director;

解決方案:3種
1.在路由器上靜態(tài)綁定VIP和Dieretor的MAC地址俺猿;
禁止RS響應VIP的ARP請求励翼,禁止RS的VIP進行通告;
2.arptables
3.修改RS的內核參數(shù)辜荠,并把VIP綁定lo的別名上汽抚;
arp_ignore,arp_announce

(2)RS的RIP可以使用私有地址伯病,也可以使用公網(wǎng)地址造烁;
(3)RS跟Director必須在同一物理網(wǎng)絡(基于MAC地址轉發(fā));RS的網(wǎng)關必須不能指向DIP午笛;
(4)請求報文必須由Directory調度惭蟋,但響應報文必須不能經(jīng)由Director;
(5)不支持端口映射药磺;
(6)RS可以使用大多數(shù)的OS告组;一般都為Linux系統(tǒng);

lvs-dr應用場景

上圖為lvs-dr的常見的使用場景,其工作流程如下:
1癌佩、客戶端的請求會發(fā)往Director木缝,此時便锨,客戶端請求報文的源Ip為CIP,目標Ip為Director的VIP我碟。
2放案、當Director接受到客戶端的請求報文后,Director會在請求報文外封裝一個MAC首部矫俺,其源MAC為Director接口的MAC地址吱殉,目標MAC為選定RS的MAC地址;
3厘托、當RS收到Director轉發(fā)過來的請求報文后友雳,檢查發(fā)現(xiàn)請求報文的目標Ip為本地環(huán)回接口上配置的VIP,因此會接受報文進行響應處理铅匹。另外由于對ARP響應規(guī)則做了修改押赊,因此RS不會把響應報文響應給director ,而是響應給GW伊群;
4、客戶端接收響應報文沐兰,完成通信。

lvs-tun

tunnel蚌铜,lvs隧道模型
轉發(fā)方式:不修改請求報文的IP首部(源IP為CIP耳璧,目標IP為VIP)昆汹,而是源IP首部之外再封裝一個IP首部(源IP為DIP捅彻,目標IP為挑選出的RS的RIP)幼驶;ip報文上承載ip報文;

請求報文源IP為cip莹汤,目標IP為vip抹竹,到達lvs服務進入INPUT鏈上,在整個ip報文外又加了一層ip首部止潮,即IP報文傳輸IP報文所以叫IP隧道窃判,此時外層源IP為dip,目標IP為某一個被挑選出來遠端的rip沽翔,遠端的服務主機收到報文經(jīng)過不斷拆包后兢孝,將響應報文發(fā)給客戶端窿凤,構建響應報文的源IP為rip仅偎,目標IP為cip;

特點

(1)RIP雳殊,DIP橘沥,VIP全得是公網(wǎng)地址;
(2)RS網(wǎng)關不能指向也不可能指向DIP夯秃;
(3)請求報文經(jīng)由Director轉發(fā)座咆,但響應報文將直接發(fā)往CIP;
(4)不支持端口映射仓洼;
(5)RS的OS必須支持隧道功能介陶;

lvs-tun應用邏輯圖

lvs-fullnat

不是lvs的標準模型;淘寶研發(fā)色建;
通過同時修改請求報文的源IP地址(CIP-->DIP)和目標IP地址(VIP-->RIP)進行轉發(fā)哺呜;
其實,是nat模型是一種轉換箕戳;lvs服務器可通過路由器連接后端服務器某残,即后端服務器可在遠端国撵;

特點:

(1)VIP是公網(wǎng)地址,RIP和DIP一般是私網(wǎng)地址玻墅,且通常不再同一網(wǎng)絡中介牙,但需要經(jīng)由路由器互通;
(2)RS收到的請求報文源IP為DIP澳厢,因此響應報文將直接響應給DIP环础;
(3)請求和響應報文都經(jīng)由Director;
(4)支持端口映射赏酥;
(5)RS可以使用大多數(shù)的OS喳整;

負載均衡集群中會話保持的方式
(1)原地址哈希;
(2)會話集群裸扶;
(3)會話服務器框都;

fullnat應用場景邏輯圖

如上圖所示:
1.客戶端的請求會發(fā)往Director,此時呵晨,客戶端請求報文的源IP為CIP魏保,目標IP為Director的VIP
2.當Director收到客戶端的請求報文時,會將源IP修改為本機的DIP摸屠,同時將請求報文中的目標IP修改為后端某個RS的RIP谓罗,具體為哪個RS的RIP,取決于LVS使用的具體算法
3.當RS收到對應的請求報文時季二,會發(fā)現(xiàn)報文的目標IP就是自己的RIP檩咱,于是就會接收報文并處理后進行響應。響應報文的源IP則為RIP胯舷,目標IP則為DIP
4.當Director收到對應的響應報文時刻蚯,Director會將響應報文的源IP修改為VIP,目標IP修改為CIP桑嘶,于是響應報文被發(fā)往客戶端炊汹。
5.客戶端則會收到響應報文,源IP為VIP逃顶,端口為80讨便,而LVS相對于客戶端而言,轉換過程是透明的以政。

lvs scheduler(lvs調度方法)

根據(jù)其調度時是否考慮后端主機的當前負載霸褒,可分為靜態(tài)方法動態(tài)方法兩類

靜態(tài)調度方法

僅根據(jù)算法本身進行調度

  • RR:Round Robin,輪詢/輪調/輪叫盈蛮;
    調度器通過輪叫調度算法將外部請求按順序輪流分配到集群中的真實服務器上废菱,它均等地對待每一臺服務器,而不管服務器上實際的連接數(shù)和系統(tǒng)負載;

  • WRR:Weighted RR昙啄,加權輪詢穆役,基于權重的方式;
    調度器通過加權輪叫調度算法梳凛,根據(jù)真實服務器的不同處理能力來調度訪問請求耿币;這樣可以保證處理能力強的服務器處理更多的訪問流量;調度器可以自動詢問真實服務器的負載情況韧拒,并動態(tài)地調整其權值淹接;

  • SH:Source Hashing,源地址哈希叛溢;
    功能:保存會話時才用到塑悼;
    來自于同一IP地址的請求,始終發(fā)往同一個真實服務器楷掉,從而實現(xiàn)會話保持的功能厢蒜,根據(jù)原地址挑選真實服務器;把原地址與挑選真實服務器綁定起來烹植;

基于客戶端瘦cookie+服務器端的session機制斑鸦,在負載均衡時,同一用戶被調度不同后端服務器時草雕,為了保持會話連接功能不丟失巷屿;當?shù)谝淮斡脩粽埱髸r,通過調度機制給該用戶分配了一個負責響應后端服務器墩虹,以后來自該用戶的請求就由這個服務器負責響應了嘱巾,而不再調度,這就叫源地址哈希诫钓;

在調度器上有會話追蹤表旬昭,在這個會話追蹤模板中,把用戶的IP地址和挑選的后端服務器對應的記錄下來尖坤,而且定義一個超時時長稳懒,在定義的時間內該條目不會刪除;所以,用戶請求到來時奕短,先檢查這個表间唉,把原IP當做k查找,因為哈希就是k/v數(shù)據(jù)之宿,對應的v就是后端的真實服務器;如果檢查有用戶的IP對應的記錄,則直接將請求報文發(fā)給記錄中對應的后端真實服務器驰唬,而不通過調度;

缺陷:當記錄的真實服務器掛了時,就沒有會話保持記錄了叫编;當內網(wǎng)用戶同過同一IP地址訪問外網(wǎng)時辖佣,可能會把內網(wǎng)用戶的所有請求都發(fā)往會話記錄表上的真實服務器,這樣負載均衡能力是受到損害的搓逾;

解決辦法

方法一:
可在更高層級實現(xiàn)卷谈,基于cookie做綁定,但是cookie是應用層數(shù)據(jù)霞篡,所以lvs在內核世蔗,不能通過lvs實現(xiàn);但朗兵,htpd污淋,nginx可實現(xiàn);
方法二:
要想通過lvs解決余掖,可以把幾個lvs服務器做一個session集群寸爆,是實現(xiàn)會話同步的集群,每一個節(jié)點創(chuàng)建會話后盐欺,通過網(wǎng)絡協(xié)議而昨,會立即同步到其它節(jié)點,這樣找田,每一臺節(jié)點上保存的都是全局的所有會話歌憨,任何一臺節(jié)點掛了,用戶請求被重新調度時會話不會丟失墩衙;如果有30臺服務器务嫡,每一臺服務器都要同步所有服務器上的session會話信息,會給服務器帶來很大壓力漆改,所以此種方法僅適用于小規(guī)模的真實主機集群的場景心铃;后面講tomcat時,演示session集群挫剑;
方法三:
可用一個session服務器做共享存儲去扣,一般在后端當存儲的節(jié)點為專用的k/v數(shù)據(jù)存儲樊破;例如memche,radis筛婉;

  • DH:Destination Hashing,目標地址哈希闹究;
    保存的是目標地址忙迁,通常用在正向web代理(有緩存功能)动漾,負載均衡內網(wǎng)用戶對外部服務器的請求丁屎;
    哈希的是目標地址荠锭;

內網(wǎng)用戶請求的目標地址旱眯,在調度器上把目標地址綁定到一個代理緩存服務器上,以后,任何用戶訪問的是該目標地址就發(fā)往綁定的代理服務器删豺,代理服務器收到請求后共虑,再發(fā)往后端服務器主機,從而實現(xiàn)正向代理負載均衡的作用呀页;

動態(tài)調度方法

根據(jù)算法及各RS當前的負載狀態(tài)進行調度妈拌;Overhead=
計算各RS當前的負載狀態(tài),通過Overhead值表示蓬蝶;

  • LC:least connections尘分,最少連接;
    Overhead=Active數(shù)量*256+Inactive
    通過最少路徑調度算法動態(tài)地將網(wǎng)絡請求調度到已經(jīng)建立的鏈接數(shù)最少的服務器上丸氛;如果集群系統(tǒng)的真實服務器具有相近的系統(tǒng)性能培愁,采用最小鏈接調度算法可以較好的均衡負載;

  • WLC:Weight LC缓窜,加權的最少連接定续;是通用方法,即考慮了算法又考慮了服務器負載禾锤,默認的調度方法私股;
    Overhead=(Active數(shù)*256+Inactive)/weight
    在集群系統(tǒng)中的服務器性能差異較大的情況下,調度器采用加權最少鏈接調度算法優(yōu)化負載均衡性能恩掷,具有較高權值的服務器將承受較大比例的活動連接負載倡鲸;調度器可以自動詢問真實服務器的負載情況,并動態(tài)地調整其權值黄娘;
    缺陷:如果權值最小的服務器排在第一行旦签,每次會響應客戶端請求,這樣對權值大的服務器利用率就不是很高寸宏;

  • SED:Shortes Expections Delay
    Overhead=(Active+1)*256/weight
    彌補了WLC的缺點宁炫;但又出現(xiàn)了缺點:權值最小的服務器,在其它權值較大服務器負載較大時才工作氮凝;放棄了非活動鏈接的考量羔巢;

  • NQ:Never Queue 從不排隊
    是SED的改進,彌補了SED的缺點罩阵;請求到來后竿秆,會按權值大小,都會分配每個服務器來響應客戶端請求稿壁;放棄了非活動鏈接的考量幽钢;

  • LBLC:Locality-Based LC
    基于本地的LC,其實就是動態(tài)的DH算法傅是,考慮了服務器的負載匪燕;損失了命中率蕾羊,提高了均衡性;
    針對目標IP地址的負載均衡帽驯,目前主要用于cache集群系統(tǒng)龟再;該算法根據(jù)請求的目標IP地址找出該目標IP地址最近使用的服務器,若改服務器是可用的且沒有超載尼变,將請求發(fā)送到該服務器利凑;若服務器不存在,或者該服務器超載且有服務器處于一半的工作負載嫌术,則用最少鏈接的原則選出一個可用的服務器哀澈,將請求發(fā)送到該服務器;

  • LBLCR:LBLC with Replication
    帶復制的LBLC度气;
    也是針對目標IP地址的負載均衡日丹,目前主要用于cache集群系統(tǒng);它與LBLC算法的不同之處是它要維護從一個目標IP地址到一組服務器的映射蚯嫌,而LBLC算法維護從一個目標IP地址到一臺服務器的映射哲虾;該算法根據(jù)請求的目標IP地址找出該目標IP地址對應的服務器組,按最小鏈接原則從服務器組中選出一臺服務器择示,若服務器沒有超載束凑,將請求發(fā)往該服務器,若服務器超載栅盲,則按最小鏈接原則從這個集群中選出一臺服務器汪诉,將該服務器加入到服務器組中,將請求發(fā)往該服務器谈秫;同時扒寄,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除拟烫,以降低復制的程度该编;

ipvs實現(xiàn)

  • ipvs:工作在內核中的協(xié)議棧上實現(xiàn)
  • ipvsadm:工作在用戶空間的集群服務器管理工具

ipvs工作模式:就是在filter的input鏈上附加了一段代碼,就稱為ipvs功能硕淑;類似于鉤子一樣课竣,能夠根據(jù)定義的集群規(guī)則,監(jiān)控任何一個送往input鏈上的請求報文置媳,且請求報文中所請求的目標地址和端口被定義成了集群服務于樟,則會根據(jù)調度方法和集群類型,強行修改報文的流程到postrouting拇囊;一般定義lvs集群時迂曲,一定要跟filter分隔,不能同iptables一塊使用寥袭,尤其不能跟filter表一起使用路捧;
因為ipvs在內核中工作的特性关霸,解脫了套接字文件數(shù)量和套接字自身數(shù)量的限制,使得ipvs在優(yōu)化得當?shù)膱鼍爸锌戴蕹ぃ撦d能力可達數(shù)百個谒拴;

ipvs功能特別強大尝江,一般網(wǎng)站用到的可能性比較小涉波,但面試必會問到;
如果負載不是特別大炭序,使用配置比較麻煩啤覆,維護成本較大;

ipvs/ipvsadm的關系相當于netfilter/iptables的關系惭聂;
真正提供lvs服務的是ipvs窗声;

根據(jù)目標ip和目標端口進行轉發(fā);
一個ipvs(Director)主機可以同時定義多個cluster service辜纲;
一個ipvs服務至少應該有一個rs笨觅;

因為是根據(jù)請求的目標ip地址和目標端口(能識別協(xié)議)進行轉發(fā);一個ipvs(Director)主機就可同時為多個集群提供服務進行調度耕腾;這就是四層交換的原因见剩;只不過一個Director很有可能成為負載均衡的瓶頸;

注意:單個Director可同時為多個集群提供調度服務扫俺;

在centos 7系統(tǒng)上:
判斷內核是否支持ipvs:

[root@VM_0_2_centos ~]# grep -i "IPVS" /boot/config-3.10.0-327.el7.x86_64 
顯示:
CONFIG_NETFILTER_XT_MATCH_IPVS=m 支持模塊化
# IPVS transport protocol load balancing support
# IPVS scheduler
# IPVS SH scheduler
# IPVS application helper

[root@VM_0_2_centos ~]# uname -r
3.10.0-514.26.2.el7.x86_64
[root@VM_0_2_centos ~]# grep -A 10 -i "IPVS" /boot/config-3.10.0-327.el7.x86_64 (內核的配置文件)
顯示部分內容:
# IPVS transport protocol load balancing support 支持的四層協(xié)議
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y

# IPVS scheduler 支持的調度方法
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m

# IPVS SH scheduler 
#
CONFIG_IP_VS_SH_TAB_BITS=8 原地址哈希

判斷ipvsadm程序包是否安裝

[root@VM_0_2_centos ~]# yum -y install ipvsadm
[root@VM_0_2_centos ~]# rpm -ql ipvsadm
/etc/sysconfig/ipvsadm-config
/usr/lib/systemd/system/ipvsadm.service
/usr/sbin/ipvsadm
/usr/sbin/ipvsadm-restore
/usr/sbin/ipvsadm-save
/usr/share/doc/ipvsadm-1.27
/usr/share/doc/ipvsadm-1.27/README
/usr/share/man/man8/ipvsadm-restore.8.gz
/usr/share/man/man8/ipvsadm-save.8.gz
/usr/share/man/man8/ipvsadm.8.gz

ipvsadm命令

管理集群服務

ipvsadm -A|E -t|u|f service-address [-s scheduler]
-A:增苍苞,添加
-E:修改

ipvsadm -D -t|u|f service-address
-D:刪除集群服務;

service-address:定義集群服務的地址
-t:tcp狼纬,把tcp端口定義成集群服務羹呵,vip:tcp_port;
-u:udp疗琉,把udp端口定義成集群服務冈欢,vip:udp_port;
-f:Firewalls mark防火墻標記盈简,是一個數(shù)字涛癌;

-s scheduler:定義集群服務的調度方法,默認為wlc加權最少連接送火;

管理集群上的RS

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-a:增拳话,添加RS;
-e:改种吸,修改RS弃衍;

ipvsadm -d -t|u|f service-address
-d:刪除

-r server-address:向已存在的service-address(集群服務)添加RS的地址;
rip[:port] 端口省略時坚俗,表示不做端口映射镜盯,與請求服務的端口為同一端口岸裙;有些集群服務不支持端口映射,如lvs-dr速缆,lvs-tun降允,只要響應報文不經(jīng)過Director都不支持;

-g,gateway,dr:指明集群類型為lvs-dr艺糜;默認類型剧董;
-i,ipip,tun:指明集群類型為lvs-tun;
-m,masquerad,nat(地址偽裝):指明集群類型為lvs-nat破停;
-w weight:指明權重翅楼,對不支持權重的調度算法沒用;用在wrr真慢,wrc毅臊,sed調度算法;

查看:ipvsadm -L|l [options]
-L黑界,--list:列出集群服務管嬉;
-n, --numeric:數(shù)字格式顯示,不反解主機名到ip地址朗鸠,服務到端口號蚯撩;
--exact:精確顯示數(shù)值,不進行單位換算童社;
-c, --connection:顯示當前ipvs連接求厕;可查看后端服務器是否連接;
--stats:統(tǒng)計數(shù)據(jù)扰楼;
--rate:速率呀癣;

清空:clear
ipvsadm -C

保存和重載
保存:輸出重定向
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

清空計數(shù)器:
ipvsadm -Z [-t|u|f service-address]

負載均衡集群設計時要注意的問題:
(1) 是否需要會話保持;
(2) 是否需要共享存儲弦赖;

例如:

#查看ipvs服務项栏,以數(shù)值格式顯示
[root@VM_0_2_centos ~]# ipvsadm -Ln 
IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

Port顯示協(xié)議,只有三種:tcp蹬竖、udp沼沈、firewalls mark
Scheduler表示調度方法;
RemoteAddress:Port 表示RS(真實服務器)地址币厕;不同集群服務列另,一般RS不同;
Forward 表示轉發(fā)方法旦装;
Weight 表示權重值页衙;
ActiveConn 活動連接數(shù);
InActConn 非活動連接數(shù);

例如:

添加集群服務店乐,vip為172.18.11.111提供web服務艰躺,指明調度方法為rr;不指明為默認wlc眨八;

[root@VM_0_2_centos ~]# ipvsadm -A -t 172.18.11.111:80 -s rr 
[root@VM_0_2_centos ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.11.111:80 rr

在集群服務中添加RS地址為192.168.255.2腺兴,類型為lvs-nat,權重為1此值無意義廉侧,因為前面已經(jīng)指明使用rr調度算法

[root@VM_0_2_centos ~]# ipvsadm -a -t 172.18.11.111:80 -r 192.168.255.2 -m -w 1
[root@VM_0_2_centos ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.11.111:80 rr
  -> 192.168.255.2:80             Masq    1      0          0 

[root@VM_0_2_centos ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  172.18.11.111:80                    0        0        0        0        0
  -> 192.168.255.2:80                    0        0        0        0        0

其中:
CPS:connect per second页响,表示每秒鐘的連接數(shù);
InPPS:input packets per second伏穆,每秒的入棧報文數(shù)拘泞;
OutPPS:out packets per second纷纫,每秒的出棧報文數(shù)枕扫;
InBPS:input bytes per second,每秒的入棧字節(jié)數(shù)辱魁;
OutBPS:output bytes per second烟瞧,每秒的出棧字節(jié)數(shù);

[root@VM_0_2_centos ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  172.18.11.111:80                    0        0        0        0        0
  -> 192.168.255.2:80                    0        0        0        0        0

其中:
Conns:表示總的連接數(shù)量染簇;
InPkts:入棧報文數(shù)参滴;
OutPkts:出棧報文數(shù);
InBytes:入棧字節(jié)數(shù)锻弓;
OutBytes:出棧字節(jié)數(shù)砾赔;

再次添加一個RS

[root@VM_0_2_centos ~]# ipvsadm -a -t 172.18.11.111:80 -r 192.168.255.3 -m -w 3
[root@VM_0_2_centos ~]# ipvsadm -Ln
顯示內容:
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.11.111:80 rr
  -> 192.168.255.2:80             Masq    1      0          0         
  -> 192.168.255.3:80             Masq    3      0          0

再次添加一個集群服務

[root@VM_0_2_centos ~]# ipvsadm -A -t 172.18.11.111:3306 -s wlc
[root@VM_0_2_centos ~]# ipvsadm -Ln
顯示內容:
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.11.111:80 rr
  -> 192.168.255.2:80             Masq    1      0          0         
  -> 192.168.255.3:80             Masq    3      0          0         
TCP  172.18.11.111:3306 wlc

在另一個集群服務上添加2個RS

[root@VM_0_2_centos ~]# ipvsadm -a -t 172.18.11.111:3306 -r 192.168.255.4 -m -w 1
[root@VM_0_2_centos ~]# ipvsadm -a -t 172.18.11.111:3306 -r 192.168.255.5 -m -w 2
[root@VM_0_2_centos ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.11.111:80 rr
  -> 192.168.255.2:80             Masq    1      0          0         
  -> 192.168.255.3:80             Masq    3      0          0         
TCP  172.18.11.111:3306 wlc
  -> 192.168.255.4:3306           Masq    1      0          0         
  -> 192.168.255.5:3306           Masq    2      0          0 

修改集群服務的調度方法為wrr

[root@VM_0_2_centos ~]# ipvsadm -E -t 172.18.11.111:80 -s wrr
[root@VM_0_2_centos ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.11.111:80 wrr
  -> 192.168.255.2:80             Masq    1      0          0         
  -> 192.168.255.3:80             Masq    3      0          0         
TCP  172.18.11.111:3306 wlc
  -> 192.168.255.4:3306           Masq    1      0          0         
  -> 192.168.255.5:3306           Masq    2      0          0

注意:修改只能改屬性,不能改IP地址青灼;只有刪除集群服務才能從新改IP地址暴心;

修改RS的權重值為10

[root@VM_0_2_centos ~]# ipvsadm -e -t 172.18.11.111:80 -r 192.168.255.2 -m -w 10
[root@VM_0_2_centos ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.11.111:80 wrr
  -> 192.168.255.2:80             Masq    10     0          0         
  -> 192.168.255.3:80             Masq    3      0          0         
TCP  172.18.11.111:3306 wlc
  -> 192.168.255.4:3306           Masq    1      0          0         
  -> 192.168.255.5:3306           Masq    2      0          0

保存集群服務規(guī)則至指定路徑

[root@VM_0_2_centos ~]# ipvsadm -S > /tmp/ipvsadm-config.v1

查看保存的內容:

[root@VM_0_2_centos ~]# cat /tmp/ipvsadm-config.v1
-A -t localhost.localdomain:http -s wrr
-a -t localhost.localdomain:http -r 192.168.255.2:http -m -w 10
-a -t localhost.localdomain:http -r 192.168.255.3:http -m -w 3
-A -t localhost.localdomain:mysql -s wlc
-a -t localhost.localdomain:mysql -r 192.168.255.4:mysql -m -w 1
-a -t localhost.localdomain:mysql -r 192.168.255.5:mysql -m -w 2

清空集群服務

[root@VM_0_2_centos ~]# ipvsadm -C

重載集群服務配置文件

[root@VM_0_2_centos ~]# ipvsadm -R < /tmp/ipvsadm-config.v1

想要知道陌生的命令使用方法:
對于centos 7,要查看該命令的Unit file杂拨;
對于centos 6专普,要查看該命令的service腳本;

[root@VM_0_2_centos ~]# cat /usr/lib/systemd/system/ipvsadm.service 
顯示部分內容:
[Service]
Type=oneshot
ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm"
ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm"
ExecStop=/sbin/ipvsadm -C
RemainAfterExit=yes

其中:
ExecStart=表示啟動時弹沽,會從/etc/sysconfig/ipvsadm集群配置文件重載檀夹;
ExecStop=表示停止時,會保存集群配置文件至/etc/sysconfig/ipvsadm文件中嗎策橘,然后再清空當前集群服務炸渡;

下次開機時會自動載入集群服務規(guī)則:
所以,可把規(guī)則保存在/etc/sysconfig/ipvsadm文件中丽已;
[root@VM_0_2_centos ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
一般手動保存后(確保保存無誤)蚌堵,下次開機時,會自動重載此文件促脉;

需要開機自動有效:
[root@VM_0_2_centos ~]# systemctl enable ipvsadm.service

搭建lvs-nat

RS1:192.168.10.11辰斋,網(wǎng)關指向192.168.10.254
RS2:192.168.10.12策州,網(wǎng)關指向192.168.10.254

lvs-nat設計要點:
(1)DIP與RIP要在同一IP網(wǎng)絡,RIP的網(wǎng)關要指向DIP宫仗;
(2)支持端口映射够挂;
(3)是否用到共享存儲,取決于業(yè)務需要藕夫;

1孽糖、配置RS1

#在RS1上安裝httpd服務
[root@rs1 ~]# yum install -y httpd mod_ssl  
#設置指定的RIP
[root@rs1 ~]# ifconfig ens33 192.168.10.11/24 up  
#指定網(wǎng)關地址為DIP
[root@rs1 ~]# route add default gw 192.168.10.254  
[root@rs1 ~]# vim /var/www/html/index.html
<h1>RS1-192.168.10.11</h1>
[root@rs1 ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080
[root@rs1 ~]# systemclt start httpd.service
#查看80端口是否打開
[root@rs1 ~]# ss -tnl  
#編輯iptables放開8080端
[root@rs1 ~]# iptables -I INPUT -d 192.168.10.11 -p tcp --dport 8080 -j ACCEPT
[root@rs1 ~]# iptables -I OUTPUT -s 192.168.10.11 -p tcp --sport 8080 -j ACCEPT  口

2、配置RS2

#在RS1上安裝httpd服務
[root@rs2 ~]# yum install -y httpd mod_ssl  
#設置指定的RIP
[root@rs2 ~]# ifconfig ens33 192.168.10.12/24 up  
#指定網(wǎng)關地址為DIP
[root@rs2 ~]# route add default gw 192.168.10.254  
[root@rs2 ~]# vim /var/www/html/index.html
<h1>RS1-192.168.10.12</h1>
[root@rs1 ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080
[root@rs2 ~]# systemclt start httpd.service
#查看80端口是否打開
[root@rs2 ~]# ss -tnl  
#編輯iptables放開8080端
[root@rs2 ~]# iptables -I INPUT -d 192.168.10.12 -p tcp --dport 8080 -j ACCEPT
[root@rs2 ~]# iptables -I OUTPUT -s 192.168.10.12 -p tcp --sport 8080 -j ACCEPT  口

3毅贮、配置Director

#安裝ipvsadm工具
[root@director ~]# yum install -y ipvsadm
...
已安裝:
  ipvsadm.x86_64 0:1.27-7.el7                                                                                                                            

完畢办悟!

Director:192.168.10.254
VIP:172.18.11.121

[root@director ~]# ifconfig eno16777736:0 172.18.11.121/24  up
[root@director ~]# ifconfig eno33554984 192.168.10.254/24 up
[root@director ~]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.0.2  netmask 255.255.255.0  broadcast 172.16.0.255
        inet6 fe80::20c:29ff:fe21:59b9  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:21:59:b9  txqueuelen 1000  (Ethernet)
        RX packets 6433  bytes 8332396 (7.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1544  bytes 144496 (141.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eno16777736:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.11.121  netmask 255.255.255.0  broadcast 172.18.11.255
        ether 00:0c:29:21:59:b9  txqueuelen 1000  (Ethernet)

eno33554984: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.10.10.254  netmask 255.255.255.0  broadcast 10.10.10.255
        inet6 fe80::20c:29ff:fe21:59c3  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:21:59:c3  txqueuelen 1000  (Ethernet)
        RX packets 104  bytes 8225 (8.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 68  bytes 8642 (8.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

打開網(wǎng)卡核心轉發(fā)功能;永久有效:

[root@director ~]# sysctl -w net.ipv4.ip_forward=1
[root@director ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

查看內核參數(shù)是否打開核心轉發(fā)功能

[root@VM_0_2_centos ~]# cat /proc/sys/net/ipv4/ip_forward

此時滩褥,在Director測試病蛉,訪問RS1、RS2瑰煎;

[root@rs1 ~]# curl http://192.168.10.11
<h1>RS1-192.168.10.11</h1>

[root@rs ~]# curl http://192.168.10.12
<h1>RS2-192.168.10.12</h1>

添加ipvs集群:

[root@director ~]# ipvsadm -A -t 172.18.11.121:80 -s rr
#指定lvs虛擬服務對應的Real server
[root@director ~]# ipvsadm -a -t 172.18.11.121:80 -r 192.168.10.11:8080 -m
[root@director ~]# ipvsadm -a -t 172.18.11.121:80 -r 192.168.10.12:8080 -m
[root@director ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.11.121:80 rr
  -> 192.168.10.11:8080             Masq    1      0          0         
  -> 192.168.10.12:8080             Masq    1      0          0    

在另一臺虛擬機上測試铺然,調度是否起作用:
測試主機為:172.18.11.111

[root@localhost ~]# for i in {1..20}; do curl http://172.18.11.111;done
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
[root@director ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.11.111:80 rr
#因為使用的調度算法為rr輪詢,因此兩個RS負載的連接數(shù)接近一比一
  -> 192.168.10.11:8080             Masq    1      0          10        
  -> 192.168.10.12:8080             Masq    1      0          11     

修改Director上的調度方式為wrr

[root@director ~]# ipvsadm -E -t 172.18.11.121 -s wrr
[root@director ~]# ipvsadm -e -t 192.168.0.99:80 -r 10.10.10.11:8080 -m -w 5
[root@director ~]# ipvsadm -e -t 192.168.0.99:80 -r 10.10.10.12:8080 -m -w 10
[root@director ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.11.111:80 wrr
  -> 192.168.10.11:8080             Masq    5      0          0         
  -> 192.168.10.12:8080             Masq    10     0          0      

再到測試主機為:172.18.11.111酒甸,測試wrr的調度效果

[root@localhost ~]# for i in {1..15}; do curl http://192.168.0.99;done
<h1>RS2-192.168.10.12</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS2-192.168.10.12</h1>
<h1>RS1-192.168.10.11</h1>
#負載訪問的比例為1:2

經(jīng)過多次請求測試后魄健,有明顯wrr調度效果;
其RS服務器響應權重比是1:2插勤,即RS1響應1次后RS響應2次沽瘦;

數(shù)據(jù)同步:rsync+inotify

  • rsync:遠程同步,能夠將兩臺主機上的兩個文件系統(tǒng)农尖,彼此間做同步析恋;有主從之分,同步是單向的卤橄,主服務器有支持讀绿满、寫操作,從服務器只能讀操作窟扑,要從主服務器上拉取完成同步喇颁;類似于dns中的主從區(qū)域復制;

  • inotify機制:是內核的機制嚎货;在從服務器拉取主服務器數(shù)據(jù)時橘霎,可能剛來取完,主服務器就變化了殖属,這樣不能準時獲得同步姐叁;inotify機制就要解決此問題,當主服務器有變化時,主動通知從服務器外潜;
    一主一從原环,或一主兩從,再多就無法使用处窥;

搭建lvs-dr

響應報文不用經(jīng)過Director嘱吗,每個RS必須配置VIP,為了避免地址沖突滔驾,有3種方式:

  • 第一谒麦,在路由器上做靜態(tài)綁定Director上的MAC與Director上的VIP,各RS還有添加arptables拒絕網(wǎng)絡通告哆致;
  • 第二绕德,在RS上僅適用arptables解決;
  • 第三摊阀,修改內核參數(shù)解決耻蛇,完成阻斷通告和響應;

每個主機只需一塊網(wǎng)卡即可驹溃,各主機都在同一物理網(wǎng)絡中城丧;確保請求報文能到達Director延曙,Director收到報文后挑選出一臺RS負責響應豌鹤,在Director上把報文重新封裝MAC,把報文轉發(fā)給該RS赵抢;
在各RS上讯榕,先隔離arp通告姆钉,再添加入棧路由即到達VIP必須經(jīng)lo:0這樣的別名(VIP地址配置在的別名接口)接口上,這樣出棧時灵临,源IP才能被改成VIP;
請求報文經(jīng)過過Director趴荸,響應報文不經(jīng)過Director儒溉,各RS的網(wǎng)關不能指向DIP;端口映射不能實現(xiàn)发钝;
如果VIP和RIP不在同一網(wǎng)段顿涣;如何確保響應報文能出去;

在各主機(Director酝豪,RS)均需要配置VIP涛碑,因此,要解決地址的沖突的問題孵淘,目標是讓各RS上的VIP不可見蒲障,僅用接收目標地址為VIP的報文,同時可作為響應報文的源地址;
(1)在前端的網(wǎng)關接口上靜態(tài)綁定(vip+mac)揉阎;
缺陷:一旦Director掛了庄撮,基于高可用轉移另外節(jié)點上無法實現(xiàn);而且毙籽,要在網(wǎng)關上有權限操作重窟;
(2)在各RS上使用arptables;添加規(guī)則惧财,拒絕自己的VIP地址向外通告及響應arp解析地址的請求巡扇;
(3)在各RS上修改內核參數(shù),來限制arp響應和通告垮衷;
注意:要將VIP配置在lo的別名上厅翔,不能配置在網(wǎng)卡的別名上;

限制響應級別:arp_ignore
0:默認值搀突,使用本地任意接口上配置的地址進行響應刀闷;回應任何網(wǎng)絡接口上對任何本地IP地址的arp查詢請求
1:僅在請求的目標IP配置在本地主機的接收報文的接口上時,才給予響應仰迁;只回答目標IP地址是來訪網(wǎng)絡接口本地地址的ARP查詢請求甸昏;
2:只回答目標IP地址是來訪網(wǎng)絡接口本地地址的ARP查詢請求,且來訪IP必須在該網(wǎng)絡接口的子網(wǎng)段內;
3:不回應該網(wǎng)絡界面的arp請求徐许,而只對設置的唯一和連接地址做出回應施蜜;
4-7:預留;
8:不回應所有(本地地址)的arp查詢雌隅;

限制通告級別:arp_announce
0:默認值翻默,把本機所有接口信息向每個接口通告;
1:盡量避免向非本網(wǎng)絡通告恰起;
2:總是避免向非本網(wǎng)絡通告修械;

在各RS上設置arp通告級別即修改兩個內核參數(shù)arp_ignore检盼、arp_announce肯污,因為地址是屬于內核的,所以在Linux主機默認的通告方式是所有本機的可用IP地址通告給每個接口;

arp_announce要限制通告級別斟薇,每一個網(wǎng)卡僅在把自己的網(wǎng)絡地址向所在物理網(wǎng)絡中通告师坎,即各網(wǎng)卡間地址絕不交叉通告;arp_announce設置為2堪滨;

arp_ignore是限制響應別人arp請求的級別胯陋;默認響應請求是無論從哪個接口接收到arp請求,只要本機有這個地址都會響應袱箱;限制arp響應級別后可實現(xiàn)遏乔,從哪個網(wǎng)卡接收的arp請求,
必須與該接口屬于同一網(wǎng)絡時才響應发笔;arp_ignore`設置為1

lvs-dr設計要點:
(1)各主機一個接口即可盟萨,但需要在同一物理網(wǎng)絡中;
(2)RIP的網(wǎng)關不能指向DIP了讨,RIP和DIP通常應在同一網(wǎng)絡捻激,但此二者未必會與VIP在同一網(wǎng)絡;
(3)各RS需要先設置內核參數(shù)前计,再設置VIP和路由胞谭;

搭建網(wǎng)絡環(huán)境

Director:
VIP:172.18.11.7
DIP:172.18.11.121

RS1:
VIP:172.18.11.7
RIP:172.18.11.8

RS2:
VIP:172.18.11.7
RIP:172.18.11.9

1、配置Director

[root@director ~]# ifconfig eno16777736:0 172.18.11.7 netmask 255.255.255.255 broadcast 172.18.11.7
[root@director ~]# ipvsadm -A -t 172.18.11.7:80 -s rr
[root@director ~]# ipvsadm -a -t 172.18.11.7:80 -r 172.18.11.8:80 -g
[root@director ~]# ipvsadm -a -t 172.18.11.7:80 -r 172.18.11.9:80 -g
[root@director~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.18.11.7:80 rr
  -> 172.18.11.8:80              Route   1      0          0         
  -> 172.18.11.9:80              Route   1      0          0         
[root@director ~]# systemctl stop firewalld

2男杈、配置RS1

[root@rs1 ~]# yum install -y httpd mod_ssl
#在本地環(huán)回接口上配置VIP并指定路由
[root@rs1 ~]# ifconfig lo:0 172.18.11.7 netmask 255.255.255.255 broadcast 172.18.11.7
[root@rs1 ~]# route add 172.18.11.7 dev lo:0
#修改內核參數(shù)丈屹,限制ARP響應
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs1 ~]# vim /var/www/html/index.html
<h1>RS1-172.18.11.8</h1>
[root@rs1 ~]# systemctl start httpd
[root@rs1 ~]# systemctl stop firewalld

3、配置RS2

[root@rs2 ~]# yum install -y httpd mod_ssl
#在本地環(huán)回接口上配置VIP并指定路由
[root@rs2 ~]# ifconfig lo:0 172.18.11.7 netmask 255.255.255.255 broadcast 172.18.11.7
[root@rs2 ~]# route add 172.18.11.7 dev lo:0
#修改內核參數(shù)势就,限制ARP響應
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rs2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs2 ~]# vim /var/www/html/index.html
<h1>RS2-172.18.11.9</h1>
[root@rs2 ~]# systemctl start httpd
[root@rs2 ~]# systemctl stop firewalld

4侧巨、訪問測試

[root@localhost ~]# for i in {1..10};do curl http://172.18.11.7;done
<h1>RS1-172.18.11.8</h1>
<h1>RS1-172.18.11.9</h1>
<h1>RS1-172.18.11.8</h1>
<h1>RS1-172.18.11.9</h1>
<h1>RS1-172.18.11.8</h1>
<h1>RS1-172.18.11.9</h1>
<h1>RS1-172.18.11.8</h1>
<h1>RS1-172.18.11.9</h1>
<h1>RS1-172.18.11.8</h1>
<h1>RS1-172.18.11.9</h1>
lvs-dr集群的配置腳本
#RS
[root@director ~]# vim skp.sh
#!/bin/bash
#
vip=172.18.11.7
mask='255.255.255.255'

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 lo:0 172.18.11.7 netmask $mask broadcast $vip up
     route add -host $vip dev lo:0
;;
stop)
     ifconfig lo:0 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_iannounce
     ifconfig lo:0 0
     ;;
*)
    echo "Usage $(basename $0) start|stop"
    exit 1
    ;; 
esac
[root@rs1 ~]# chmod +x skp.sh
[root@rs1 ~]# ./skp.sh start
[root@rs1 ~]# cat /proc/sys/net/ipv4/conf/all/arp_ignore
1
[root@rs1 ~]# cat /proc/sys/net/ipv4/conf/all/arp_announce
2
[root@rs1 ~]# scp skp.sh root@172.18.11.9:/root

在RS2主機運行

[root@rs2 ~]# ./skp.sh start
#!/bin/bash
#
vip='172.18.11.7'
iface='eno16777736:0'
mask='255.255.255.255'
port='80'
rs1='172.18.11.8'
rs2='172.18.11.9'
scheduler='rr'
type='-g'

case $1 in
start)
    ifconfig $iface $vip netmask $mask broadcast $vip up
    iptables -F
    
    ipvsadm -A -t ${vip}:${port} -s $scheduler
    ipvsadm -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    

fwm:FireWall Mark

lvs處理報文(圖片來自于網(wǎng)絡)

在netfilter上給報文打標記鳍烁;在mangle表上實現(xiàn);mangle表可以應用在5個鏈上;

在報文進入時,進行打標記,例如目標IP是VIP端口80,把這類報文分揀出來打標,標記一般為十六進制整數(shù),例如標記1;在input鏈上定義集群服務時,就可判定如果防火墻標記為1,則為集群服務;把本來在input鏈上完成識別、定義集群服務分成了兩步,識別在prerouting做,定義在ipvs(inputing)上實現(xiàn);

打標使用iptables實現(xiàn)

在mangle表上的prerouting鏈上,目標ip(VIP)為172.18.11.7赋焕,目標端口為80臭挽,打標記為1;

[root@VM_0_2_centos ~]# iptables -t mangle -A PREROUTING -d 172.18.11.7 -p tcp --dport 80 -j MARK --set-mark 1

mark標記里包含了IP地址和端口照筑;定義集群服務時使用mark即可;

[root@VM_0_2_centos ~]# ipvsadm -A -f 1 -s rr  定義mark標記為1的報文為集群服務晨逝,調度算法為rr支鸡;
[root@VM_0_2_centos ~]# ipvsadm -a -f 1 -r 172.18.11.8 -g -w 1  添加RS到mark標記為1的集群服務中寺晌,集群類型為lvs-dr陆赋,權重為1;
]# ipvsadm -a -f 1 -r 172.18.11.9 -g -w 1

防火墻標記好處:可以把2個服務打成一個標記;就可把2個服務當做一個集群來調度阵子;

打標記的方法:
iptables -t mangle -A PREROUTING -d $vip -p $protocol --dport $clusterserverport -j MARK --set-mark #
#:代表十六進制整數(shù)思杯;

打標作用:提供輔助持久連接功能;在多個端口定義服務時挠进,可把相關作為一個集群來調度色乾;

FWM示例

配置RS1:

[root@rs1 ~]# yum install -y nginx
[root@rs1 ~]# vim /etc/nginx/conf.d/https.conf
server {
        listen 443 ssl;
        ssl on;
        ssl_certificate /etc/nginx/nginx.crt;
        ssl_certificate_key /etc/nginx/nginx.key;

        ssl_session_timeout 5m;
}

[root@rs1 ~]# vim /usr/share/nginx/html/nginx.htm
<h1>This is RS1 172.18.11.8</h1> 

配置RS2:

[root@rs2 ~]# yum install -y nginx
[root@rs2 ~]# vim /etc/nginx/conf.d/https.conf
server {
        listen 443 ssl;
        ssl on;
        ssl_certificate /etc/nginx/nginx.crt;
        ssl_certificate_key /etc/nginx/nginx.key;

        ssl_session_timeout 5m;
}

[root@rs2 ~]# vim /usr/share/nginx/html/nginx.htm
<h1>This is RS1 172.18.11.9</h1> 

在Director創(chuàng)建CA:

[root@director ~]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
[root@director ~]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:MageEdu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:ca.magedu.com
Email Address []:為空

[root@VM_0_2_centos ~]# touch index.txt
[root@VM_0_2_centos ~]# echo 01 > serial

在RS1主機:

[root@rs1~]# cd /etc/httpd
[root@rs1 ~]# mkdir ssl
[root@rs1 ~]# cd ssl
# 創(chuàng)建私鑰及生成簽證請求
[root@rs1 ~]# (umask 077;openssl genrsa -out httpd.key 1024)
[root@rs1 ~]# openssl req -new -key httpd.key -out httpd.csr
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:MageEdu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:www.stu11.com
Email Address []:留空

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:留空
An optional company name []:留空
# 傳給CA簽證
[root@rs1 ~]# scp httpd.csr root@172.18.11.121:/tmp

在CA服務上簽證并傳回給RS1:

[root@director ~]# openssl ca -in /tmp/httpd.csr -out /tmp/http.crt -days 365
[root@director ~]# cd /tmp
[root@director ~]# scp http.crt root@172.18.11.8:/etc/httpd/ssl

[root@rs1 ~]# cd /etc/httpd
# 把證書傳另一RS2主機
[root@rs1 ~]# scp -rp ssl/ root@172.18.11.9:/etc/httpd/
[root@director ~]# vim conf.d/ssl.conf 
SSLCertificateFile /etc/httpd/ssl/http.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key

# 把配置好的ssl配置文件再傳給另一RS
[root@director ~]# scp conf.d/ssl.conf root@172.18.11.9:/etc/httpd/conf.d/

在各RS主機重啟web服務并查看443端口是否監(jiān)聽:

[root@rs1 ~]# systemctl restart httpd.service
[root@rs2 ~]# systemctl restart httpd.service

手動測試直接訪問RS的IP:

[root@director ~]# curl -k https://172.18.11.8

測試請求,OK可以響應頁面领突;-k表示可接受不受信任的頁面響應暖璧;

單機測試ok,下面綁定80和443服務君旦,打標記:

[root@director ~]# iptables -t mangle -A PREROUTING -d 172.18.11.7 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10

在Director查看:

[root@director ~]# iptables -t mangle -vnL

有報文進來澎办,表示打標記成功的;

添加集群服務金砍,不加-p不做持久連接局蚀,為輪詢;

[root@director ~]# ipvsadm -A -f 10 -s rr 

在集群服務中添加2個RS

[root@director ~]# ipvsadm -a -f 10 -r 172.18.11.8 -m
[root@director ~]# ipvsadm -a -f 10 -r 172.18.11.9 -m

在客戶端驗證結果:

[root@client ~]# for i in {1..10};do curl http://172.18.11.7/nginx.html;done
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>

[root@client ~]# for i in {1..10};do curl -k  https://172.18.11.7/nginx.html;done
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>

注意:
如何能讓ipvs規(guī)則下次恕稠,開機生效琅绅;

[root@director ~]# ipvsadm-save > /etc/sysconfig/ipvsadm

lvs persistence:持久連接

基于持久連接模板(就上一個哈希表),能實現(xiàn)無論使用任何算法調度鹅巍,都能進行在一段時間內千扶,將來自同一源IP的請求始終發(fā)往同一RS料祠;
可定義持久連接時間、無論使用什么算法都能持久連接澎羞;還可將兩個不同的服務綁在一塊進行調度髓绽;

ipvs的持久類型

  • 每端口持久(PPC):per port connect
    來自于同一源IP的客戶端請求不同的服務,當訪問web的80端口時妆绞,就可綁定顺呕,訪問數(shù)據(jù)庫服務的3306端口時,則會重新進行調度摆碉;只持久單個服務塘匣;
  • 每客戶端持久(PCC):per client conect
    同一個Director調度多個集群服務,多個集群服務由同一組RS提供即一個RS提供80,443,3306等服務巷帝;如果同一客戶端請求忌卤,始終發(fā)往同一的RS響應;對所有服務同時持久楞泼;
  • 每FWM持久:
    只要是防火墻標記是一樣的驰徊,就始終發(fā)往同一RS響應;只持久同一防火墻標記下的連接堕阔;

定義持久連接的方法:ipvsadm -A|E -t|u|f service-address [-s scheduler] -p [timeout]
默認持久連接時間為300秒棍厂;

指定持久連接時長為300秒

[root@director ~]# ipvsadm -E -f 1 -s rr -p 300
[root@director ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  1 rr persistent 300
  -> 172.18.11.8:0                Route   1      0          0         
  -> 172.18.11.9:0                Route   2      0          1

上述每個類型的配置格式如下:

演示每端口持久(PPC)連接
添加80端口為集群服務超陆,使用rr調度算法

[root@director ~]# ipvsadm -A -t 172.18.11.7:80 -s rr -p 

演示每客戶端持久(PCC)連接
添加集群服務牺弹,設置VIP、端口為0表示所有端口时呀,集群調度使用rr算法张漂,開啟持久連接功能;

[root@VM_0_2_centos ~]# ipvsadm -A -t 172.18.11.7:0 -s rr -p 

演示每防火墻標記持久PFWM

[root@director ~]# ipvsadm -A -f 3 -s rr -p

接著我們在上面FWM的實例的director上啟動持久連接測試其對應的效果:
修改director上的ipvs規(guī)則:

[root@director ~]# ipvsadm -E -f 1 -s rr -p 300
[root@director ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  1 rr persistent 300
  -> 172.18.11.8:0                Route   1      0          0         
  -> 172.18.11.9:0                Route   1      0          1     

客戶端訪問測試:

[root@client ~]# for i in {1..10};do curl http://172.18.11.7/nginx.html;done
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>

[root@client ~]# for i in {1..10};do curl -k  https://172.18.11.7/nginx.html;done
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>
<h1>This is RS2 172.18.11.9</h1>
<h1>This is RS1 172.18.11.8</h1>

RS在lvs-dr模型下:
要啟動服務器谨娜、設置內核參數(shù)航攒、配置VIP、添加路由等自動進行趴梢,就編寫RS設置腳本實現(xiàn):

考慮

(1)Director不可用時漠畜,整個系統(tǒng)不可用;單點故障SPOF坞靶;
解決方案:高可用
keepalived
heartbeat/corosync

(2)某RS不可用時憔狞,Director是否扔會向其調度;
解決方案:對各RS的健康狀態(tài)做檢查彰阴,失敗時禁用躯喇,成功時啟用;
keepalived
heartbeat/corosync, ldirectord
檢查方式:
(a)網(wǎng)絡層探測:ping命令
(b)傳輸層探測:nmap命令掃描端口硝枉,端口可用性探測廉丽,TCP_CHECK
(c)應用層探測:HTTP_GET,SSL_GET妻味,SMTP_CHECK

ldirectord

ldirectord用來實現(xiàn)lvs負載均衡資源在主正压、備節(jié)點間的故障轉移。在首次啟動時责球,ldirectord可以自動創(chuàng)建ipvs表焦履。此外,它還可以監(jiān)控各RealServer的運行狀態(tài)雏逾,一旦發(fā)現(xiàn)某RealServer運行異常時嘉裤,還可以將其從ipvs表中移除。

ldirectord進程通過向RS的rip發(fā)送資源訪問請求并通過由RS返回的響應信息來確定RS的運行狀態(tài)栖博。在Director上屑宠,每一個vip需要一個單獨的ldirectord進程。如果RS不能正常響應Director上ldirectord的請求仇让,ldirectord進程將通過ipvsadm命令將此RS從ipvs表中移除典奉。而一旦RS再次上線,ldirectord會將其重新添加至ipvs表中丧叽。

下載https://fedora.pkgs.org/29/fedora-updates-x86_64/ldirectord-4.2.0-1.fc29.x86_64.rpm.html

Director主機上:

[root@director ~]# yum install ldirectord-4.2.0-1.fc29.x86_64.rpm -y
Loaded plugins: fastestmirror, langpacks
Repository epel is listed more than once in the configuration
Examining ldirectord-4.2.0-1.fc29.x86_64.rpm: ldirectord-4.2.0-1.fc29.x86_64
Marking ldirectord-4.2.0-1.fc29.x86_64.rpm to be installed
...
Complete!

[root@director ~]# rpm -ql ldirectord
/etc/ha.d
/etc/ha.d/resource.d
/etc/ha.d/resource.d/ldirectord
/etc/logrotate.d/ldirectord
/usr/lib/ocf/resource.d/heartbeat/ldirectord
/usr/lib/systemd/system/ldirectord.service
/usr/sbin/ldirectord
/usr/share/doc/ldirectord
/usr/share/doc/ldirectord/COPYING
/usr/share/doc/ldirectord/ldirectord.cf
/usr/share/man/man8/ldirectord.8.gz
[root@director ~]# cp /usr/share/doc/ldirectord/ldirectord.cf /etc/ha.d/
[root@director ~]# vim /etc/ha.d/ldirectord.cf
# Global Directives
checktimeout=20                    # ldirectord等待RealServer健康檢查完成的時間卫玖,單位為秒;
checkinterval=5                    # 每次檢查的時間間隔踊淳,即檢查的頻率假瞬;
autoreload=yes                     # 此項用來定義ldirectord是否每隔一段時間檢查此配置文件是否發(fā)生改變并自動重新加載;
logfile="/var/log/ldirectord.log"  # 定義日志文件存放位置迂尝;
quiescent=yes                      # 當某臺RealServer出現(xiàn)異常脱茉,此項可將其設置為靜默狀態(tài)(即其權重為"0")從而不再響應客戶端的訪問請求;

# Sample for an http virtual service
    virtual=192.168.101.168:80         # 此項用來定義LVS服務及其使用的VIP和PORT
    real=10.10.10.11:80 gate 100       # 定義RealServer雹舀,語法:real=RIP:port gate|masq|ipip [weight]
    real=10.10.10.12:80 gate 300
    fallback=127.0.0.1:80 gate         # 當IPVS表沒有任何可用的RealServer時芦劣,此"地址:端口"作為最后響應的服務;
    service=http                       # 定義基于什么服務來測試RealServer说榆;
    scheduler=wlc                      # 調度算法為wlc虚吟;
    #persistent=600                    # 持久連接超時時間;
    #netmask=255.255.255.255
    protocol=tcp                       # 定義此虛擬服務用到的協(xié)議签财;
    checktype=negotiate                # ldirectord進程用于監(jiān)控RealServer的方法串慰;{negotiate|connect|A number|off}
    checkport=80                       # 指健康檢查使用的端口;
    request=".ldirectord.html"         # 檢查RealServer用到的頁面
    receive="Nice"                     # 檢查RealServer用到的頁面內容

[root@director ~]# yum install httpd -y
[root@director ~]# echo "404 Page." > /var/www/html/index.html
[root@director ~]# service httpd start

在RS主機上:
RS1唱蒸、RS2提供".ldirectord.html"檢測頁面

[root@rs1 ~]# echo "Nice" > /var/www/html/.ldirectord.html
[root@rs1 ~]# service httpd stop   #模擬后端RS故障
[root@rs2 ~]# echo "Nice" > /var/www/html/.ldirectord.html
[root@rs2 ~]# service httpd stop   #模擬后端RS故障

Director查看ipvs信息邦鲫,并使用瀏覽器訪問http://172.18.11.7

[root@director ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP 172.18.11.7:80 wlc
  -> 172.18.11.8:80               Route   0      0          12        
  -> 172.18.11.9:80               Route   0      0          101       
  -> 127.0.0.1:80                 Local   1      0          0  
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子庆捺,更是在濱河造成了極大的恐慌古今,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滔以,死亡現(xiàn)場離奇詭異捉腥,居然都是意外死亡,警方通過查閱死者的電腦和手機你画,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門抵碟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坏匪,你說我怎么就攤上這事拟逮。” “怎么了适滓?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵敦迄,是天一觀的道長。 經(jīng)常有香客問我粒竖,道長颅崩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任蕊苗,我火速辦了婚禮沿后,結果婚禮上,老公的妹妹穿的比我還像新娘朽砰。我一直安慰自己尖滚,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布瞧柔。 她就那樣靜靜地躺著漆弄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪造锅。 梳的紋絲不亂的頭發(fā)上撼唾,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音哥蔚,去河邊找鬼倒谷。 笑死,一個胖子當著我的面吹牛糙箍,可吹牛的內容都是我干的渤愁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼深夯,長吁一口氣:“原來是場噩夢啊……” “哼抖格!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤雹拄,失蹤者是張志新(化名)和其女友劉穎收奔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體办桨,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡筹淫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了呢撞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡饰剥,死狀恐怖殊霞,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情汰蓉,我是刑警寧澤绷蹲,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站顾孽,受9級特大地震影響祝钢,放射性物質發(fā)生泄漏。R本人自食惡果不足惜若厚,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一拦英、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧测秸,春花似錦疤估、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沈撞,卻和暖如春慷荔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缠俺。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工显晶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晋修。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓吧碾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親墓卦。 傳聞我的和親對象是個殘疾皇子倦春,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內容