100億數(shù)據(jù)平滑數(shù)據(jù)遷移,不影響服務(wù)

轉(zhuǎn)載:100億數(shù)據(jù)平滑數(shù)據(jù)遷移,不影響服務(wù)

一、問題的提出

互聯(lián)網(wǎng)有很多“數(shù)據(jù)量較大纤怒,并發(fā)量較大糯而,業(yè)務(wù)復(fù)雜度較高”的業(yè)務(wù)場(chǎng)景,其典型系統(tǒng)分層架構(gòu)如下:

(1)上游是業(yè)務(wù)層biz泊窘,實(shí)現(xiàn)個(gè)性化的業(yè)務(wù)邏輯

(2)中游是服務(wù)層service熄驼,封裝數(shù)據(jù)訪問

(3)下游是數(shù)據(jù)層db像寒,存儲(chǔ)固化的業(yè)務(wù)數(shù)據(jù)

服務(wù)化分層架構(gòu)的好處是,服務(wù)層屏蔽下游數(shù)據(jù)層的復(fù)雜性谜洽,例如緩存萝映、分庫(kù)分表、存儲(chǔ)引擎等存儲(chǔ)細(xì)節(jié)不需要向調(diào)用方暴露阐虚,而只向上游提供方便的RPC訪問接口序臂,當(dāng)有一些數(shù)據(jù)層變化的時(shí)候,所有的調(diào)用方也不需要升級(jí)实束,只需要服務(wù)層升級(jí)即可奥秆。

互聯(lián)網(wǎng)架構(gòu),很多時(shí)候面臨著這樣一些需求:

需求1->底層表結(jié)構(gòu)變更:數(shù)據(jù)量非常大的情況下咸灿,數(shù)據(jù)表增加了一些屬性构订,刪除了一些屬性,修改了一些屬性避矢。

需求2->分庫(kù)個(gè)數(shù)變換:由于數(shù)據(jù)量的持續(xù)增加悼瘾,底層分庫(kù)個(gè)數(shù)非成倍增加。

需求3->底層存儲(chǔ)介質(zhì)變換:底層存儲(chǔ)引擎由一個(gè)數(shù)據(jù)庫(kù)換為另一個(gè)數(shù)據(jù)庫(kù)审胸。

種種需求亥宿,都需要進(jìn)行數(shù)據(jù)遷移,如何平滑遷移數(shù)據(jù)砂沛,遷移過程不停機(jī)烫扼,保證系統(tǒng)持續(xù)服務(wù),是文本將要討論的問題碍庵。

二映企、停機(jī)方案

在討論平滑遷移數(shù)據(jù)方案之前,先看下不平滑的停機(jī)數(shù)據(jù)遷移方案静浴,主要分三個(gè)步驟堰氓。

步驟一一個(gè)類似“為了給廣大用戶提供更好的服務(wù),服務(wù)器會(huì)在凌晨0:00-0:400進(jìn)行停機(jī)維護(hù)”的公告苹享,并在對(duì)應(yīng)時(shí)段進(jìn)行停機(jī)双絮,這個(gè)時(shí)段系統(tǒng)沒有流量進(jìn)入。

步驟二:停機(jī)后富稻,研發(fā)一個(gè)離線的數(shù)據(jù)遷移工具,進(jìn)行數(shù)據(jù)遷移白胀。針對(duì)第一節(jié)的三類需求椭赋,會(huì)分別開發(fā)不同的數(shù)據(jù)遷移工具。

(1)底層表結(jié)構(gòu)變更需求:開發(fā)舊表導(dǎo)新表的工具

(2)分庫(kù)個(gè)數(shù)變換需求:開發(fā)2庫(kù)導(dǎo)3庫(kù)的工具

(3)底層存儲(chǔ)介質(zhì)變換需求:開發(fā)Mongo導(dǎo)Mysql工具

步驟三恢復(fù)服務(wù)或杠,并將流量切到新庫(kù)哪怔,不同的需求,可能會(huì)涉及不同服務(wù)升級(jí)。

(1)底層表結(jié)構(gòu)變更需求:服務(wù)要升級(jí)到訪問新表

(2)分庫(kù)個(gè)數(shù)變換需求:服務(wù)不需要升級(jí)认境,只需要改尋庫(kù)路由配置

(3)底層存儲(chǔ)介質(zhì)變換需求:服務(wù)升級(jí)到訪問新的存儲(chǔ)介質(zhì)

總的來(lái)說胚委,停機(jī)方案是相對(duì)直觀和簡(jiǎn)單的,但對(duì)服務(wù)的可用性有影響叉信,許多游戲公司的服務(wù)器升級(jí)亩冬,游戲分區(qū)與合區(qū),可能會(huì)采用類似的方案硼身。

除了影響服務(wù)的可用性硅急,這個(gè)方案還有一個(gè)缺點(diǎn),就是必須在指定時(shí)間完成升級(jí)佳遂,這個(gè)對(duì)研發(fā)营袜、測(cè)試、運(yùn)維同學(xué)來(lái)說丑罪,壓力會(huì)非常大荚板,一旦出現(xiàn)問題例如數(shù)據(jù)不一致,必須在規(guī)定時(shí)間內(nèi)解決吩屹,否則只能回滾跪另。根據(jù)經(jīng)驗(yàn),人壓力越大越容易出錯(cuò)祟峦,這個(gè)缺點(diǎn)一定程度上是致命的罚斗。

無(wú)論如何,停機(jī)方案并不是今天要討論的重點(diǎn)宅楞,接下來(lái)看一下常見的平滑數(shù)據(jù)遷移方案针姿。

三、平滑遷移-追日志法

平滑遷移方案一厌衙,追日志法距淫,這個(gè)方案主要分為五個(gè)步驟。

數(shù)據(jù)遷移前婶希,上游業(yè)務(wù)應(yīng)用通過舊的服務(wù)訪問舊的數(shù)據(jù)榕暇。

步驟一:服務(wù)進(jìn)行升級(jí),記錄“對(duì)舊庫(kù)上的數(shù)據(jù)修改”的日志(這里的修改喻杈,為數(shù)據(jù)的insert,delete,update)彤枢,這個(gè)日志不需要記錄詳細(xì)數(shù)據(jù),主要記錄:

(1)被修改的庫(kù)

(2)被修改的表

(3)被修改的唯一主鍵

具體新增了什么行筒饰,修改后的數(shù)據(jù)格式是什么缴啡,不需要詳細(xì)記錄。這樣的好處是瓷们,不管業(yè)務(wù)細(xì)節(jié)如何變化业栅,日志的格式是固定的秒咐,這樣能保證方案的通用性。

這個(gè)服務(wù)升級(jí)風(fēng)險(xiǎn)較械庠!:

(1)寫接口是少數(shù)接口携取,改動(dòng)點(diǎn)較少

(2)升級(jí)只是增加了一些日志,對(duì)業(yè)務(wù)功能沒有任何影響

步驟二:研發(fā)一個(gè)數(shù)據(jù)遷移工具帮孔,進(jìn)行數(shù)據(jù)遷移雷滋。這個(gè)數(shù)據(jù)遷移工具和離線遷移工具一樣,把舊庫(kù)中的數(shù)據(jù)轉(zhuǎn)移到新庫(kù)中來(lái)你弦。

這個(gè)小工具的風(fēng)險(xiǎn)較芯颉:

(1)整個(gè)過程依然是舊庫(kù)對(duì)線上提供服務(wù)

(2)小工具的復(fù)雜度較低

(3)任何時(shí)間發(fā)現(xiàn)問題,都可以把新庫(kù)中的數(shù)據(jù)干掉重來(lái)

(4)可以限速慢慢遷移禽作,技術(shù)同學(xué)沒有時(shí)間壓力

數(shù)據(jù)遷移完成之后尸昧,就能夠切到新庫(kù)提供服務(wù)了么?

答案是否定的旷偿,在數(shù)據(jù)遷移的過程中烹俗,舊庫(kù)依然對(duì)線上提供著服務(wù),庫(kù)中的數(shù)據(jù)隨時(shí)可能變化萍程,這個(gè)變化并沒有反映到新庫(kù)中來(lái)幢妄,于是舊庫(kù)和新庫(kù)的數(shù)據(jù)并不一致,所以不能直接切庫(kù)茫负,需要將數(shù)據(jù)追平蕉鸳。

哪些數(shù)據(jù)發(fā)生了變化呢?

步驟一中日志里記錄的不就是么忍法?

步驟三:研發(fā)一個(gè)讀取日志并遷移數(shù)據(jù)的小工具潮尝,要把步驟二遷移數(shù)據(jù)過程中產(chǎn)生的差異數(shù)據(jù)追平。這個(gè)小工具需要做的是:

(1)讀取日志饿序,得到哪個(gè)庫(kù)勉失、哪個(gè)表、哪個(gè)主鍵發(fā)生了變化

(2)把舊庫(kù)中對(duì)應(yīng)主鍵的記錄讀取出來(lái)

(3)把新庫(kù)中對(duì)應(yīng)主鍵的記錄替換掉

無(wú)論如何原探,原則是數(shù)據(jù)以舊庫(kù)為準(zhǔn)乱凿。

這個(gè)小工具的風(fēng)險(xiǎn)也很小:

(1)整個(gè)過程依然是舊庫(kù)對(duì)線上提供服務(wù)

(2)小工具的復(fù)雜度較低

(3)任何時(shí)間發(fā)現(xiàn)問題咽弦,大不了從步驟二開始重來(lái)

(4)可以限速慢慢重放日志徒蟆,技術(shù)同學(xué)沒有時(shí)間壓力

日志重放之后,就能夠切到新庫(kù)提供服務(wù)了么型型?

答案依然是否定的段审,在日志重放的過程中,舊庫(kù)中又可能有數(shù)據(jù)發(fā)生了變化输莺,導(dǎo)致數(shù)據(jù)不一致戚哎,所以還是不能切庫(kù),需要進(jìn)一步讀取日志嫂用,追平記錄型凳。可以看到嘱函,重放日志追平數(shù)據(jù)的程序是一個(gè)while(1)的程序甘畅,新庫(kù)與舊庫(kù)中的數(shù)據(jù)追平也會(huì)是一個(gè)“無(wú)限逼近”的過程。

什么時(shí)候數(shù)據(jù)會(huì)完全一致呢往弓?

步驟四:在持續(xù)重放日志疏唾,追平數(shù)據(jù)的過程中,研發(fā)一個(gè)數(shù)據(jù)校驗(yàn)的小工具函似,將舊庫(kù)和新庫(kù)中的數(shù)據(jù)進(jìn)行比對(duì)槐脏,直到數(shù)據(jù)完全一致。

這個(gè)小工具的風(fēng)險(xiǎn)依舊很衅材:

(1)整個(gè)過程依然是舊庫(kù)對(duì)線上提供服務(wù)

(2)小工具的復(fù)雜度較低

(3)任何時(shí)間發(fā)現(xiàn)問題顿天,大不了從步驟二開始重來(lái)

(4)可以限速慢慢比對(duì)數(shù)據(jù),技術(shù)同學(xué)沒有時(shí)間壓力

步驟五:在數(shù)據(jù)比對(duì)完全一致之后蔑担,將流量遷移到新庫(kù)牌废,新庫(kù)提供服務(wù),完成遷移。

如果步驟四數(shù)據(jù)一直是99.9%的一致,不能完全一致净当,也是正常的述雾,可以做一個(gè)秒級(jí)的舊庫(kù)readonly,等日志重放程序完全追上數(shù)據(jù)后哥倔,再進(jìn)行切庫(kù)切流量。

至此,升級(jí)完畢莫绣,整個(gè)過程能夠持續(xù)對(duì)線上提供服務(wù),不影響服務(wù)的可用性悠鞍。

四对室、平滑遷移-雙寫法

平滑遷移方案二,雙寫法咖祭,這個(gè)方案主要分為四個(gè)步驟掩宜。

數(shù)據(jù)遷移前,上游業(yè)務(wù)應(yīng)用通過舊的服務(wù)訪問舊的數(shù)據(jù)么翰。

步驟一:服務(wù)進(jìn)行升級(jí)牺汤,對(duì)“對(duì)舊庫(kù)上的數(shù)據(jù)修改”(這里的修改,為數(shù)據(jù)的insert,delete,update)浩嫌,在新庫(kù)上進(jìn)行相同的修改操作檐迟,這就是所謂的“雙寫”补胚,主要修改操作包括:

(1)舊庫(kù)與新庫(kù)的同時(shí)insert

(2)舊庫(kù)與新庫(kù)的同時(shí)delete

(3)舊庫(kù)與新庫(kù)的同時(shí)update

由于新庫(kù)中此時(shí)是沒有數(shù)據(jù)的,所以雙寫舊庫(kù)與新庫(kù)中的affect rows可能不一樣追迟,不過這完全不影響業(yè)務(wù)功能溶其,只要不切庫(kù),依然是舊庫(kù)提供業(yè)務(wù)服務(wù)敦间。

這個(gè)服務(wù)升級(jí)風(fēng)險(xiǎn)較衅刻印:

(1)寫接口是少數(shù)接口,改動(dòng)點(diǎn)較少

(2)新庫(kù)的寫操作執(zhí)行成功與否廓块,對(duì)業(yè)務(wù)功能沒有任何影響

步驟二:研發(fā)一個(gè)數(shù)據(jù)遷移工具厢绝,進(jìn)行數(shù)據(jù)遷移。這個(gè)數(shù)據(jù)遷移工具在本文中已經(jīng)出現(xiàn)第三次了带猴,把舊庫(kù)中的數(shù)據(jù)轉(zhuǎn)移到新庫(kù)中來(lái)昔汉。

這個(gè)小工具的風(fēng)險(xiǎn)較小:

(1)整個(gè)過程依然是舊庫(kù)對(duì)線上提供服務(wù)

(2)小工具的復(fù)雜度較低

(3)任何時(shí)間發(fā)現(xiàn)問題拴清,都可以把新庫(kù)中的數(shù)據(jù)干掉重來(lái)

(4)可以限速慢慢遷移挤庇,技術(shù)同學(xué)沒有時(shí)間壓力

數(shù)據(jù)遷移完成之后,就能夠切到新庫(kù)提供服務(wù)了么贷掖?

答案是肯定的嫡秕,因?yàn)榍爸貌襟E進(jìn)行了雙寫,所以理論上數(shù)據(jù)遷移完之后苹威,新庫(kù)與舊庫(kù)的數(shù)據(jù)應(yīng)該完全一致昆咽。

由于遷移數(shù)據(jù)的過程中,舊庫(kù)新庫(kù)雙寫操作在同時(shí)進(jìn)行牙甫,怎么證明數(shù)據(jù)遷移完成之后數(shù)據(jù)就完全一致了呢掷酗?

如上圖所示:

(1)左側(cè)是舊庫(kù)中的數(shù)據(jù),右側(cè)是新庫(kù)中的數(shù)據(jù)

(2)按照primary key從min到max的順序窟哺,分段泻轰,限速進(jìn)行數(shù)據(jù)的遷移,假設(shè)已經(jīng)遷移到now這個(gè)數(shù)據(jù)段

數(shù)據(jù)遷移過程中的修改操作分別討論:

(1)假設(shè)遷移過程中進(jìn)行了一個(gè)雙insert操作且轨,舊庫(kù)新庫(kù)都插入了數(shù)據(jù)浮声,數(shù)據(jù)一致性沒有被破壞

(2)假設(shè)遷移過程中進(jìn)行了一個(gè)雙delete操作,這又分為兩種情況

(2.1)假設(shè)這delete的數(shù)據(jù)屬于[min,now]范圍旋奢,即已經(jīng)完成遷移泳挥,則舊庫(kù)新庫(kù)都刪除了數(shù)據(jù),數(shù)據(jù)一致性沒有被破壞

(2.2)假設(shè)這delete的數(shù)據(jù)屬于[now,max]范圍至朗,即未完成遷移屉符,則舊庫(kù)中刪除操作的affect rows為1,新庫(kù)中刪除操作的affect rows為0,但是數(shù)據(jù)遷移工具在后續(xù)數(shù)據(jù)遷移中矗钟,并不會(huì)將這條舊庫(kù)中被刪除的數(shù)據(jù)遷移到新庫(kù)中唆香,所以數(shù)據(jù)一致性仍沒有被破壞

(3)假設(shè)遷移過程中進(jìn)行了一個(gè)雙update操作,可以認(rèn)為update操作是一個(gè)delete加一個(gè)insert操作的復(fù)合操作吨艇,所以數(shù)據(jù)仍然是一致的

除非除非除非袋马,在一種非常非常非常極限的情況下:

(1)date-migrate-tool剛好從舊庫(kù)中將某一條數(shù)據(jù)X取出

(2)在X插入到新庫(kù)中之前,舊庫(kù)與新庫(kù)中剛好對(duì)X進(jìn)行了雙delete操作

(3)date-migrate-tool再將X插入到新庫(kù)中

這樣秸应,會(huì)出現(xiàn)新庫(kù)比舊庫(kù)多出一條數(shù)據(jù)X。

但無(wú)論如何碑宴,為了保證數(shù)據(jù)的一致性软啼,切庫(kù)之前,還是需要進(jìn)行數(shù)據(jù)校驗(yàn)的延柠。

步驟三:在數(shù)據(jù)遷移完成之后祸挪,需要使用數(shù)據(jù)校驗(yàn)的小工具,將舊庫(kù)和新庫(kù)中的數(shù)據(jù)進(jìn)行比對(duì)贞间,完全一致則符合預(yù)期贿条,如果出現(xiàn)步驟二中的極限不一致情況,則以舊庫(kù)中的數(shù)據(jù)為準(zhǔn)增热。

這個(gè)小工具的風(fēng)險(xiǎn)依舊很姓浴:

(1)整個(gè)過程依然是舊庫(kù)對(duì)線上提供服務(wù)

(2)小工具的復(fù)雜度較低

(3)任何時(shí)間發(fā)現(xiàn)問題,大不了從步驟二開始重來(lái)

(4)可以限速慢慢比對(duì)數(shù)據(jù)峻仇,技術(shù)同學(xué)沒有時(shí)間壓力

步驟四:數(shù)據(jù)完全一致之后公黑,將流量切到新庫(kù),完成平滑數(shù)據(jù)遷移摄咆。

至此凡蚜,升級(jí)完畢,整個(gè)過程能夠持續(xù)對(duì)線上提供服務(wù)吭从,不影響服務(wù)的可用性朝蜘。

五、總結(jié)

針對(duì)互聯(lián)網(wǎng)很多“數(shù)據(jù)量較大涩金,并發(fā)量較大谱醇,業(yè)務(wù)復(fù)雜度較高”的業(yè)務(wù)場(chǎng)景,在

(1)底層表結(jié)構(gòu)變更

(2)分庫(kù)個(gè)數(shù)變換

(3)底層存儲(chǔ)介質(zhì)變換

的眾多需求下步做,需要進(jìn)行數(shù)據(jù)遷移枣抱,完成“平滑遷移數(shù)據(jù),遷移過程不停機(jī)辆床,保證系統(tǒng)持續(xù)服務(wù)”有兩種常見的解決方案佳晶。

追日志法,五個(gè)步驟:

(1)服務(wù)進(jìn)行升級(jí)讼载,記錄“對(duì)舊庫(kù)上的數(shù)據(jù)修改”的日志

(2)研發(fā)一個(gè)數(shù)據(jù)遷移小工具轿秧,進(jìn)行數(shù)據(jù)遷移

(3)研發(fā)一個(gè)讀取日志小工具中跌,追平數(shù)據(jù)差異

(4)研發(fā)一個(gè)數(shù)據(jù)比對(duì)小工具,校驗(yàn)數(shù)據(jù)一致性

(5)流量切到新庫(kù)菇篡,完成平滑遷移

雙寫法漩符,四個(gè)步驟:

(1)服務(wù)進(jìn)行升級(jí),記錄“對(duì)舊庫(kù)上的數(shù)據(jù)修改”進(jìn)行新庫(kù)的雙寫

(2)研發(fā)一個(gè)數(shù)據(jù)遷移小工具驱还,進(jìn)行數(shù)據(jù)遷移

(3)研發(fā)一個(gè)數(shù)據(jù)比對(duì)小工具嗜暴,校驗(yàn)數(shù)據(jù)一致性

(4)流量切到新庫(kù),完成平滑遷移

文章比較長(zhǎng)议蟆,希望大家有收獲闷沥。

幫轉(zhuǎn)喲。

==【完】==

推薦閱讀:

業(yè)界難題-“跨庫(kù)分頁(yè)”的四種方案

數(shù)據(jù)庫(kù)秒級(jí)平滑擴(kuò)容架構(gòu)方案

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咐容,一起剝皮案震驚了整個(gè)濱河市舆逃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌戳粒,老刑警劉巖路狮,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蔚约,居然都是意外死亡奄妨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門苹祟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)展蒂,“玉大人,你說我怎么就攤上這事苔咪∶痰浚” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵团赏,是天一觀的道長(zhǎng)箕般。 經(jīng)常有香客問我,道長(zhǎng)舔清,這世上最難降的妖魔是什么丝里? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮体谒,結(jié)果婚禮上杯聚,老公的妹妹穿的比我還像新娘。我一直安慰自己抒痒,他們只是感情好幌绍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般傀广。 火紅的嫁衣襯著肌膚如雪颁独。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天伪冰,我揣著相機(jī)與錄音誓酒,去河邊找鬼。 笑死贮聂,一個(gè)胖子當(dāng)著我的面吹牛靠柑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吓懈,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼歼冰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了骄瓣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耍攘,失蹤者是張志新(化名)和其女友劉穎榕栏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕾各,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扒磁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了式曲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妨托。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吝羞,靈堂內(nèi)的尸體忽然破棺而出兰伤,到底是詐尸還是另有隱情,我是刑警寧澤钧排,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布敦腔,位于F島的核電站,受9級(jí)特大地震影響恨溜,放射性物質(zhì)發(fā)生泄漏符衔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一糟袁、第九天 我趴在偏房一處隱蔽的房頂上張望判族。 院中可真熱鬧,春花似錦项戴、人聲如沸形帮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沃缘。三九已至躯枢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間槐臀,已是汗流浹背锄蹂。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留水慨,地道東北人得糜。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晰洒,于是被迫代替她去往敵國(guó)和親朝抖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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