負(fù)載均衡

原文

一漠畜、什么是負(fù)載均衡?

互聯(lián)網(wǎng)早期坞靶,業(yè)務(wù)流量比較小并且業(yè)務(wù)邏輯比較簡單憔狞,單臺服務(wù)器便可以滿足基本的需求翘县;但隨著互聯(lián)網(wǎng)的發(fā)展挠蛉,業(yè)務(wù)流量越來越大并且業(yè)務(wù)邏輯也越來越復(fù)雜,單臺機(jī)器的性能問題以及單點問題凸顯了出來畜号,因此需要多臺機(jī)器來進(jìn)行性能的水平擴(kuò)展以及避免單點故障尿这。但是要如何將不同的用戶的流量分發(fā)到不同的服務(wù)器上面呢簇抵?

早期的方法是使用DNS做負(fù)載,通過給客戶端解析不同的IP地址射众,讓客戶端的流量直接到達(dá)各個服務(wù)器碟摆。但是這種方法有一個很大的缺點就是延時性問題,在做出調(diào)度策略改變以后叨橱,由于DNS各級節(jié)點的緩存并不會及時的在客戶端生效典蜕,而且DNS負(fù)載的調(diào)度策略比較簡單,無法滿足業(yè)務(wù)需求罗洗,因此就出現(xiàn)了負(fù)載均衡愉舔。

客戶端的流量首先會到達(dá)負(fù)載均衡服務(wù)器,由負(fù)載均衡服務(wù)器通過一定的調(diào)度算法將流量分發(fā)到不同的應(yīng)用服務(wù)器上面栖博,同時負(fù)載均衡服務(wù)器也會對應(yīng)用服務(wù)器做周期性的健康檢查屑宠,當(dāng)發(fā)現(xiàn)故障節(jié)點時便動態(tài)的將節(jié)點從應(yīng)用服務(wù)器集群中剔除,以此來保證應(yīng)用的高可用仇让。

負(fù)載均衡又分為四層負(fù)載均衡和七層負(fù)載均衡典奉。四層負(fù)載均衡工作在OSI模型的傳輸層躺翻,主要工作是轉(zhuǎn)發(fā),它在接收到客戶端的流量以后通過修改數(shù)據(jù)包的地址信息將流量轉(zhuǎn)發(fā)到應(yīng)用服務(wù)器卫玖。

七層負(fù)載均衡工作在OSI模型的應(yīng)用層公你,因為它需要解析應(yīng)用層流量,所以七層負(fù)載均衡在接到客戶端的流量以后假瞬,還需要一個完整的TCP/IP協(xié)議棧陕靠。七層負(fù)載均衡會與客戶端建立一條完整的連接并將應(yīng)用層的請求流量解析出來,再按照調(diào)度算法選擇一個應(yīng)用服務(wù)器脱茉,并與應(yīng)用服務(wù)器建立另外一條連接將請求發(fā)送過去剪芥,因此七層負(fù)載均衡的主要工作就是代理。

二琴许、四層和七層負(fù)載均衡的區(qū)別税肪?

2.1 - 技術(shù)原理上的區(qū)別。

所謂四層負(fù)載均衡榜田,也就是主要通過報文中的目標(biāo)地址和端口益兄,再加上負(fù)載均衡設(shè)備設(shè)置的服務(wù)器選擇方式,決定最終選擇的內(nèi)部服務(wù)器箭券。

以常見的TCP為例净捅,負(fù)載均衡設(shè)備在接收到第一個來自客戶端的SYN 請求時,即通過上述方式選擇一個最佳的服務(wù)器辩块,并對報文中目標(biāo)IP地址進(jìn)行修改(改為后端服務(wù)器IP)蛔六,直接轉(zhuǎn)發(fā)給該服務(wù)器。TCP的連接建立庆捺,即三次握手是客戶端和服務(wù)器直接建立的古今,負(fù)載均衡設(shè)備只是起到一個類似路由器的轉(zhuǎn)發(fā)動作。在某些部署情況下滔以,為保證服務(wù)器回包可以正確返回給負(fù)載均衡設(shè)備捉腥,在轉(zhuǎn)發(fā)報文的同時可能還會對報文原來的源地址進(jìn)行修改。

所謂七層負(fù)載均衡你画,也稱為“內(nèi)容交換”抵碟,也就是主要通過報文中的真正有意義的應(yīng)用層內(nèi)容,再加上負(fù)載均衡設(shè)備設(shè)置的服務(wù)器選擇方式坏匪,決定最終選擇的內(nèi)部服務(wù)器拟逮。

以常見的TCP為例,負(fù)載均衡設(shè)備如果要根據(jù)真正的應(yīng)用層內(nèi)容再選擇服務(wù)器适滓,只能先代理最終的服務(wù)器和客戶端建立連接(三次握手)后敦迄,才可能接受到客戶端發(fā)送的真正應(yīng)用層內(nèi)容的報文,然后再根據(jù)該報文中的特定字段,再加上負(fù)載均衡設(shè)備設(shè)置的服務(wù)器選擇方式罚屋,決定最終選擇的內(nèi)部服務(wù)器苦囱。

負(fù)載均衡設(shè)備在這種情況下,更類似于一個代理服務(wù)器脾猛。負(fù)載均衡和前端的客戶端以及后端的服務(wù)器會分別建立TCP連接撕彤。所以從這個技術(shù)原理上來看,七層負(fù)載均衡明顯的對負(fù)載均衡設(shè)備的要求更高猛拴,處理七層的能力也必然會低于四層模式的部署方式羹铅。那么,為什么還需要七層負(fù)載均衡呢愉昆?

2.2 - 應(yīng)用場景的需求职员。

七層應(yīng)用負(fù)載的好處,是使得整個網(wǎng)絡(luò)更"智能化", 參考我們之前的另外一篇專門針對HTTP應(yīng)用的優(yōu)化的介紹撼唾,就可以基本上了解這種方式的優(yōu)勢所在廉邑。例如訪問一個網(wǎng)站的用戶流量,可以通過七層的方式倒谷,將對圖片類的請求轉(zhuǎn)發(fā)到特定的圖片服務(wù)器并可以使用緩存技術(shù);將對文字類的請求可以轉(zhuǎn)發(fā)到特定的文字服務(wù)器并可以使用壓縮技術(shù)糙箍。

當(dāng)然這只是七層應(yīng)用的一個小案例渤愁,從技術(shù)原理上,這種方式可以對客戶端的請求和服務(wù)器的響應(yīng)進(jìn)行任意意義上的修改深夯,極大的提升了應(yīng)用系統(tǒng)在網(wǎng)絡(luò)層的靈活性抖格。很多在后臺,(例如Nginx或者Apache)上部署的功能可以前移到負(fù)載均衡設(shè)備上咕晋,例如客戶請求中的Header重寫雹拄,服務(wù)器響應(yīng)中的關(guān)鍵字過濾或者內(nèi)容插入等功能。

另外一個常常被提到功能就是安全性掌呜。網(wǎng)絡(luò)中最常見的SYN Flood攻擊滓玖,即黑客控制眾多源客戶端,使用虛假IP地址對同一目標(biāo)發(fā)送SYN攻擊质蕉,通常這種攻擊會大量發(fā)送SYN報文势篡,耗盡服務(wù)器上的相關(guān)資源,以達(dá)到Denial of Service(DoS)的目的模暗。

從技術(shù)原理上也可以看出禁悠,四層模式下這些SYN攻擊都會被轉(zhuǎn)發(fā)到后端的服務(wù)器上;而七層模式下這些SYN攻擊自然在負(fù)載均衡設(shè)備上就截止兑宇,不會影響后臺服務(wù)器的正常運(yùn)營碍侦。另外負(fù)載均衡設(shè)備可以在七層層面設(shè)定多種策略,過濾特定報文,例如SQL Injection等應(yīng)用層面的特定攻擊手段瓷产,從應(yīng)用層面進(jìn)一步提高系統(tǒng)整體安全比规。

現(xiàn)在的7層負(fù)載均衡,主要還是著重于應(yīng)用廣泛的HTTP協(xié)議拦英,所以其應(yīng)用范圍主要是眾多的網(wǎng)站或者內(nèi)部信息平臺等基于B/S開發(fā)的系統(tǒng)蜒什。 4層負(fù)載均衡則對應(yīng)其他TCP應(yīng)用,例如基于C/S開發(fā)的ERP等系統(tǒng)疤估。

2.3 - 七層應(yīng)用需要考慮的問題灾常。

是否真的必要,七層應(yīng)用的確可以提高流量智能化铃拇,同時必不可免的帶來設(shè)備配置復(fù)雜钞瀑,負(fù)載均衡壓力增高以及故障排查上的復(fù)雜性等問題。在設(shè)計系統(tǒng)時需要考慮四層七層同時應(yīng)用的混雜情況慷荔。

是否真的可以提高安全性雕什。例如SYN Flood攻擊,七層模式的確將這些流量從服務(wù)器屏蔽显晶,但負(fù)載均衡設(shè)備本身要有強(qiáng)大的抗DDoS能力贷岸,否則即使服務(wù)器正常而作為中樞調(diào)度的負(fù)載均衡設(shè)備故障也會導(dǎo)致整個應(yīng)用的崩潰。

是否有足夠的靈活度磷雇。七層應(yīng)用的優(yōu)勢是可以讓整個應(yīng)用的流量智能化偿警,但是負(fù)載均衡設(shè)備需要提供完善的七層功能,滿足客戶根據(jù)不同情況的基于應(yīng)用的調(diào)度唯笙。最簡單的一個考核就是能否取代后臺Nginx或者Apache等服務(wù)器上的調(diào)度功能螟蒸。能夠提供一個七層應(yīng)用開發(fā)接口的負(fù)載均衡設(shè)備,可以讓客戶根據(jù)需求任意設(shè)定功能崩掘,才真正有可能提供強(qiáng)大的靈活性和智能性七嫌。

三、負(fù)載均衡的算法苞慢?

1诵原、隨機(jī)算法

Random隨機(jī),按權(quán)重設(shè)置隨機(jī)概率枉疼。在一個截面上碰撞的概率高皮假,但調(diào)用量越大分布越均勻,而且按概率使用權(quán)重后也比較均勻骂维,有利于動態(tài)調(diào)整提供者權(quán)重惹资。

2、輪詢及加權(quán)輪詢

輪詢(Round Robbin)當(dāng)服務(wù)器群中各服務(wù)器的處理能力相同時航闺,且每筆業(yè)務(wù)處理量差異不大時褪测,最適合使用這種算法猴誊。 輪循,按公約后的權(quán)重設(shè)置輪循比率侮措。存在慢的提供者累積請求問題懈叹,比如:第二臺機(jī)器很慢,但沒掛分扎,當(dāng)請求調(diào)到第二臺時就卡在那澄成,久而久之,所有請求都卡在調(diào)到第二臺上畏吓。

加權(quán)輪詢(Weighted Round Robbin)為輪詢中的每臺服務(wù)器附加一定權(quán)重的算法墨状。比如服務(wù)器1權(quán)重1,服務(wù)器2權(quán)重2菲饼,服務(wù)器3權(quán)重3肾砂,則順序為1-2-2-3-3-3-1-2-2-3-3-3- ......

3、最小連接及加權(quán)最小連接

最少連接(Least Connections)在多個服務(wù)器中宏悦,與處理連接數(shù)(會話數(shù))最少的服務(wù)器進(jìn)行通信的算法镐确。即使在每臺服務(wù)器處理能力各不相同,每筆業(yè)務(wù)處理量也不相同的情況下饼煞,也能夠在一定程度上降低服務(wù)器的負(fù)載源葫。

加權(quán)最少連接(Weighted Least Connection)為最少連接算法中的每臺服務(wù)器附加權(quán)重的算法,該算法事先為每臺服務(wù)器分配處理連接的數(shù)量派哲,并將客戶端請求轉(zhuǎn)至連接數(shù)最少的服務(wù)器上臼氨。

4、哈希算法

普通哈希

一致性哈希一致性Hash芭届,相同參數(shù)的請求總是發(fā)到同一提供者。當(dāng)某一臺提供者掛時感耙,原本發(fā)往該提供者的請求褂乍,基于虛擬節(jié)點,平攤到其它提供者即硼,不會引起劇烈變動逃片。

5、IP地址散列

通過管理發(fā)送方IP和目的地IP地址的散列只酥,將來自同一發(fā)送方的分組(或發(fā)送至同一目的地的分組)統(tǒng)一轉(zhuǎn)發(fā)到相同服務(wù)器的算法褥实。當(dāng)客戶端有一系列業(yè)務(wù)需要處理而必須和一個服務(wù)器反復(fù)通信時,該算法能夠以流(會話)為單位裂允,保證來自相同客戶端的通信能夠一直在同一服務(wù)器中進(jìn)行處理损离。

6、URL散列

通過管理客戶端請求URL信息的散列绝编,將發(fā)送至相同URL的請求轉(zhuǎn)發(fā)至同一服務(wù)器的算法僻澎。

四貌踏、負(fù)載均衡的實現(xiàn)(DNS > 數(shù)據(jù)鏈路層 > IP層 > Http層)?

1 - DNS域名解析負(fù)載均衡(延遲)

利用DNS處理域名解析請求的同時進(jìn)行負(fù)載均衡是另一種常用的方案窟勃。在DNS服務(wù)器中配置多個A記錄祖乳,如:www.mysite.com IN A 114.100.80.1、www.mysite.com IN A 114.100.80.2秉氧、www.mysite.com IN A 114.100.80.3.

每次域名解析請求都會根據(jù)負(fù)載均衡算法計算一個不同的IP地址返回眷昆,這樣A記錄中配置的多個服務(wù)器就構(gòu)成一個集群,并可以實現(xiàn)負(fù)載均衡汁咏。

DNS域名解析負(fù)載均衡的優(yōu)點是將負(fù)載均衡工作交給DNS亚斋,省略掉了網(wǎng)絡(luò)管理的麻煩,缺點就是DNS可能緩存A記錄梆暖,不受網(wǎng)站控制伞访。事實上,大型網(wǎng)站總是部分使用DNS域名解析轰驳,作為第一級負(fù)載均衡手段厚掷,然后再在內(nèi)部做第二級負(fù)載均衡。

2 - 數(shù)據(jù)鏈路層負(fù)載均衡(LVS)

數(shù)據(jù)鏈路層負(fù)載均衡是指在通信協(xié)議的數(shù)據(jù)鏈路層修改mac地址進(jìn)行負(fù)載均衡级解。

這種數(shù)據(jù)傳輸方式又稱作三角傳輸模式冒黑,負(fù)載均衡數(shù)據(jù)分發(fā)過程中不修改IP地址,只修改目的的mac地址勤哗,通過配置真實物理服務(wù)器集群所有機(jī)器虛擬IP和負(fù)載均衡服務(wù)器IP地址一樣抡爹,從而達(dá)到負(fù)載均衡,這種負(fù)載均衡方式又稱為直接路由方式(DR).

在上圖中芒划,用戶請求到達(dá)負(fù)載均衡服務(wù)器后冬竟,負(fù)載均衡服務(wù)器將請求數(shù)據(jù)的目的mac地址修改為真是WEB服務(wù)器的mac地址,并不修改數(shù)據(jù)包目標(biāo)IP地址民逼,因此數(shù)據(jù)可以正常到達(dá)目標(biāo)WEB服務(wù)器泵殴,該服務(wù)器在處理完數(shù)據(jù)后可以經(jīng)過網(wǎng)管服務(wù)器而不是負(fù)載均衡服務(wù)器直接到達(dá)用戶瀏覽器。

使用三角傳輸模式的鏈路層負(fù)載均衡是目前大型網(wǎng)站所使用的最廣的一種負(fù)載均衡手段拼苍。在linux平臺上最好的鏈路層負(fù)載均衡開源產(chǎn)品是LVS(linux virtual server)笑诅。

3 - IP負(fù)載均衡(SNAT)

IP負(fù)載均衡:即在網(wǎng)絡(luò)層通過修改請求目標(biāo)地址進(jìn)行負(fù)載均衡。

用戶請求數(shù)據(jù)包到達(dá)負(fù)載均衡服務(wù)器后疮鲫,負(fù)載均衡服務(wù)器在操作系統(tǒng)內(nèi)核進(jìn)行獲取網(wǎng)絡(luò)數(shù)據(jù)包吆你,根據(jù)負(fù)載均衡算法計算得到一臺真實的WEB服務(wù)器地址,然后將數(shù)據(jù)包的IP地址修改為真實的WEB服務(wù)器地址俊犯,不需要通過用戶進(jìn)程處理妇多。真實的WEB服務(wù)器處理完畢后,相應(yīng)數(shù)據(jù)包回到負(fù)載均衡服務(wù)器瘫析,負(fù)載均衡服務(wù)器再將數(shù)據(jù)包源地址修改為自身的IP地址發(fā)送給用戶瀏覽器砌梆。

這里的關(guān)鍵在于真實WEB服務(wù)器相應(yīng)數(shù)據(jù)包如何返回給負(fù)載均衡服務(wù)器默责,一種是負(fù)載均衡服務(wù)器在修改目的IP地址的同時修改源地址,將數(shù)據(jù)包源地址改為自身的IP咸包,即源地址轉(zhuǎn)換(SNAT)桃序,另一種方案是將負(fù)載均衡服務(wù)器同時作為真實物理服務(wù)器的網(wǎng)關(guān)服務(wù)器,這樣所有的數(shù)據(jù)都會到達(dá)負(fù)載均衡服務(wù)器烂瘫。

IP負(fù)載均衡在內(nèi)核進(jìn)程完成數(shù)據(jù)分發(fā)媒熊,較反向代理均衡有更好的處理性能。但由于所有請求響應(yīng)的數(shù)據(jù)包都需要經(jīng)過負(fù)載均衡服務(wù)器坟比,因此負(fù)載均衡的網(wǎng)卡帶寬成為系統(tǒng)的瓶頸芦鳍。

4 - HTTP重定向負(fù)載均衡(少見)

HTTP重定向服務(wù)器是一臺普通的應(yīng)用服務(wù)器,其唯一的功能就是根據(jù)用戶的HTTP請求計算一臺真實的服務(wù)器地址葛账,并將真實的服務(wù)器地址寫入HTTP重定向響應(yīng)中(響應(yīng)狀態(tài)嗎302)返回給瀏覽器柠衅,然后瀏覽器再自動請求真實的服務(wù)器。

這種負(fù)載均衡方案的優(yōu)點是比較簡單籍琳,缺點是瀏覽器需要每次請求兩次服務(wù)器才能拿完成一次訪問菲宴,性能較差;使用HTTP302響應(yīng)碼重定向趋急,可能是搜索引擎判斷為SEO作弊喝峦,降低搜索排名。重定向服務(wù)器自身的處理能力有可能成為瓶頸呜达。因此這種方案在實際使用中并不見多谣蠢。

5 - 反向代理負(fù)載均衡(nginx)

傳統(tǒng)代理服務(wù)器位于瀏覽器一端,代理瀏覽器將HTTP請求發(fā)送到互聯(lián)網(wǎng)上查近。而反向代理服務(wù)器則位于網(wǎng)站機(jī)房一側(cè)眉踱,代理網(wǎng)站web服務(wù)器接收http請求。

反向代理的作用是保護(hù)網(wǎng)站安全霜威,所有互聯(lián)網(wǎng)的請求都必須經(jīng)過代理服務(wù)器勋锤,相當(dāng)于在web服務(wù)器和可能的網(wǎng)絡(luò)攻擊之間建立了一個屏障。

除此之外侥祭,代理服務(wù)器也可以配置緩存加速web請求。當(dāng)用戶第一次訪問靜態(tài)內(nèi)容的時候茄厘,靜態(tài)內(nèi)存就被緩存在反向代理服務(wù)器上矮冬,這樣當(dāng)其他用戶訪問該靜態(tài)內(nèi)容時,就可以直接從反向代理服務(wù)器返回次哈,加速web請求響應(yīng)速度胎署,減輕web服務(wù)器負(fù)載壓力。

另外窑滞,反向代理服務(wù)器也可以實現(xiàn)負(fù)載均衡的功能琼牧。

由于反向代理服務(wù)器轉(zhuǎn)發(fā)請求在HTTP協(xié)議層面恢筝,因此也叫應(yīng)用層負(fù)載均衡。優(yōu)點是部署簡單巨坊,缺點是可能成為系統(tǒng)的瓶頸撬槽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趾撵,隨后出現(xiàn)的幾起案子侄柔,更是在濱河造成了極大的恐慌,老刑警劉巖占调,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暂题,死亡現(xiàn)場離奇詭異,居然都是意外死亡究珊,警方通過查閱死者的電腦和手機(jī)薪者,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剿涮,“玉大人言津,你說我怎么就攤上這事♂B玻” “怎么了纺念?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長想括。 經(jīng)常有香客問我陷谱,道長,這世上最難降的妖魔是什么瑟蜈? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任烟逊,我火速辦了婚禮,結(jié)果婚禮上铺根,老公的妹妹穿的比我還像新娘宪躯。我一直安慰自己,他們只是感情好位迂,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布访雪。 她就那樣靜靜地躺著,像睡著了一般掂林。 火紅的嫁衣襯著肌膚如雪臣缀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天泻帮,我揣著相機(jī)與錄音精置,去河邊找鬼。 笑死锣杂,一個胖子當(dāng)著我的面吹牛脂倦,可吹牛的內(nèi)容都是我干的番宁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼赖阻,長吁一口氣:“原來是場噩夢啊……” “哼蝶押!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起政供,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤播聪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后布隔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體离陶,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年衅檀,在試婚紗的時候發(fā)現(xiàn)自己被綠了招刨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡哀军,死狀恐怖沉眶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杉适,我是刑警寧澤谎倔,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站猿推,受9級特大地震影響片习,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹬叭,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一藕咏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秽五,春花似錦孽查、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓣铣,卻和暖如春洲胖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坯沪。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留擒滑,地道東北人腐晾。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓叉弦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親藻糖。 傳聞我的和親對象是個殘疾皇子淹冰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容